Photo by Michael Jasmund on Unsplash
Photo by Michael Jasmund on Unsplash

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.

  • kind yang akan kita gunakan adalah Pod.
  • Pod memiliki dua metadata yaitu name dengan value go-rest-api dan namespace dengan value tutorial. Artinya nama dari pod yang akan kita buat adalah go-rest-api dan pod akan ditempatkan pada namespace tutorial yang sudah kita buat pada part sebelumnya .
  • spec adalah atribut yang mendefenisikan spesifikasi dari pod yang akan di buat. Pada contoh diatas, spec memiliki satu atribut yaitu containers. containers adalah atribut yang mendefenisikan kontainer-kontainer yang akan dijalankan pada pod tersebut. Tipe data containers adalah 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 name dan image. name adalah atribut yang digunakan untuk menentukan nama dari kontainernya. image adalah 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
    1. Format lengkap image adalah IMAGE_REGISTRY/REPOSITORY/IMAGE_NAME:TAG_IMAGE. Artinya teman-teman bisa memberikan defisini lengkap sebagai value dari image. Contohnya adalah docker.io/ecojuntak/go-rest-api:v0.0.1.
    2. Jika IMAGE_REGISTRY tidak ditentukan, maka image registry default yang akan digunakan adalah docker.io.
    3. Jika IMAGE_TAG tidak ditentukan, maka image tag yang akan digunakan adalah latest.
    4. REPOSITORY bisa bersifat nested. Misalnya ecojuntak/kubernetes-series/bagian-satu/go-rest-api:latest.

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.

  • pod adalah tipe resource yang ingin kita lihat daftarnya.
  • -n adalah argumen untuk memfilter resource berdasarkan namespace.
  • tutorial adalah nama namespace yang ingin kita gunakan sebagai filter.
  • Jika namespace tidak ditentukan, maka secara otomatis akan menggunakan namespace defautl.
  • -A juga dapat digunakan untuk menampilkan pod dari semua namespace, jadi perintahnya adalah kubectl 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/1 menandakan bahwa satu dari satu kontainer yang ada pada pod berjalan dengan baik. Jika teman-teman memiliki dua kontainer dalam satu pod, maka statusnya akan READY 2/2 jika kedua kontainer berjalan dengan baik. Jika salah satu pod tidak berjalan dengan baik maka akan menjadi READY 1/2.
  • STATUS Running menandakan pod dalam keadaan berjalan. Status pada pod sangat membantu untuk ngetahui keadaan pod. Untuk status lainnya, teman-teman dapat melihat pada link ini .
  • RESTARTS 0 menandakan 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 168m menandakan 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.

  • logs adalah perintah yang akan diterima oleh kubectl yang menyiaratkan bahwa kubectl menampilkan log dari sebuah kontainer.
  • go-rest-api adalah 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 adalah kubectl 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.

  • describe adalah perintah yang diterima oleh kubectl yang menyiaratkan bahwa kubectl perlu menampilkan deskiprsi dari suatu resource.
  • pod adalah tipe resource yang deskripsinya ingin kita tampilkan.
  • go-rest-api adalah 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! 🖖🏾