Setelah berhasil membuat dan menjalankan pod, resource yang akan kita pelajari berikutnya adalah replicaSet. ReplicaSet adalah kontroler untuk mengatur jumlah replika pod. Mengapa kita perlu mereplikasi pod?
Pengertian dan Kegunaan Kubernetes ReplicaSet
Dalam kasus tertentu, kita perlu menjalankan beberapa pod yang sama. Contoh kasusnya adalah ketika kita memerlukan high availability pada aplikasi yang kita jalankan. High availability bisa dicapai dengan menjalankan aplikasi yang sama pada dua pod atau lebih. Jika salah satu pod mengalami kegagalan, maka pod yang lain tetap dapat mengolah request yang datang.
Lalu apa yang akan kita lakukan pada pod yang mengalami kegagalan? Ide paling simple adalah dengan menjalankan ulang atau membuat pod baru. Tetapi jika kita sudah menjalankan banyak pod pada klaster dan banyak pod yang mengalami kegagalan, maka menjalankan ulang atau membuat pod baru secara manual adalah pekerjaan yang merepotkan dan tidak produktif.
Permasalahan diatas dapat diatasi dengan mudah dengan menggunakan replikaSet. ReplicaSet adalah kontroler yang akan selalu mengecek apakah jumlah pod yang berjalan sesuai dengan jumlah pod yang diharapkan. Jika terdapat pod yang mengalami kegagalan, replikaSet dapat membuat pod baru untuk menggantikan pod yang gagal secara otomatis.
Cara Membuat Kubernetes ReplicaSet
Berikut adalah contoh pendefisian replicaSet menggunakan yaml file.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: go-rest-api
namespace: tutorial
spec:
replicas: 3
selector:
matchLabels:
app: go-rest-api
template:
metadata:
labels:
app: go-rest-api
spec:
containers:
- name: app
image: ecojuntak/go-rest-api:v0.0.1
Mari kita bedah yaml file diatas.
kindyang kita gunakan adalahReplicaSet.- Nama replicaSet yang kita buat adalah
go-rest-apidan ditempatkan pada namespacetutorial. spec.replicasadalah atribut yang menentukan berapa jumlah replika pod yang akan dibuat.spec.selector.matchLabelsadalah atribut yang digunakan sebagai penanda pod pod mana saja yang bisa dikontrol oleh suatu replicaSet. Value darimatchLabelsadalahapp: go-rest-apiartinya replicaSet dapat mengontrol pod yang memiliki labelapp: go-rest-api.matchLabelsdapat terdiri dari beberapa key-value.spec.templateadalah atribut yang mendefenisikan template dari pod yang akan diolah oleh replicaSet. Berdasarkan yaml file diatas, maka pod yang akan dibuat memiliki satu kontainer dengan namaappdan menggunakan docker imageecojuntak/go-rest-api:v0.0.1. Pod juga akan memiliki label yaituapp: go-rest-api. Label inilah yang akan digunakan untuk mengecek apakah replicaSet dapat mengkontrol pod.
Setelah mendefinisikan replicaSet yang akan kita buat, kita akan menjalankan replicaSet dengan menjalankan perintah berikut.
$ kubectl apply -f replicaset.yaml
Jika berhasil, maka akan keluar pesan seperti berikut.
replicaset.apps/go-rest-api created
Untuk melihat semua replicaSet yang sudah ada pada klaster dan pada namespace tutorial, jalankan perintah berikut.
$ kubectl get replicaset -n tutorial
Jika berhasil, maka akan keluar daftar replicaSet yang ada pada namespace tutorial.
NAME DESIRED CURRENT READY AGE
go-rest-api 3 3 3 46s
Mari kita beda informasi diatas.
DESIRED 3menandakan bahwa ekspektasi jumlah pod yang dikontrol oleh replicaSet adalah tiga pod.CURRENT 3menandakan jumlah pod yang sudah ada adalah tiga pod.READY 3menandakan jumlah pod yang dalam statusREADYdari tiga pod yang sudah berjalan.AGE 46smenandakan replicaSet dibuat 46 detik yang lalu.
Untuk membuktikan bahwa tiga pod sudah berjalan dengan baik, maka kita dapat melihat daftar pod dengan perintah berikut.
$ kubectl get pod -n tutorial
Jika berhasil, maka akan keluar daftar pod yang ada pada namespace tutorial.
NAME READY STATUS RESTARTS AGE
go-rest-api-9d2bh 1/1 Running 0 107m
go-rest-api-gl5jg 1/1 Running 0 107m
go-rest-api-k9vsc 1/1 Running 0 107m
Pada informasi diatas, ketiga pod sudah berjalan. Nama replicaSet digunakan sebagai nama depan pod. Nama pod diberi imbuhan string acak untuk membedakan nama pod. Untuk membuktikan bahwa replicaSet akan selalu memastikan jumlah pod yang berjalan sesuai dengan ekspektasi, maka kita akan mencoba menghapus salah satu pod dengan perintah
$ kubectl delete pod go-rest-api-9d2bh -n tutorial
Lalu kita coba cek kembali daftar pod yang ada pada namespace tutorial dan hasilnya adalah sebagai berikut.
NAME READY STATUS RESTARTS AGE
go-rest-api-5dvsg 1/1 Running 0 40s
go-rest-api-gl5jg 1/1 Running 0 114m
go-rest-api-k9vsc 1/1 Running 0 114m
Pod go-rest-api-9d2bh sudah terhapus dari klaster dan digantikan secara otomatis dengan pod go-rest-api-5dvsg. Hal ini bisa dipastikan dengan melihat waktu kapan pod tersebut dibuat, yaitu 40 detik yang lalu. Dengan demikian, replicaSet terbukti dapat menjaga jumlah pod selalu sama dengan ekspektasi kita, selama tidak ada gangguan selamat pembuatan pod.
Jika kita mengubah jumlah replica pada yaml file, maka replicaSet akan menyesuaikan kembali jumlah pod sesuai dengan replikasi yang kita tentukan.
Cara Menghapus Kubernetes ReplicaSet
Sama dengan cara menghapus Kubernetes pod, kita akan menggunakan yaml file yang sudah kita buat sebelumnya. Perintah yang digunakan juga sama, yaitu:
$ kubectl delete -f replicaset.yaml
Jika berhasil, maka akan keluar pesan seperti berikut.
replicaset.apps "go-rest-api" deleted
Dengan begitu pod yang sebelumnya dikontrol oleh replicaSet akan otomatis terhapus juga dari klaster.
Sejauh ini kita sudah belajar bagaimana memastikan jumlah pod yang ada pada klaster sesuai dengan jumlah yang kita harapkan. Dengan menjaga jumlah pod selalu ada, maka ketersediaan aplikasi kita akan lebih tinggi. Dengan ketersediaan yang tinggi, aplikasi kita dapat mengolah request yang lebih banyak dan tetap dapat berjalan jika terdapat pod yang mengalami kegagalan.
Tetapi pada praktik yang umum dilakukan, kita tidak akan membuat replicaSet seperti cara diatas, hal ini sama dengan pod, dimana kita tidak mengolah pod dengan membuat yaml file untuk masing-masing pod.
Lalu bagaimana pengolahan replicaSet yang umum dilakukan? Kita akan bahas di part berikutnya.
Cappy Hoding! 🖖🏾