Setelah berhasil mengolah Kubernetes namespace, sekarang kita akan membahas Kubernetes resources yang lain yaitu Pod.
Pengertian dan Kegunaan Kubernetes Pod
Untuk memulai membahas Pod, kita perlu mengingat kembali bahwa Kubernetes dibuat untuk mengorkestrasi banyak kontainer di banyak mesin. Kontainer yang diorkestrasi oleh Kubernetes akan ditempatkan di dalam Pod. Pod akan menunjukkan informasi mengenai docker image apa yang dijalankan, port yang dibuka pada kontainer, sudah berapa lama kontainer berjalan, dan banyak informasi lainnya.
Cara Membuat Kubernetes Pod
Sama seperti membuat namespace pada part sebelumnya , teman-teman perlu mendefenisikan pod pada yaml file untuk membuat pod. Berikut adalah contoh pendefisian pod menggunakan yaml file.
apiVersion: v1
kind: Pod
metadata:
name: go-rest-api
namespace: tutorial
spec:
containers:
- name: app
image: ecojuntak/go-rest-api:v0.0.1
Mari kita bedah yaml file diatas.
kindyang akan kita gunakan adalahPod.- Pod memiliki dua
metadatayaitunamedengan valuego-rest-apidannamespacedengan valuetutorial. Artinya nama dari pod yang akan kita buat adalahgo-rest-apidan pod akan ditempatkan pada namespacetutorialyang sudah kita buat pada part sebelumnya . specadalah atribut yang mendefenisikan spesifikasi dari pod yang akan di buat. Pada contoh diatas,specmemiliki satu atribut yaitucontainers.containersadalah atribut yang mendefenisikan kontainer-kontainer yang akan dijalankan pada pod tersebut. Tipe datacontainersadalah array, artinya kita dimungkinkan untuk menjalankan lebih dari satu kontainer dalam satu pod.- Terdapat satu kontainer yang akan dijalankan. Kontainer tersebut memiliki dua atribut yaitu
namedanimage.nameadalah atribut yang digunakan untuk menentukan nama dari kontainernya.imageadalah atribut yang digunakan untuk menentukan docker image mana yang akan dijalankan. Pada contoh diatas, docker image yang akan digunakan adalah docker image yang ada pada docker hub saya . - Ada beberapa catatan yang perlu diperhatikan saat pendefinisian
image, yaitu- Format lengkap
imageadalahIMAGE_REGISTRY/REPOSITORY/IMAGE_NAME:TAG_IMAGE. Artinya teman-teman bisa memberikan defisini lengkap sebagai value dariimage. Contohnya adalahdocker.io/ecojuntak/go-rest-api:v0.0.1. - Jika
IMAGE_REGISTRYtidak ditentukan, maka image registry default yang akan digunakan adalahdocker.io. - Jika
IMAGE_TAGtidak ditentukan, maka image tag yang akan digunakan adalahlatest. REPOSITORYbisa bersifat nested. Misalnyaecojuntak/kubernetes-series/bagian-satu/go-rest-api:latest.
- Format lengkap
Setelah mendefinisikan pod yang akan kita buat, kita akan membuat pod dengan menjalankan perintah berikut.
$ kubectl apply -f pod.yaml
Jika berhasil, maka akan keluar pesan seperti berikut.
pod/go-rest-api created
Untuk melihat semua pod yang sudah ada pada klaster dan pada namespace tutorial, jalankan perintah berikut.
$ kubectl get pod -n tutorial
Mari kita bedah perintah diatas.
podadalah tipe resource yang ingin kita lihat daftarnya.-nadalah argumen untuk memfilter resource berdasarkan namespace.tutorialadalah nama namespace yang ingin kita gunakan sebagai filter.- Jika namespace tidak ditentukan, maka secara otomatis akan menggunakan namespace
defautl. -Ajuga dapat digunakan untuk menampilkan pod dari semua namespace, jadi perintahnya adalahkubectl get pod -A.
Jika berhasil, maka akan keluar daftar dari pod yang ada pada namespace tutorial.
NAME READY STATUS RESTARTS AGE
go-rest-api 1/1 Running 0 168m
Pada daftar pod yang ada, kita bisa lihat pod go-rest-api berhasil dibuat dan sudah berjalan. Mari kita bedah informasi diatas.
READY 1/1menandakan bahwa satu dari satu kontainer yang ada pada pod berjalan dengan baik. Jika teman-teman memiliki dua kontainer dalam satu pod, maka statusnya akanREADY 2/2jika kedua kontainer berjalan dengan baik. Jika salah satu pod tidak berjalan dengan baik maka akan menjadiREADY 1/2.STATUS Runningmenandakan pod dalam keadaan berjalan. Status pada pod sangat membantu untuk ngetahui keadaan pod. Untuk status lainnya, teman-teman dapat melihat pada link ini .RESTARTS 0menandakan bahwa pod belum pernah direstart. Jika jumlah restart lebih dari nol, bisa jadi pertanda ada yang salah pada sistem, baik kesalahan pada kontainer atau pada klasternya.AGE 168mmenandakan pod dibuat 168 menit yang lalu.
Sejauh ini kita belum dapat mengakses API yang sudah berjalan pada kontainer. Untuk mengakses API pada kontainer memerlukan resource lain yang akan kita bahas pada part selanjutnya. Untuk memastikan kembali bahwa pod sudah berjalan dengan baik, teman-teman dapat melakukan beberapa cara berikut.
Mengecek Kontainer Log
Untuk mengecek log pada kontainer, jalankan perintah berikut.
$ kubectl logs go-rest-api -n tutorial
Mari kita bedah perintah diatas.
logsadalah perintah yang akan diterima oleh kubectl yang menyiaratkan bahwa kubectl menampilkan log dari sebuah kontainer.go-rest-apiadalah nama pod yang didalamnya terdapat kontainer yang ingin kita cek lognya.- Jika pada satu pod hanya terdapat satu kontainer, kita tidak perlu menentukan nama kontainer untuk melihat lognya. Tetapi jika pada satu pod terdapat dua kontainer atau lebih, maka kita perlu menambahkan nama kontainer sebagai parameter dengan menambahkan argument
-c NAMA_KONTAINER. Maka pada contoh diatas, perintah yang akan dijalankan adalahkubectl logs go-rest-api -n tutorial -c app.
Jika berhasil, maka akan keluar log seperti ini.
2021/08/23 15:56:31 go-rest-api v0.0.1
2021/08/23 15:56:31 Starting on http://0.0.0.0:8080
Mengecek Pod Event
Untuk mengecek event pada pod, jalankan perintah berikut.
$ kubectl describe pod go-rest-api -n tutorial
Mari kita bedah perintah diatas.
describeadalah perintah yang diterima oleh kubectl yang menyiaratkan bahwa kubectl perlu menampilkan deskiprsi dari suatu resource.podadalah tipe resource yang deskripsinya ingin kita tampilkan.go-rest-apiadalah nama dari pod yang diskripsinya ingin kita tampilkan.
Jika berhasil, maka akan keluar deskripsi sebagai berikut.
Name: go-rest-api
Namespace: tutorial
Priority: 0
Node: pool-3r52zk19s-36x4b/10.104.0.3
Start Time: Mon, 23 Aug 2021 19:16:18 +0800
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.0.124
IPs:
IP: 10.244.0.124
Containers:
app:
Container ID: docker://c529128134a49b2df94a221605b5a4faed47bae40db518be75fd137dc4bca752
Image: ecojuntak/go-rest-api:v0.0.1
Image ID: docker-pullable://ecojuntak/go-rest-api@sha256:164ef090fa085865b9551e1e040c97e33c754308581ff04acede681ff2292f31
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 23 Aug 2021 19:16:20 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-jtbrg (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-jtbrg:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-jtbrg
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 26m default-scheduler Successfully assigned tutorial/go-rest-api to pool-3r52zk19s-36x4b
Normal Pulled 26m kubelet Container image "ecojuntak/go-rest-api:v0.0.1" already present on machine
Normal Created 26m kubelet Created container app
Normal Started 26m kubelet Started container app
Pada bagian Events, bisa kita perhatikan bahwa semua proses untuk membuat pod berhasil, mulai dari mengunduh docker image, membuat kontainer, dan menjalankan kontainer. Jika ada kesalahan pada proses membuat pod, maka akan ada event yang menampilkan kesalahan yang terjadi.
Cara Menghapus Kubernetes Pod
Sama dengan cara menghapus Kubernetes namespace, kita akan menggunakan yaml file yang sudah kita buat sebelumnya. Perintah yang digunakan juga sama, yaitu:
$ kubectl delete -f pod.yaml
Jika berhasil, maka akan keluar pesan seperti berikut.
pod "go-rest-api" deleted
Pod menjadi salah satu resource yang paling esensial pada kubernetes karena disitulah aplikasi atau service kita berjalan. Tetapi pada praktik yang umum dilakukan, kita tidak akan membuat pod dengan cara diatas karena beberapa alasan, seperti:
- Jika kita memerlukan lebih dari satu pod untuk service yang sama, untuk memungkinkan high avaibility, maka kita perlu membuat yaml file lain dengan nama pod yang berbeda.
- Jika ada kesalahan pada pod, tidak ada mekanisme untuk merestart atau membuat ulang pod baru. Maka harus dilakukan dengan manual.
- Jika perlu melakukan upgrade versi docker image, maka setiap yaml file perlu diubah.
Lalu bagaimana pengolahan pod yang umum dilakukan? Kita akan bahas di part berikutnya.
Cappy Hoding! 🖖🏾