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.
kindyang kita gunakan adalahDeployment.- Nama deployemnt yang kita buat adalah
go-rest-apidan ditempatkan pada namespacetutorial. - Sama seperti mendefenisikan replicaSet, kita juga perlu mendefenisikan
spec.selector.matchLabelssehingga 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 yaituecojuntak/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/3menandakan jumlah pod yang dalam statusREADYdari tiga pod yang sudah berjalan.UP-TO-DATE 3menandakan tiga pod yang berjalan sudah dalam keadaan terupdate dan sesuai dengan yaml file yang kita defenisikan. Perubahan informasiUP-TO-DATEdapat dilihat ketika terdapat rilis baru pada deployment tersebut.AVAILABLE 3menandakan tiga pod siap untuk mengolah request yang datang.AGE 111smenendakan 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.
rolloutadalah perintah yang digunakan untuk mengeluarkan informasi rollout suatu resource.historyadalah perintah yang digunakan untuk mengeluarkan informasi riwayat rollout suatu resource.deploymentadalah tipe resource yang ingin kita lihat riwayat rolloutnya. Hanya tiga tipe resource yang valid untuk perintah rollout, yaitu deployment, deamonset, dan statefulset.go-rest-apiadalah 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.
undoadalah perintah yang digunakan untuk mengubah revisi deployment ke revisi yang kita harapkan.--to-revision=1adalah 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! 🖖🏾