0

Belajar Kubernetes di EC2 – Membuat service NodePort (part 4)

Belajar Kubernetes di EC2


Belajar Kubernetes di EC2. Tutorial ini lanjutan dari part 3: Membuat replica pods dan service clusterip untuk deployment.

Ditutorial sebelumnya kita sudah belajar membuat service dengan ClusterIP, sekarang kita akan belajar membuat service dengan NodePort.


Daftar Isi:

Apa itu NodePort?

  • NodePort = service yang mengekspos port setiap node dan dapat diakses dari internet melalui IP public dan port nodenya (contoh: IP 112.22.22.33:8080)

Supaya ada bayangan gimana NodePort bekerja, saya kasih gambarannya dulu, mungkin agak ribet dan mendetail:

Belajar Kubernetes di EC2
  • Contoh diatas kita mempunyai 2 worker node, dengan ip public masing-masing 13.213.14.72 dan 13.228.72.3.
  • No 1, ketika user ingin mengakses aplikasi kita, user bisa mengetikkan url http://13.213.14.72:30001 atau http://13.228.72.3:30001, jadi user langsung mengakses ip public si worker nodenya berserta portnya.
  • port 30001 merupakan port si nodenya, jadi nanti kita akan buka-kan port 30001 dilevel node/servernya, agar bisa diakses dari internet. FYI, kubernetes mengalokasikan port untuk nodePort antara 3000 – 32767, jadi kita bisa gunakan antara range tersebut.
  • No 2, setelah traffic masuk ke node, akan diteruskan ke service dengan port 3322. Port ini bisa kalian tentukan sendiri, bebas.
  • No 3, setelah traffic masuk ke service, akan diteruskan ke pods dan diteruskan lagi ke container yang memiliki port 80 (targetPort). Pada contoh diatas kita mempunyai 3 pods, 2 pods berada di node pertama, dan 1 pods berada di node kedua. Si service akan mendistribusikan trafficnya ke pods secara bergantian menggunakan teknik loadbalance.

Oke sampai sini sudah mulai puyeng ya? hehe kita lanjut…

Cara Membuat NodePort

Sekarang kita mulai praktek, kita akan buat 2 file. 1 untuk konfigurasi pod dan 1 lagi untuk servicenya.

#Konfigurasi pod

pods4-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
        name: pods4
spec:
        replicas: 3
        selector:
                matchLabels:
                        app: pods4
        template:
                metadata:
                        labels:
                                app: pods4
                spec:
                        containers:
                        - name: pods4-nginx
                          image: nginx:latest
                          ports:
                          - containerPort: 80
                          resources:
                                requests:
                                        memory: 110Mi
                                        cpu: 110m
                                limits:
                                        memory: 120Mi
                                        cpu: 120m
  • kita akan membuat pods dengan replica sebanyak 3
  • kita beri nama label pada podsnya yaitu app: pods4, label ini nanti akan kita panggil di file service yang nanti akan kita buat.
  • kita menggunakan image nginx:latest
  • kita tentukan container portnya yaitu 80 (karena kita menggunakan web server nginx)
  • kita tentukan resource containernya CPU dan RAM seperti diatas.


Oke nextnya kita apply konfigurasinya

kubectl apply -f pods4-deploy.yaml

Kita tinggal cek apakah podsnya berhasil dibuat

kubectl get pods -o wide --show-labels
Belajar Kubernetes di EC2

Bagus podsnya berhasil dicreate dan labelsnya berhasil dibuat (app=pods4). Selanjutnya kita tinggal buat servicenya.

#Konfigurasi service

svc-pods4.yaml

apiVersion: v1
kind: Service
metadata:
        name: svc-pods4
spec:
        selector:
                app: pods4
        ports:
                - name: http
                  port: 8811
                  targetPort: 80
                  nodePort: 30001
        type: NodePort

Kita bisa lihat selector diatas berisi app: pods4. Artinya si service memanggil pods yang mempunyai labels app: pods4.

Kita bisa lihat juga ports, ini merupakan konfigurasi yang paling penting karena disini mendefinisikan port untuk traffic internal sampai traffic eksternal. Pada gambar diatas tadi, sudah saya sebutkan ada port, targetPort, dan nodeport. Saya paste lagi gambarnya disini.

Saya jelaskan:

  • nodePort = port pada node yang menghandle external traffic dari internet
  • port = port pada service (hanya bisa diakses dari dalam cluster)
  • targetPort = port pada container yang ada didalam pod (hanya bisa diakses dari dalam cluster)

Nah sekarang gimana? sudah mulai paham kan flownya? mudah-mudahan paham ya..

Oke kita lanjut.. kita apply servicenya

kubectl apply -f svc-pods4.yaml

Sekarang kita check servicenya apakah berhasil terbuat

kubectl get svc -o wide

Bagus, servicenya sudah terbuat svc-pods4 dengan type NodePort, port servicenya 8811 dan port nodenya 30001, selectornya app=pods4

Testing NodePort

Kita tinggal testing saja apakah servicenya bisa diakses dari dalam cluster sampai luar cluster (internet).

#Testing dari dalam pods

Pertama-tama kita coba test dari dalam cluster dulu, masuk ke salah satu pods yang sudah pernah kita buat di part 2.

kubectl exec -it pods1 bash


Kemudian coba hit servicenya menggunakan port si service 8811

curl svc-pods4.default.svc.cluster.local:8811

Bagus, reponsenya sudah sesuai “Welcome to nginx!”


#Testing dari internal network AWS

Sekarang kita test dari internal network AWSnya dulu, pertama kita exit dulu dari pods yang tadi

exit

Kemudian curl menggunakan private ip si worker nodenya dan port 30001 (untuk ipnya kalian bisa cari sendiri di dashboard EC2)

*Pastikan port 30000 – 32767 sudah diallow disecurity group pada setiap worker node, jika belum silahkan lihat part 1 dulu disini

curl -X GET 172.31.11.235:30001
curl -X GET 172.31.38.20:30001

bagus, responsenya sudah ‘Welcome to nginx!’


#Testing dari internet

Terakhir kita test dari browser, ip public worker node saya adalah:

13.213.14.72:30001
13.228.72.3:30001


Ternyata hanya loading saja, tidak bisa dibuka. Kenapa? karena kita hanya allow port 3000 – 32767 untuk ip 172.31.0.0/16 pada part 1 sebelumnya. Jadi hanya bisa diakses dari internal network AWSnya saja.

Solusinya kita harus ubah 172.31.0.0/16 menjadi 0.0.0.0/0 supaya bisa diakses dari internet.

Buka security group ditiap worker nodenya, pada inbound rule edit menjadi 0.0.0.0/0


Lalu coba buka lewat browser lagi


Ok bagus aplikasi sudah bisa diakses dari internet.


#Testing Replica

Sekarang kita coba refresh halaman beberapa kali, responsenya tetap sama ‘Welcome to nginx!’ tidak ada perubahan sama sekali. Kenapa? karena kita menggunakan image default nginx:latest, jadi responsenya tetap sama. Kita perlu merubah isi konten index.html pada nginxnya supaya kita bisa simulasikan replicanya. Jadi harapannya ketika direfresh responsenya akan berbeda-beda.

Kita akan mengganti tulisan ‘Welcome to nginx!’ menjadi ‘Welcome to pods A/pods B/pods C’ disetiap podsnya.

Pertama kita cek dulu nama podsnya (pods saya dengan kalian bisa beda akhirannya, pods-4xxxxxx jadi harap sesuaikan saja)


Kemudian kita ganti kontennya di file /usr/share/nginx/html/index.html

kubectl exec -it pods4-8c6f4f884-7nnxf -- bash -c "echo Welcome to pods A > /usr/share/nginx/html/index.html"
kubectl exec -it pods4-8c6f4f884-l2pc4 -- bash -c "echo Welcome to pods B > /usr/share/nginx/html/index.html"
kubectl exec -it pods4-8c6f4f884-rhb4w -- bash -c "echo Welcome to pods C > /usr/share/nginx/html/index.html"


Kemudian coba refresh lagi browsernya beberapa kali, maka tulisannya akan berubah

Belajar Kubernetes di EC2


Bagus replicanya berfungsi dengan baik, setiap traffic yang masuk diarahkan ke pod replica pertama, kedua, ketiga secara bergantian.



Kesimpulan

Sejauh ini kita sudah belajar cara mengekspos aplikasi ke internet menggunakan nodePort, tadi kita mendefinisikan port untuk nodenya (30001), port untuk servicenya (8822), dan targetPort (80) untuk memforward traffic ke container podnya.

Menurut saya, ada beberapa kelebihan dan kekurangan jika menggunakan nodePort

Kelebihan:

  • Jika aplikasinya hanya 1 saja, maka gampang disetup, cukup buat service yang berisi port, targetPort dan nodePort. Lalu daftarkan port si nodePortnya di security group EC2 agar bisa diakses dari internet


Kekurangan:

  • Kita harus mendefinisikan port nodenya disemua aplikasi. Tadi kita hanya punya 1 aplikasi dan portnya 30001. Jika kedepan ada 2 aplikasi, maka kita harus set lagi portnya misal 30002. Jika ada 3 aplikasi maka portnya 30003 dst, ini akan merepotkan jika aplikasinya ada banyaaak.
  • Port yang diekspos ke internet antara 30000 – 32767 bukan 80. Untuk mengakali supaya bisa diakses dari port 80 kita bisa gunakan reverse proxy seperti HAproxy, apache proxy, nginx proxy.
  • Kita harus setup external loadbalancer sendiri secara manual untuk mendaftarkan ip public worker nodenya.



Demikianlah tutorial Belajar Kubernetes di EC2 – Membuat NodePort, semoga bermanfaat.

Di part 5 selanjutnya kita akan belajar membuat service dengan tipe LoadBalancer.

Ambar Hasbiyatmoko

Hello, I'm web developer. Passionate about programming, web server, and networking.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.