Kubernetes Native Sidecar Containers: Panduan Praktis

Foto oleh Pix Tresa on Unsplash
Ini adalah init container yang dideklarasikan dengan restartPolicy bernilai Always. Berbeda dari init container biasa yang berjalan sampai selesai, sidecar mulai sebelum aplikasi utama, tetap berjalan sepanjang umur Pod, dan dimatikan setelah aplikasi keluar. Ini pengganti bawaan untuk pola ad-hoc lama yang menambahkan container aplikasi kedua.
Tambahkan restartPolicy bernilai Always ke sebuah entri di daftar initContainers Pod. Satu field itulah saklarnya — kubelet lalu menandainya started, lanjut ke container berikutnya, dan menjaga sidecar tetap berjalan. Saat ini Always adalah satu-satunya nilai yang valid untuk restartPolicy init container.
Native sidecar container menjadi stabil (GA) di Kubernetes v1.33 yang rilis pada 23 April 2025. Fitur ini pertama muncul sebagai alpha di v1.28 di balik feature gate SidecarContainers pada Agustus 2023, lalu menjadi beta dan aktif default di v1.29. Sejak v1.29 sebagian besar cluster tidak perlu mengubah feature gate.
Sebuah Job selesai ketika container-nya berhenti, tetapi sidecar logging atau proxy dirancang berjalan tanpa henti. Pada pola lama sidecar itu adalah container aplikasi biasa, sehingga tugas utama selesai sementara sidecar tetap berjalan dan Job tidak pernah rampung. Native sidecar memperbaikinya karena terminasi Pod kini hanya bergantung pada container utama.
Ya. Berbeda dari init container biasa, native sidecar mendukung probe startup, readiness, dan liveness. readinessProbe sebuah sidecar memengaruhi status ready Pod, sehingga proxy mesh yang tidak sehat menahan Pod di luar endpoint Service sampai pulih.

Foto oleh Pix Tresa on Unsplash
Ringkasan Utama
Kubernetes native sidecar container adalah init container yang dideklarasikan dengan restartPolicy bernilai Always. Kubelet menjalankannya sebelum aplikasi utama, menjaganya tetap berjalan sepanjang umur Pod, lalu mematikannya setelah aplikasi keluar. Ini memperbaiki urutan startup yang rusak dan Job yang tidak pernah selesai. Fitur ini stabil sejak Kubernetes v1.33.
Selama bertahun-tahun sidecar hanyalah sebuah pola, bukan fitur. Anda menambahkan container kedua ke sebuah Pod — pengirim log, proxy service mesh, eksportir metrik — lalu berharap ia berperilaku baik. Kubernetes tidak punya konsep sidecar, jadi container kedua itu diperlakukan persis seperti aplikasi utama Anda. Perlakuan setara itulah sumber masalahnya, dan itulah yang akhirnya dihilangkan oleh fitur native sidecar.
Saya pernah mengalami kedua mode kegagalan klasik di produksi: proxy yang belum siap saat aplikasi melakukan panggilan keluar pertamanya, dan Job batch yang berjalan selamanya karena sidecar logging-nya tidak pernah berhenti. Native sidecar container mengatasi keduanya dengan memberi container tambahan siklus hidup yang teratur, alih-alih berpura-pura mereka hanyalah container aplikasi biasa.
Pola ad-hoc tidak punya urutan maupun kesadaran siklus hidup. Semua container dalam sebuah Pod mulai kira-kira secara paralel dan diperlakukan setara, yang menghasilkan tiga masalah berulang.
Wawasan di balik KEP-753 adalah bahwa sidecar sebenarnya init container yang istimewa. Init container sudah punya urutan startup sekuensial yang jelas, jadi membangun sidecar di atasnya memberi urutan secara gratis. Anda menambahkan satu field — restartPolicy bernilai Always — ke sebuah entri di daftar initContainers Pod, dan container itu menjadi sidecar.
Satu field itu mengubah tiga perilaku. Kubelet menandai init container sebagai started lalu lanjut ke berikutnya alih-alih menunggunya keluar, sehingga container aplikasi Anda mulai hanya setelah sidecar aktif. Sidecar kemudian tetap berjalan sepanjang umur Pod dan di-restart sendiri jika crash. Saat terminasi, kubelet menghentikan container utama lebih dulu, lalu mematikan sidecar dalam urutan terbalik dari deklarasinya.
Saat ini hanya Always yang valid sebagai restartPolicy init container. Nilai tunggal itulah saklar yang mengubah init container biasa menjadi sidecar yang berumur panjang — tidak ada jenis sidecar terpisah atau objek API baru yang perlu dipelajari.
Berikut sebuah Deployment dengan sidecar log-shipper. Ia berada di bawah initContainers, tetapi restartPolicy Always membuatnya tetap berjalan berdampingan dengan aplikasi. Sebuah startupProbe membuat kubelet menahan container utama sampai shipper benar-benar siap, bukan sekadar dibuat.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: registry.example.com/web:1.6.0
ports:
- containerPort: 8080
volumeMounts:
- name: logs
mountPath: /var/log/app
initContainers:
# restartPolicy: Always turns this init container into a
# native sidecar: it starts before "web", stays running for
# the whole Pod lifetime, and shuts down after "web" exits.
- name: log-shipper
image: registry.example.com/log-shipper:2.1.0
restartPolicy: Always
startupProbe:
httpGet:
path: /healthz
port: 3000
volumeMounts:
- name: logs
mountPath: /var/log/app
volumes:
- name: logs
emptyDir: {}Blok yang sama bekerja pada sebuah Job. Karena sidecar adalah init container dengan restartPolicy Always, terminasi Pod kini hanya bergantung pada container utama — ketika tugas batch selesai, Job selesai dan sidecar dimatikan otomatis. Tidak ada lagi Job yang macet dalam keadaan running menunggu sidecar yang tidak pernah keluar.
Native sidecar mendukung probe startup, readiness, dan liveness, yang tidak dimiliki init container biasa. readinessProbe sebuah sidecar memengaruhi status ready Pod, sehingga proxy mesh yang tidak sehat membuat Pod tetap di luar endpoint sebuah Service. Permintaan sumber daya dijumlahkan dengan container aplikasi alih-alih dibandingkan, dan penanganan skor OOM disejajarkan dengan container utama sehingga sidecar tidak dibunuh lebih dulu saat tekanan memori.
Selama shutdown, sidecar bisa menerima SIGTERM lalu SIGKILL jika container utama menghabiskan seluruh periode grace. Kode keluar bukan-nol dari sidecar saat terminasi Pod adalah hal wajar dan umumnya harus diabaikan oleh tooling eksternal — jangan buat alert untuknya.
Perbedaannya bukan sekadar kosmetik. Pendekatan native memindahkan urutan, siklus hidup, dan shutdown dari solusi tingkat aplikasi ke dalam kubelet, tempat yang semestinya. Tabel ini merangkum apa yang sebenarnya berubah.
| Aspek | Sidecar ad-hoc lama | Native sidecar container |
|---|---|---|
| Tempat dideklarasikan | Entri kedua di containers | Sebuah initContainer dengan restartPolicy Always |
| Urutan startup | Tidak ada — mulai paralel dengan aplikasi | Dijamin mulai sebelum container aplikasi |
| Penyelesaian Job | Job menggantung — sidecar tak pernah keluar | Job selesai begitu tugas utama rampung |
| Urutan shutdown | Tidak jelas — proxy bisa mati lebih dulu | Aplikasi berhenti dulu, sidecar urutan terbalik |
| Probe kesehatan | Hanya lewat plumbing container aplikasi penuh | Startup, readiness, dan liveness didukung |
Fitur ini punya jalur graduasi yang jelas. Ia hadir sebagai alpha di Kubernetes v1.28 pada Agustus 2023 di balik feature gate SidecarContainers, naik ke beta dan aktif secara default di v1.29, lalu graduasi menjadi stabil di v1.33 yang rilis pada 23 April 2025. Sejak v1.29 Anda dapat memakainya tanpa menyentuh feature gate di sebagian besar cluster.
Saran saya: jika cluster Anda pada v1.29 atau lebih baru, pindahkan proxy mesh, pengirim log, dan agen metrik ke native sidecar sekarang — Anda mendapat urutan yang benar dan shutdown bersih dengan perubahan satu baris. Untuk Job batch dan AI/ML keuntungannya lebih besar lagi, karena menghapus kelas bug Job-tidak-pernah-selesai sepenuhnya. Mulailah dengan satu beban kerja non-kritis, pastikan Pod menjadi ready hanya setelah sidecar aktif, lalu perluas dari sana.