Saat sebuah Pekerjaan Kubernetes menggunakan kontainer sidecar (seperti Filebeat untuk pengumpulan log), kontainer sidecar terus berjalan setelah kontainer aplikasi keluar, sehingga mencegah Pekerjaan mencapai status terminal. Elastic Container Instance (ECI) memungkinkan Anda mendeklarasikan suatu kontainer sebagai tipe sidecar dan mengabaikan kode keluarnya, sehingga Pekerjaan dapat selesai sesuai harapan.
Cara kerja
Di kluster ACK Serverless (Container Service for Kubernetes), ECI berjalan pada node virtual yang tidak mendukung fitur DaemonSet Kubernetes. Solusi umum adalah menambahkan kontainer sidecar ke dalam Pod untuk meniru perilaku DaemonSet—misalnya, menambahkan Filebeat guna mengumpulkan log bersamaan dengan pekerjaan batch.
Masalah muncul ketika restartPolicy diatur ke OnFailure atau Never: setelah kontainer aplikasi keluar dan tidak melakukan restart, kontainer sidecar tetap berjalan. Akibatnya, Pekerjaan tidak dapat mencapai status terminal Succeeded atau Failed.
ECI mengatasi hal ini melalui dua variabel lingkungan yang diatur pada kontainer sidecar:
`ECI_CONTAINER_TYPE`: Mendeklarasikan kontainer sebagai sidecar. Ketika kontainer aplikasi keluar dan tidak melakukan restart, ECI akan menghentikan secara paksa semua kontainer yang diberi label
sidecar.`ECI_CONTAINER_IGNORE_EXIT_CODE`: Mengabaikan kode keluar non-nol yang dihasilkan dari penghentian paksa kontainer sidecar. ECI mengatur status kontainer sidecar menjadi
Succeededdan mencatat kode keluar aktual, penyebab kegagalan, serta detail kegagalan di bidangMessagePod.
Tanpa ECI_CONTAINER_IGNORE_EXIT_CODE, kontainer sidecar yang dihentikan secara paksa akan keluar dengan kode non-nol, sehingga mengatur status akhir Pekerjaan menjadi Failed meskipun kontainer aplikasi telah berhasil menyelesaikan tugasnya.
Variabel lingkungan
| Variabel lingkungan | Nilai | Deskripsi |
|---|---|---|
ECI_CONTAINER_TYPE | sidecar | Mendeklarasikan kontainer sebagai sidecar. Saat kontainer aplikasi keluar dan tidak melakukan restart, ECI akan menghentikan secara paksa semua kontainer dengan label ini. Jika dibiarkan kosong atau diatur ke normal, kontainer tersebut diperlakukan sebagai kontainer biasa. |
ECI_CONTAINER_IGNORE_EXIT_CODE | true | Mengabaikan kode keluar non-nol saat kontainer dihentikan secara paksa. ECI mengatur status kontainer menjadi Succeeded dan menuliskan kode keluar aktual beserta informasi kegagalannya ke bidang Message. |
Konfigurasikan penghentian sidecar untuk pekerjaan
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster ACK Serverless dengan ECI yang diaktifkan
kubectl yang telah dikonfigurasi untuk terhubung ke kluster
Izin untuk membuat Pekerjaan di namespace target
Terapkan konfigurasi
Buat file YAML bernama
test-sidecar.yamldengan konten berikut:apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test alibabacloud.com/eci: "true" # Arahkan Pod ini ke node virtual ECI spec: containers: - name: c1 # Kontainer aplikasi image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5 command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"] - name: c2 # Kontainer sidecar image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5 command: ["/bin/sh","-c","sleep 999"] env: - name: ECI_CONTAINER_TYPE value: "sidecar" # Deklarasikan c2 sebagai kontainer sidecar - name: ECI_CONTAINER_IGNORE_EXIT_CODE value: "true" # Abaikan kode keluar non-nol saat ECI menghentikan c2 restartPolicy: Never backoffLimit: 2Terapkan konfigurasi:
kubectl apply -f test-sidecar.yaml
Verifikasi hasil
Periksa status akhir Pekerjaan:
kubectl describe job <job-name>Output-nya mirip seperti berikut. Cari
Succeeded: 1, yang menunjukkan bahwa Pekerjaan berhasil diselesaikan.
Periksa informasi kode keluar yang dicatat untuk kontainer sidecar:
kubectl describe pod <pod-name>Dalam output tersebut, temukan entri kontainer
c2. BidangMessageberisi kode keluar aktual, penyebab kegagalan, dan detail kegagalan yang dicatat ECI saat menghentikan kontainer sidecar.