Belajar kubernetes di EC2 membuat replica dan service clusterIP. Tutorial ini lanjutan dari part 2: Belajar Kubernetes – Membuat pods, test koneksi antar pod dan membuat deployment.
Sebelumnya kita sudah belajar menggunakan kind: Deployment
untuk menentukan resource CPU dan RAM pada pod. Kali ini kita akan belajar membuat replica pods dan service clusterIP untuk deployment.
Daftar Isi:
Apa itu Replica?
Jadi apa itu replica? replica adalah cara untuk menduplikasi pods menjadi beberapa pods. Tujuannya adalah supaya aplikasi kita memiliki backup dan ketersediaan/uptime yang tinggi. Berikut adalah perbandingan tanpa replica dan menggunakan replica:
#Tanpa Replica:
Misal diatas kita punya 1 pods saja, dan suatu ketika traffic aplikasi kita tinggi dan membuat aplikasinya nge-crash/hang, maka aplikasi kita tidak bisa diakses oleh user lagi.
#Menggunakan Replica:
Dengan replica, kita bisa menduplikasi podnya menjadi 3 dan didepannya ditambahkan load balancing (service), maka ketika ada request masuk dari user, jika 1 pods down, masih ada 2 pods lagi yang masih up. Service akan memforward requestnya ke pod yang masih up tersebut. Jadi disini service dipadukan sama replica agar bisa menghasilkan aplikasi yang high availability
Oke, kita akan praktek satu-satu, pertama kita akan membuat replica dan kedua service.
Membuat Replica
Buka kembali file pods1.yaml yang sebelumnya sudah kita buat pada part 2, kita akan tambahkan field replicas
ke dalam field spec
apiVersion: apps/v1
kind: Deployment
metadata:
name: pods1
spec:
replicas: 3
selector:
matchLabels:
app: pods1
template:
metadata:
labels:
app: pods1
spec:
containers:
- name: pods1-nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: 120Mi
cpu: 100m
limits:
memory: 120Mi
cpu: 110m
Jadi cukup simple, tinggal tambahkan 1 baris saja replicas: 3
, artinya kita akan membuat 3 replica pods.
Setelah itu kita apply lagi pods1.yaml
kubectl apply -f pods1.yaml
Kemudian kita cek podsnya apakah sudah ter-replica:
kubectl get pods -o wide
Ok bagus, podsnya sudah ter-replica sebanyak 3 pods.
Sekarang kita masuk ke masing-masing podsnya, kita akan buat index.html yang berbeda untuk setiap podsnya (supaya nanti pas kita test menggunakan service (as load balancer), hasil responsenya akan berbeda). Commandnya adalah sebagai berikut
kubectl exec -it pods1-65f7d77bb7-6h66d bash
Yang saya bold tebal adalah nama podsnya, kalian tinggal sesuaikan saja dengan nama pods kalian.
Kemudian update konten pada file index.html
echo 'pods1-A' > /usr/share/nginx/html/index.html
Lakukan hal yang sama untuk replica kedua dan ketiga.
Isi konten index.html pada replica kedua dan ketiga adalah pods1-B dan pods1-C.
Oke untuk replica sudah cukup, sekarang kita lanjut membuat service
Membuat Service ClusterIP
Seperti yang sudah kita tahu sebelumnya, service bertindak sebagai load balancer didepan pods.
Jika ada pods yang down, traffic akan dialihkan ke pods yang masih up.
Selain itu fungsi lain dari service adalah untuk mengekspos pods agar bisa diakses dari luar pods, jadi pods bisa diakses dari clusternya sendiri maupun dari public/internet dengan meng-hit si service. Ada beberapa cara mengekspos pods melalui service, yaitu:
- clusterIP = service hanya bisa diakses dari dalam cluster
- nodePort = service yang mengekspos port dari setiap node dan dapat diakses dari internet melalui IP public dan port nodenya (contoh: IP 112.22.22.33:8080)
- loadBalancer = service bisa diakses dari internet melalui loadbalancer penyedia layanan cloud, seperti AWS, GCP, Azure, dsb.
Ok, disini kita akan menggunakan clusterIP dulu ya, artinya service hanya bisa diakses dari dalam cluster.
Buat sebuah file svc-pods1.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-pods1
spec:
selector:
app: pods1
ports:
- name: http
port: 80
type: ClusterIP
Pada konfigurasi diatas kita membuat service dengan kind: Service
kemudian kita panggil podsnya menggunakan selector, app: pods1
adalah labels pods yang sudah kita set pada file pods1.yaml (part 2 sebelumnya). Kemudian kita expose port 80,
dan karena tipenya clusterIP
maka port 80
hanya bisa diakses dari dalam cluster.
Kemudian apply konfigurasinya:
kubectl apply -f svc-pods1.yaml
Oke sekarang tinggal testing saja, kita akan hit podsny melalui service tersebut. Caranya kita masuk ke pods lain, misal pods1 (tanpa akhiran -65f7dxxxxxx)
Masuk ke pods1 dengan command berikut:
kubectl exec -it pods1 bash
Kemudian kita coba hit servicenya
curl svc-pods1.default.svc.cluster.local:80
Keterangan:
svc-pods1 = nama servicenya
default = nama namespacenya (kita menggunakan namespace default sejauh ini, kita akan bahas ini dipart2 selanjutnya)
svc.cluster.local = format dari kubernetesnya
80 = port yang diekspos keluar
Hasilnya:
Kalau kita lihat, response akan berbeda-beda setiap hit, pods1-B
, pods1-C
…dst pods1-A
, pods1-C
Artinya replica dan service yang sudah kita buat berfungsi dengan baik.
—-
Oke, sejauh ini kita sudah berhasil membuat replica
dan service
, di part 4 selanjutnya kita akan belajar lebih jauh mengenai service (nodePort, loadBalancer)