Jika Anda ingin menggunakan kontainer sidecar untuk mencapai efek seperti DaemonSet serta menyediakan layanan atau fungsi tambahan—seperti logging, pemantauan, keamanan, dan routing traffic—Anda harus mengonfigurasi prioritas startup dan exit kontainer sidecar relatif terhadap kontainer aplikasi utama. Topik ini menjelaskan cara mengonfigurasi prioritas tersebut.
Deskripsi fitur
Kluster Alibaba Cloud Container Compute Service (ACS) tidak mendukung DaemonSet karena keterbatasan node virtual. Untuk mencapai efek seperti DaemonSet, Anda dapat menambahkan kontainer sidecar ke dalam Pod di kluster ACS. Siklus hidup kontainer sidecar yang ditambahkan ke dalam Pod tidak independen dari siklus hidup Pod tersebut. Oleh karena itu, Anda perlu mengonfigurasi prioritas startup dan exit kontainer sidecar. Misalnya, kontainer sidecar mungkin harus mulai berjalan sebelum kontainer aplikasi utama saat pembuatan Pod. Jika Anda menggunakan Pod bertipe Job, Anda mungkin perlu menghentikan tugas kontainer sidecar secara paksa setelah kontainer aplikasi utama dihentikan.
Untuk memenuhi persyaratan tersebut, ACS menyediakan metode berikut guna mengonfigurasi prioritas startup dan exit kontainer sidecar.
-
Konfigurasi kontainer sidecar native Kubernetes
Pada Kubernetes versi 1.29 dan yang lebih baru, dukungan untuk konfigurasi sidecar native diaktifkan secara default. Anda dapat mengonfigurasi sidecar dengan mendefinisikannya sebagai init container dan mengatur
restartPolicy-nya menjadi Always.CatatanPendekatan native ini mengimplementasikan kontainer sidecar sebagai init container khusus. Saat startup Pod, kontainer aplikasi akan menunggu hingga kontainer sidecar telah dimulai. Pengaturan
restartPolicy: Alwaysmemungkinkan kontainer sidecar untuk dimulai, dihentikan, dan dimulai ulang tanpa memengaruhi kontainer aplikasi utama atau init container lainnya. -
Konfigurasi kontainer sidecar yang dioptimalkan ACS
Untuk versi Kubernetes 1.28 dan yang lebih lama, ACS memungkinkan Anda menetapkan variabel lingkungan khusus,
__IS_SIDECAR__, untuk menandai kontainer biasa sebagai kontainer sidecar.PentingKonfigurasi yang dioptimalkan ACS memungkinkan Anda mendeklarasikan kontainer biasa sebagai sidecar. Kontainer tersebut dimulai sebelum kontainer biasa lainnya dan secara otomatis dicoba ulang jika gagal, seolah-olah
restartPolicy-nya bernilaiAlways. Selain itu, kluster ACS pada versi Kubernetes lama (1.28 dan di bawahnya) mencakup fitur kompatibilitas untuk memastikan status kontainer diperbarui dengan benar.Namun, pada versi Kubernetes yang lebih baru atau jenis kluster lainnya, metode ini dibatasi oleh pembatasan Kubernetes terkait pembaruan status kontainer. Setelah sidecar yang dikonfigurasi dengan metode ACS-optimized gagal dan dimulai ulang,
containerStatus-nya dan status Pod tidak akan diperbarui menjadi Running. Untuk status yang akurat, andalkan kondisi aktual Pod. Kami menyarankan Anda melakukan upgrade kluster ke versi 1.29 atau yang lebih baru dan menggunakan konfigurasi kontainer sidecar native Kubernetes.
Metode konfigurasi kontainer sidecar
Metode konfigurasi | Parameter/variabel lingkungan | Deskripsi |
Konfigurasi kontainer sidecar native Kubernetes |
Bidang |
|
Konfigurasi kontainer sidecar yang dioptimalkan ACS |
Variabel lingkungan untuk kontainer biasa: |
|
Contoh
Buat file bernama test-sidecar.yaml dan salin konten berikut ke dalam file tersebut. File ini digunakan untuk membuat Job yang menyediakan dua kontainer bernama app dan sidecar. Kontainer app adalah kontainer aplikasi, sedangkan kontainer sidecar adalah kontainer sidecar.
Konfigurasi kontainer sidecar yang dioptimalkan ACS
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] env: - name: __IS_SIDECAR__ # Tambahkan variabel lingkungan ke kontainer. value: "true" # Tentukan kontainer sebagai kontainer sidecar. restartPolicy: Never backoffLimit: 2Konfigurasi kontainer sidecar native Kubernetes
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: initContainers: - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] restartPolicy: Always # Tentukan kontainer sebagai kontainer sidecar. containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] restartPolicy: Never backoffLimit: 2Jalankan perintah berikut untuk membuat Job:
kubectl apply -f test-sidecar.yaml-
Lihat detail Job dan Pod serta amati efek variabel lingkungan tersebut.
-
Pastikan Job telah selesai dan statusnya
Succeeded.kubectl describe job <job-name>Contoh:
Parallelism: 1 Completions: 1 Completion Mode: NonIndexed Start Time: Tue, 29 Oct 2024 11:24:18 +0800 Completed At: Tue, 29 Oct 2024 11:25:17 +0800 Duration: 59s Pods Statuses: 0 Active (0 Ready) / 1 Succeeded / 0 Failed Pod Template:
-
-
Lihat detail kontainer sidecar dan periksa urutan startup serta kode exit aktual kontainer.
kubectl describe pod <pod-name>-
Gambar berikut menunjukkan bahwa kontainer sidecar dimulai sebelum kontainer app. Hal ini memastikan fungsi dependensi yang dibutuhkan kontainer utama—seperti routing traffic—sudah siap terlebih dahulu. Gambar berikut juga menunjukkan bahwa kontainer sidecar dihentikan 10 detik setelah kontainer app berhenti berjalan. Hal ini memastikan Pod yang disediakan oleh Job dapat dihentikan secara normal.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m11s default-scheduler Successfully assigned default/test-729nd to virtual-kubelet-cn-shenzhen-f Normal Pulling 5m13s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 384ms Normal Created 5m12s kubelet Created container sidecar Normal Started 5m12s kubelet Started container sidecar Normal Pulling 5m12s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 342ms Normal Created 5m12s kubelet Created container app Normal Started 5m12s kubelet Started container app Normal Killing 5m1s kubelet Stopping container sidecar -
Gambar berikut menunjukkan bahwa kontainer sidecar dihentikan secara paksa dan kode exit-nya adalah 0. Hal ini memastikan Pod dapat dihentikan dengan status sukses atau gagal secara normal, tanpa terpengaruh oleh kontainer sidecar.
sidecar: Container ID: containerd://bd85de5ad7ee1cb5a4807b094f2d41fa90881916857172 0e73ef0dfbd26f1dfb Image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 Image ID: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox@sha256:141c253bc4c3fd0a20 Port: <none> Host Port: <none> Command: sh -c touch /var/logs.txt && tail -F /var/logs.txt State: Terminated Reason: Completed Message: Force this container to be success(137, Error, ) Exit Code: 0 Started: Tue, 29 Oct 2024 11:24:32 +0800 Finished: Tue, 29 Oct 2024 11:25:13 +0800 Ready: False Restart Count: 0
-