Setelah berhasil menjaga replikasi pod secara otomatis menggunakan replicaSet, resource yang akan kita bahas berikutnya adalah Kubernetes deployment. Kenapa kita perlu mempelajari deployment?

Pengertian dan Kegunaan Kubernetes Deployment

Dalam pengembangan aplikasi, fitur yang dikembangkan akan dirilis sehingga dapat digunakan pengguna. Sembari aplikasi berjaalan, kita juga perlu memelihara aplikasi dengan cara menambah fitur dan memperbaiki kesalahan yang ada pada aplikasi yang sudah berjalan. Fitur baru atau perbaikan kesalahan akan rilis pada versi yang berbeda dari versi yang sebelumnya. Pemberian versi mempermudah kita untuk memahami dan melacak perubahan pada aplikasi kita.

Jika kita menggunakan replicaSet untuk mengatur rilis aplikasi versi baru ke Kubernetes, kemungkinan langkah yang kita ambil adalah dengan cara berikut.

  • ReplicaSet untuk aplikasi versi lama berjalan pada klaster.
  • Buat replicaSet baru dengan docker image yang baru.
  • Pasangkan replicaSet pada klaster. Dalam rentang waktu tertentu, akan tedapat dua replicaSet berjalan bersamaan, yaitu replicaSet untuk versi lama dan replicaSet untuk versi baru.
  • Jika tidak ada kegagalan pada aplikasi versi baru, maka replicaSet untuk versi lama bisa dihapus atau replikanya diset menjadi nol.
  • Jika ada kegagalan pada aplikasi versi baru, maka replicaSet versi baru dapat hapus atau replikanya diset menjadi nol.

Jika langkah ini dilakukan untuk setiap kali rilis versi baru, akan sangat merepotkan jika dilakukan secara manual. Maka, Kubernetes deployment digunakan untuk mempermudah rilis versi terbaru.

Deployment akan membuat replicaSet secara otomatis untuk setiap rilis yang dilakukan. Selain membuat replicaSet setiap rilis, deployment juga menjaga replicaSet yang lama untuk keperluan rollback jika diperlukan.

Jika terdapat replicaSet baru, maka replika pada replicaSet yang lama akan diset menjadi nol. Jika terdapat perintah rollback, maka replika pada replicaSet yang menjadi target rollback akan diset sesuai replika yang diinginkan dan replika pada replicaSet yang digunakan saat rollback akan diset menjadi nol.

Cara Membuat Kubernetes Deployment

Berikut adalah contoh mendefinisikan deployment dengan yaml file. Struktur yaml filenya hampir sama dengan struktur yaml file untuk mendefinisikan replicaSet.

apiVersion: apps/v1
kind: Deployment
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 Deployment.
  • Nama deployemnt yang kita buat adalah go-rest-api dan ditempatkan pada namespace tutorial.
  • Sama seperti mendefenisikan replicaSet, kita juga perlu mendefenisikan spec.selector.matchLabels sehingga deployment tahu replicaSet mana yang bisa dikontroler oleh deployment tersebut.
  • Lalu pada bagian spec.template, sama dengan replicaSet, kita perlu mendefenisikan template dari pod yang akan dibuat. Kita masih menggunakan docker image yang sama yaitu ecojuntak/go-rest-api:v0.0.1.

Setelah mendefenisikan deployment, kita akan membuat membuat menjalankan deployment didalam klaster dengan menjalankan perintah berikut.

$ kubectl apply -f deployment.yaml

Jika berhasil, makan akan keluar pesan seperti berikut.

deployment.apps/go-rest-api created

Untuk melihat semua dafatr deployment yang sudah ada pada klaster dan pada namespace tutorial, jalankan perintah berikut.

$ kubectl get deployment -n tutorial

Jika berhasil akan keluar daftar deployment yang ada pada namespace tutorial.

NAME          READY   UP-TO-DATE   AVAILABLE   AGE
go-rest-api   3/3     3            3           111s

Mari kita bedah informasi diatas.

  • READY 3/3 menandakan jumlah pod yang dalam status READY dari tiga pod yang sudah berjalan.
  • UP-TO-DATE 3 menandakan tiga pod yang berjalan sudah dalam keadaan terupdate dan sesuai dengan yaml file yang kita defenisikan. Perubahan informasi UP-TO-DATE dapat dilihat ketika terdapat rilis baru pada deployment tersebut.
  • AVAILABLE 3 menandakan tiga pod siap untuk mengolah request yang datang.
  • AGE 111s menendakan deployment dibuat 111 detik yang lalu.

Selain deployment, kita juga dapat melihat replicaSet dan pod yang sudah berjalan didalam klaster. Berikut adalah daftar replicaSet dan pod yang sudah dibuat.

NAME                     DESIRED   CURRENT   READY   AGE
go-rest-api-76fff8dc7d   3         3         3       19m
NAME                           READY   STATUS    RESTARTS   AGE
go-rest-api-76fff8dc7d-282hl   1/1     Running   0          21m
go-rest-api-76fff8dc7d-mlf8b   1/1     Running   0          21m
go-rest-api-76fff8dc7d-x4jd2   1/1     Running   0          21m

Bisa kita perhatikan bahwa nama replicaSet yang dibuat berbeda dengan nama replicaSet yang kita buat menggunakan resource replicaSet. Nama replicaSet yang dibuat mendapat penambahan string acak pada bagian belakang. Hal ini digunakan untuk membedakan nama replicaSet karena satu deployment bisa memiliki lebih dari satu replicaSet.

Sama halnya dengan pod, format nama pod yang dibuat berbeda dengan format nama pod yang dibuat hanya menggunakan replicaSet. Format nama pod yang digunakan adalah nama replicaSet ditambah dengan string acak. Hal ini digunakan untuk mempermudah identifikasi pod mana yang dikontrol oleh suatu replicaSet.

Hal lain yang dapat dilihat dari suatu deployment adalah riwayat perubahan pada suatu deployment. Untuk melihat riwayat perubahan suatu deployment, jalankan perintah berikut.

$ kubectl rollout history deployment go-rest-api -n tutorial

Mari kita bedah perintah diatas.

  • rollout adalah perintah yang digunakan untuk mengeluarkan informasi rollout suatu resource.
  • history adalah perintah yang digunakan untuk mengeluarkan informasi riwayat rollout suatu resource.
  • deployment adalah tipe resource yang ingin kita lihat riwayat rolloutnya. Hanya tiga tipe resource yang valid untuk perintah rollout, yaitu deployment, deamonset, dan statefulset.
  • go-rest-api adalah nama dari deployment yang ingin kita lihat riwayat rolloutnya.

Jika berhasil, makan akan keluar pesan seperti berikut.

deployment.apps/go-rest-api
REVISION  CHANGE-CAUSE
1         <none>

Bisa kita lihat bahwa deployment go-rest-api memiliki satu revisi yaitu pada saat pertama kali membuat deploymentnya. Revisi akan bertambah jika kita melakukan perubahan pada deploymentnya. Contoh perubahan yang dapat kita lakukan adalah mengganti versi docker image yang digunakan.

Kita akan mencoba mengganti docker image version yang digunakan menjadi v0.0.2. Maka yaml file yang terbaru adalah sebagai berikut.

apiVersion: apps/v1
kind: Deployment
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.2

Lalu yaml file diatas akan coba kita pasangkan pada klaster kita. Jika berhasil, akan keluar pesan seperti berikut.

deployment.apps/go-rest-api configured

Setelah yaml file dipasangkan pada klaster, kita bisa lihat bahwa replicaSet baru dibuat untuk mengontrol pod yang menggunakan docker image versi baru.

NAME                     DESIRED   CURRENT   READY   AGE
go-rest-api-6bfd5c997f   3         3         3       81s
go-rest-api-76fff8dc7d   0         0         0       31m

Bisa kita lihat, bahwa replicaSet go-rest-api-6bfd5c997f dibuat untuk menggantikan replicaSet go-rest-api-76fff8dc7d. ReplicaSet go-rest-api-6bfd5c997f adalah replicaSet yang menggunakan docker image versi v0.0.2 ReplicaSet yang lama tidak akan dihapus dari klaster karena replicaSet lama diperlukan untuk memungkinkan melakukan rollback pada deployment.

Jika kita kembali mengecek daftar pod pada namespace tutorial, maka pod yang muncul ada pod yang dikontrol oleh replicaSet go-rest-api-6bfd5c997f. Hal ini dapat dibuktikan dari mana podnya mengamdung nama dari replicaSet yang mengontrolnya.

NAME                           READY   STATUS    RESTARTS   AGE
go-rest-api-6bfd5c997f-pq6nx   1/1     Running   0          31m
go-rest-api-6bfd5c997f-qzxdv   1/1     Running   0          31m
go-rest-api-6bfd5c997f-tbshr   1/1     Running   0          31m

Lalu, riwayat perubahan juga sudah bertambah pada deployment go-rest-api karena kita sudah melakukan perubahan pada yaml filenya. Berikut adalah riwayat perubahan deployment go-rest-api setelah versi docker imagenya kita ubah menjadi versi v0.0.2.

deployment.apps/go-rest-api
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Jika terdapat kesalahan pada docker image versi v0.0.2, kita dapat melakukan rollback dengan menjalankan perintah berikut.

kubectl rollout undo deploy go-rest-api -n tutorial --to-revision=1

Mari kita bedah perintah diatas.

  • undo adalah perintah yang digunakan untuk mengubah revisi deployment ke revisi yang kita harapkan.
  • --to-revision=1 adalah parameter yang kita gunakan untuk menentukan target revisi yang kita harapkan. Pada kasus ini kita melakukan rollback ke revisi 1.

Jika berhasil, maka akan keluar pesan seperti berikut.

deployment.apps/go-rest-api rolled back

Untuk memastikan bahwa deployment telah dirollback ke revisi 1, maka kita dapat mengecek replicaSet dan pod pada klaster. Berikut adalah daftar replicaSet dan pod yang ada pada klaster.

NAME                     DESIRED   CURRENT   READY   AGE
go-rest-api-6bfd5c997f   0         0         0       4d23h
go-rest-api-76fff8dc7d   3         3         3       5d

NAME                           READY   STATUS    RESTARTS   AGE
go-rest-api-76fff8dc7d-5jj84   1/1     Running   0          6m18s
go-rest-api-76fff8dc7d-pm4cr   1/1     Running   0          6m16s
go-rest-api-76fff8dc7d-sshfc   1/1     Running   0          6m20s

Bisa kita lihat bahwa jumlah replica pada replicaSet go-rest-api-76fff8dc7d diset menjadi tiga dan replica pada replicaSet go-rest-api-6bfd5c997f menjadi nol. Dengan demikian, pod yang berjalan adalah pod dengan versi docker image v0.0.1.

Cara Menghapus Kubernetes Deployment

Sama dengan cara menghapus Kubernetes replicaSet, kita akan menggunakan yaml file yang sudah kita buat sebelumnya. Perintah yang digunakan juga sama, yaitu:

$ kubectl delete -f deployment.yaml

Jika berhasil, maka akan keluar pesan seperti berikut.

deployment.apps "go-rest-api" deleted

Dengan begitu semua replicaSet dan pod yang sebelumnya dikontrol oleh deployment akan otomatis terhapus juga dari klaster.


Sejauh ini kita sudah belajar bagaimana menjalankan pod menggunakan deployment, sehingga kita dapat lebih mudah untuk melakukan rilis ketika ada versi baru. Kita juga dapat melakukan rollback dengan mudah jika terdapat kesalahan pada versi terbaru.

Penggunaan deployment adalah praktik yang umum dilakukan. Namun, sejauh ini kita belum mencoba untuk mengakses API yang sudah berjalan pada klaster. Hal ini tidak dapat dilakukan karena pod tidak dapat menerima request dari luar secara default. Untuk itu, kita memerlukan bantuan resource lain.

Resource apakah yang dapat kita gunakan untuk memungkinkan pod menerima request dari luat? Kita akan bahas di part berikutnya.

Cappy Hoding! 🖖🏾