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:
- 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
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
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.