Cara Menggunakan Kait Kubernetes untuk Melacak Lifecycle Container

  • Post author:
  • Post category:Tutorial

Kubernetes container lifecycle hooks memungkinkan Anda merespons pembuatan dan penghentian container. Anda dapat menangani event dengan menjalankan perintah di dalam container atau membuat permintaan HTTP ke endpoint yang diekspos.

Hook biasanya digunakan untuk mencatat event container, mengimplementasikan skrip pembersihan, dan menjalankan tugas asinkron setelah Pod baru bergabung dengan cluster Anda. Dalam artikel ini, kami akan menunjukkan cara memasang hook handler ke Pod Anda dan mendapatkan kontrol lebih besar atas siklus hidup container.

Dua Hooks yang Tersedia

Rilis Kubernetes saat ini mendukung dua hook siklus hidup container:

  • PostStart – Handler untuk hook ini dipanggil segera setelah container baru create.
  • PreStop – Hook ini dipanggil segera sebelum Kubernetes mengakhiri container.

Mereka dapat ditangani menggunakan dua mekanisme berbeda:

  • Exec – Menjalankan perintah tertentu di dalam container.
  • HTTP – Membuat permintaan HTTP ke URL di dalam container.

Tidak satu pun dari hook memberikan argumen apa pun kepada penangan mereka. Setiap wadah mendukung satu penangan per kait; tidak mungkin untuk memanggil beberapa endpoint atau menggabungkan perintah exec dengan permintaan HTTP.

Mendefinisikan Hook Handlers

Anda mendefinisikan hook handler untuk Pod menggunakan bidang manifest container.lifecycle mereka. Di dalam bidang ini, atur properti postStart dan preStop untuk mengimplementasikan satu atau kedua dari hooks.

yang tersedia. Berikut adalah Pod sederhana yang mencatat pesan saat dijalankan:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-hooks
spec:
  containers:
    - name: pod-hook-container
      image: nginx:latest
      lifecycle:
        postStart:
          exec:
            command: ["/bin/sh", "-c", "echo STARTED > /startup_message"]

 

Terapkan Pod ke cluster Anda menggunakan Kubectl:

$ kubectl apply -f pod.yaml

Sekarang dapatkan shell ke container yang sedang berjalan di dalam Pod:

$ kubectl exec --stdin --tty pod/pod-with-hooks -- sh

Baca isi file /startup_message :

$ cat /startup_message STARTED

Ini menunjukkan bahwa hook berhasil dipanggil. Kait exec dianggap berhasil jika perintahnya keluar dengan kode status nol.

HTTP Handlers

Anda dapat mengonfigurasi penangan HTTP dengan mengganti bidang exec dengan httpGet. Hanya permintaan HTTP GET yang didukung (tidak ada bidang httpPost).

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-hooks
spec:
  containers:
    - name: pod-hook-container
      image: nginx:latest
      lifecycle:
        postStart:
          httpGet:
            path: /startup
            port: 80

 

Dalam contoh ini, Kubernetes membuat permintaan GET ke /startup pada port 80 container. Kolom httpGet juga menerima skema dan properti host untuk mengkonfigurasi permintaan lebih lanjut.

Ini adalah Pod di mana /shutdown dipanggil melalui HTTPS sebelum penghentian container terjadi:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-hooks
spec:
  containers:
    - name: pod-hook-container
      image: nginx:latest
      lifecycle:
        preStop:
          httpGet:
            path: /startup
            scheme: HTTPS

 

HTTP handler hook dianggap telah berhasil jika kode respons HTTP terletak pada range 200-299.

Debugging Your Handlers

Hook handler dikelola secara independen dari Pod tempat mereka terhubung. Log mereka tidak dikumpulkan atau disimpan bersama dengan log Pod biasa, jadi kamu tidak akan melihat perintah exec seperti echo Dimulai saat menjalankan kubectl logs pod/pod-with-hooks.

Anda dapat men-debug hook dengan melihat riwayat event Pod. Pemanggilan yang gagal akan dilaporkan sebagai acara FailedPostStartHook dan FailedPreStophook. Pesan error tersebut berisi deskripsi tentang apa yang memicu error.

Try menambahkan Pod ini ke cluster Anda:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-hooks
spec:
  containers:
    - name: pod-hook-container
      image: nginx:latest
      lifecycle:
        postStart:
          exec:
            command: ["missing-command"]

 

Kait PostStart yang rusak akan menyebabkan startup Pod gagal. Gunakan kubectl explain untuk mengakses histori eventnya:

$ kubectl describe pod/pod-with-hooks
...
Events:
  Type     Reason               Age                From               Message
  ----     ------               ----               ----               -------
  Normal   Scheduled            30s                default-scheduler  Successfully assigned pod-with-hooks...
  Normal   Created              10s (x2 over 11s)  kubelet            Created container pod-hook-container
  Normal   Started              10s (x2 over 11s)  kubelet            Started container pod-hook-container
  Warning  FailedPostStartHook  10s (x2 over 11s)  kubelet            Exec lifecycle hook ([missing-command]) for Container "pod-hook-container" in Pod "pod-with-hooks" failed - error: command 'missing-command' exited with 126: , message: "OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "missing-command": executable file not found in $PATH: unknownrn"
  Normal   Killing              10s (x2 over 11s)  kubelet            FailedPostStartHook
  Warning  BackOff              5s (x2 over 6s)    kubelet            Back-off restarting failed container

 

Event FailedPostStartHook mengungkapkan handler gagal karena missing-command bukan executable yang valid di dalam container. Ini menyebabkan kontainer dimatikan dan dimulai kembali dalam loop mundur. Ini akan macet seperti ini terus-menerus karena perintah yang hilang tidak akan pernah dapat dieksekusi.

Perhatian Khusus

  • Hooks dapat dipanggil lebih dari sekali. Kubernetes menjamin penangan PostStart dan PreStop Anda akan dipanggil “setidaknya” sekali untuk setiap kontainer. Dalam beberapa situasi, hook mungkin dipanggil beberapa kali.
  • Penangan Anda harus idempoten sehingga mereka dapat menahan kemungkinan ini. Kait yang gagal membunuh wadahnya. Seperti yang diilustrasikan oleh contoh debug di atas, kait yang gagal segera mematikan wadahnya. Anda perlu memastikan perintah dan endpoint HTTP Anda bebas dari kesalahan untuk menghindari masalah startup Pod yang tidak terduga.
  • Penangan kait harus ringan dan bebas dari ketergantungan. Jangan mencoba mengakses sumber daya yang mungkin tidak tersedia segera setelah penampung Anda dimulai.
  • Kait PostStart berlomba dengan ENTRYPOINT penampung.
  • PostStart menyala pada waktu yang hampir bersamaan dengan penampung dibuat.
  • Kubernetes tidak menunggu hook – itu akan dipanggil secara asinkron di samping ENTRYPOINT container, yang bisa selesai sebelum handler hook Anda dipanggil. Ini berarti skrip entrypoint container Anda akan mulai berjalan bahkan jika handler Anda melaporkan kesalahan dan berakhir dengan mematikan container. PreStop hook akan memblokir penghentian container. Kubernetes menjamin container Anda tidak akan berhenti sampai hook PreStop mereka selesai, hingga waktu maksimum yang ditentukan oleh masa tenggang penghentian Pod. Kontainer akan dihentikan terlepas dari apakah hook masih berjalan saat masa tenggang berakhir.
  • Hook PreStop tidak dipanggil untuk Pod yang sudah selesai. Yang ini bisa sangat berdampak tergantung pada kasus penggunaan Anda. Implementasi PreStop saat ini hanya berjalan ketika sebuah Pod dihentikan karena penghapusan, sumber daya habis, kegagalan probe, atau kejadian serupa. Hook tidak akan dipanggil untuk container yang berhenti secara alami karena prosesnya menyelesaikan tugasnya dan keluar dengan kode kesalahan nol.

Hooks berdampak langsung pada perkembangan siklus hidup Pod Anda. Pod tidak dapat ditandai sebagai Running sampai hook PostStartnya selesai; demikian pula, sebuah Pod akan terhenti Terminating hingga PreStop selesai. Peristiwa siklus hidup

Kubernetes adalah cara untuk memberi tahu container tentang pembuatannya sendiri dan penghapusan yang akan datang. Dengan memberikan perintah atau titik akhir API di dalam container, Anda dapat melacak tahapan siklus proses kritis dan melaporkannya ke komponen infrastruktur lainnya.

Kejadian siklus hidup mudah disiapkan tetapi juga memiliki beberapa masalah umum. Anda dapat menggunakan mekanisme yang berdekatan seperti pemeriksaan permulaan dan kesiapan jika Anda memerlukan pemanggilan yang lebih andal. Ini adalah opsi yang lebih baik untuk skrip yang penting saat menyiapkan lingkungan container baru.

Itulah berita seputar Cara Menggunakan Kait Kubernetes untuk Melacak Siklus Hidup Kontainer, semoga bermanfaat. Disadur dari HowToGeek.com.