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.

  • kind yang kita gunakan adalah ReplicaSet.
  • Nama replicaSet yang kita buat adalah go-rest-api dan ditempatkan pada namespace tutorial.
  • spec.replicas adalah atribut yang menentukan berapa jumlah replika pod yang akan dibuat.
  • spec.selector.matchLabels adalah atribut yang digunakan sebagai penanda pod pod mana saja yang bisa dikontrol oleh suatu replicaSet. Value dari matchLabels adalah app: go-rest-api artinya replicaSet dapat mengontrol pod yang memiliki label app: go-rest-api. matchLabels dapat terdiri dari beberapa key-value.
  • spec.template adalah atribut yang mendefenisikan template dari pod yang akan diolah oleh replicaSet. Berdasarkan yaml file diatas, maka pod yang akan dibuat memiliki satu kontainer dengan nama app dan menggunakan docker image ecojuntak/go-rest-api:v0.0.1. Pod juga akan memiliki label yaitu app: 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 3 menandakan bahwa ekspektasi jumlah pod yang dikontrol oleh replicaSet adalah tiga pod.
  • CURRENT 3 menandakan jumlah pod yang sudah ada adalah tiga pod.
  • READY 3 menandakan jumlah pod yang dalam status READY dari tiga pod yang sudah berjalan.
  • AGE 46s menandakan 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! 🖖🏾