Soalan dan skop
Sebuah pasukan menggunakan volum gitRepo supaya repositori diklon ke dalam lekapan (mount) apabila Pod dimulakan. Kubernetes v1.36 melumpuhkan pemalam volum ini secara kekal dan tidak menyediakan jalan keluar suis ciri (feature-gate). Reka migrasi ini: inventori beban kerja dan kebergantungan repositori, pilih init container, penyegerak luaran, atau pembungkusan semasa binaan (build-time), dan sahkan integriti komit, kelayakan (credentials), tingkah laku rangkaian, semantik kemas kini, serta pembalikan (rollback).
Dokumentasi Kubernetes menyatakan bahawa gitRepo telah ditamatkan penggunaannya (deprecated) selama bertahun-tahun dan pelaksanaan lama tersebut boleh membenarkan penyerang melaksanakan kod sebagai root pada nod. Selepas v1.36 melumpuhkan pemalam ini, menjadualkan semula Pod lama tidak akan memulihkan keserasian. Asingkan perubahan API, keluaran imej, dan laluan pengambilan semasa masa jalanan (runtime).
Konteks dan sempadan
Fokus pada kitaran hayat pemalam volum, urutan permulaan Pod, kepercayaan rantaian bekalan, dan pengesahan migrasi. Pengehosan Git, pendaftaran imej, egress rangkaian, dan pengurusan rahsia adalah kebergantungan platform; nyatakan penetapan komit (commit pin), kelayakan keistimewaan paling rendah (least-privilege), dasar kegagalan rangkaian, dan sasaran kesegaran (freshness target).
Perkara yang diuji oleh penemu duga
- Sama ada anda mengenali
gitReposebagai pemalam volum dan bukannya lapisan imej atau ConfigMap. - Sama ada anda membandingkan pembungkusan masa binaan, init container, dan penyegerak berterusan dari segi kebolehulangan, kesegaran, dan semantik kegagalan.
- Sama ada anda mengendalikan repositori peribadi, hos yang dikenali (known hosts), token, proksi, dan integriti komit.
- Sama ada anda mereka imbasan pra-naik taraf, sekatan kemasukan (admission block), nod kenari (canary nodes), dan pembalikan.
- Sama ada anda menerangkan perkongsian empty-directory, kebenaran lekapan, penggunaan baca sahaja, dan kebergantungan permulaan.
Jawapan 30 saat
“Saya akan mengimbas Pod, templat, dan penjana untuk gitRepo, merekodkan repositori, semakan (revision), laluan lekapan, kelayakan, dan keperluan kesegaran. Kandungan tetap hendaklah dibungkus ke dalam imej tidak boleh ubah (immutable) semasa masa binaan. Jika pengambilan masa jalanan diperlukan, init container dengan keistimewaan paling rendah akan menulis komit yang dipin ke emptyDir, dan kontena utama melekapkannya sebagai baca sahaja. Kemas kini berterusan memerlukan penyegerak terkawal dengan pertukaran versi atomik, pengekalan versi lama, dan semakan integriti. Sebelum naik taraf, dasar akan menyekat penggunaan baharu; pemulaan semula kenari akan menguji kegagalan rangkaian dan pembalikan sebelum templat lama dialih keluar.”
Penyelesaian langkah demi langkah
- Inventori kebergantungan sebenar. Cari Pod, Deployment, StatefulSet, Job, carta Helm, Kustomize, penjana, dan mutasi kemasukan untuk
gitRepo. Rekodkan repositori, semakan, laluan, bacaan permulaan, saiz repositori, selang kemas kini, sumber kelayakan, dan laluan egress.
- Klasifikasikan semantik kesegaran. Bungkus konfigurasi tetap atau templat semasa masa binaan. Gunakan init container untuk kandungan yang diperlukan semasa permulaan. Pertimbangkan penyegerak hanya untuk kandungan yang mesti berubah semasa berjalan. “Ambil pada setiap permulaan” dan “kemas kini langsung (hot update)” adalah keperluan yang berbeza.
- Bungkus pada masa binaan. Dalam rangkaian CI yang dipercayai, ambil mengikut pencernaan (digest) komit, imbas kandungan, bina imej tidak boleh ubah, dan lampirkan asal-usul (provenance). Pasang mengikut digest imej supaya permulaan tidak bergantung pada ketersediaan Git; pembalikan akan memulihkan digest sebelumnya.
- Gunakan penggantian init-container. Berikan init container ServiceAccount atau Secret khusus, lekapkan kelayakan sebagai baca sahaja, dan tulis komit yang dipin ke dalam
emptyDir. Kontena utama melekapkan direktori yang sama sebagai baca sahaja. Kegagalan pengambilan akan menghalang Pod daripada menjadi Sedia (Ready) dan bukannya mendedahkan kandungan separa.
volumes:
- name: repo-data
emptyDir: {}
initContainers:
- name: fetch-repo
image: platform/git-sync:approved
volumeMounts:
- name: repo-data
mountPath: /work
containers:
- name: app
volumeMounts:
- name: repo-data
mountPath: /app/config
readOnly: trueIni adalah panduan struktur sahaja. Imej, unjuran kelayakan, dasar rangkaian, arahan pengesahan, dan arahan pengambilan mesti ditetapkan mengikut standard platform sebelum penggunaan pengeluaran.
- Kendalikan penyegerak apabila diperlukan. Untuk kemas kini langsung, gunakan sidecar terkawal atau penyegerak luaran. Ambil ke dalam direktori sementara, sahkan komit, manifes fail, dan kebenaran, kemudian tukar direktori versi secara atomik. Sekiranya berlaku kegagalan, kekalkan versi yang sah pada masa itu. Aplikasi mesti menyokong muat semula (reload) atau tetingkap mula semula yang ditetapkan.
- Lindungi rantaian bekalan. Jangan sekali-kali meletakkan token jangka panjang dalam spesifikasi Pod atau log. Hadkan repositori, cawangan, dan egress; sahkan TLS, known hosts, tandatangan komit, atau digest yang dipercayai. Penyegerak tidak boleh mengubah suai laluan hos sebagai root; lekapan aplikasi hendaklah baca sahaja.
- Kenari, sekat, dan buat pembalikan. Sebelum menaik taraf, imbas output CI dan gunakan ValidatingAdmissionPolicy untuk menyekat Pod
gitRepobaharu sambil mengekalkan senarai dibenarkan untuk migrasi. Mulakan semula beban kerja pada set nod kecil dan uji permulaan sejuk (cold starts), kehilangan rangkaian, putaran kelayakan repositori peribadi, penjadualan semula, dan penskalaan. Alih keluar templat lama hanya selepas imej baharu stabil. Pembalikan memulihkan imej atau penyegerak lama, bukan pemalam v1.36 yang telah dilumpuhkan.
Jawapan model
Saya akan menginventori gitRepo dalam objek API dan templat Pod yang dirender, kemudian mengklasifikasikan setiap beban kerja sebagai kandungan tetap, pengambilan permulaan, atau kemas kini langsung. Kandungan tetap dimasukkan ke dalam imej tidak boleh ubah yang dibina oleh CI dan digunakan mengikut digest. Kandungan permulaan menggunakan init container dengan keistimewaan paling rendah untuk menulis komit yang dipin ke emptyDir, yang dilekapkan sebagai baca sahaja oleh kontena utama. Kemas kini langsung menggunakan penyegerak yang mengesahkan versi baharu dalam direktori sementara dan menukarnya secara atomik, sambil mengekalkan versi lama jika berlaku kegagalan.
Setiap laluan mengikat sempadan repositori, komit, kelayakan, rangkaian, dan kebenaran. Token tidak dimasukkan ke dalam spesifikasi dan log; kandungan yang diambil disemak untuk TLS, known hosts, serta asal-usul komit atau imej. Sebelum menaik taraf, imbas templat dan sekat gitRepo baharu; kemudian lakukan pemulaan semula kenari dan penjadualan semula sambil memerhatikan masa permulaan, kegagalan pengambilan, digest kandungan, keadaan Ready, dan kejayaan pembalikan. Memandangkan v1.36 melumpuhkan pemalam secara kekal, pembalikan mesti menggunakan kaedah penggantian atau versi kluster yang lebih lama, bukan suis ciri.
Kesilapan lazim
- Kesilapan: Meletakkan URL repositori dalam ConfigMap dan mengharapkan kemas kini → Sebab ia gagal: ConfigMap tidak mengambil Git atau mengesahkan versi → Pembetulan: serahkan tanggungjawab kepada pembungkusan binaan, init container, atau penyegerak.
- Kesilapan: Membiarkan init container mengambil cawangan lalai (default branch) → Sebab ia gagal: permulaan semula tidak boleh diulang dan pembalikan tidak dapat dibuktikan → Pembetulan: pin komit dan rekod digest serta asal-usulnya.
- Kesilapan: Menjalankan penyegerak sebagai root terhadap laluan yang dikongsi hos → Sebab ia gagal: ia meluaskan permukaan serangan nod dan memintas pengasingan Pod → Pembetulan: gunakan volum setempat Pod, pelaksanaan bukan root, keistimewaan paling rendah, dan penggunaan baca sahaja.
- Kesilapan: Menulis ganti direktori yang sedang dibaca oleh aplikasi → Sebab ia gagal: aplikasi boleh melihat struktur pepohon yang separa → Pembetulan: sahkan dalam direktori sementara dan tukar versi secara atomik.
- Kesilapan: Mengaktifkan semula
GitRepoVolumeDriverselepas v1.36 → Sebab ia gagal: pemalam dilumpuhkan secara kekal dan risiko keselamatan kekal wujud → Pembetulan: undurkan penggantian atau versi kluster sambil meneruskan migrasi.
Soalan susulan dan jawapan
Mengapakah kandungan perlu disahkan apabila komit telah dipin?
Penetapan komit menjadikan rujukan stabil tetapi tidak membuktikan bahawa repositori, kebergantungan, atau persekitaran binaan boleh dipercayai. CI masih perlu mengesahkan tandatangan, asal-usul, manifes fail, imbasan perisian hasad, dan digest imej, dengan mengikat bukti kepada keluaran tersebut.
Di manakah kelayakan repositori peribadi patut disimpan?
Gunakan Secret khusus atau penyedia rahsia luaran yang diskopkan kepada ruang nama (namespace) dan repositori sasaran. Suntik melalui pemboleh ubah persekitaran atau fail yang dilekapkan, jangan sekali-kali melalui imej, anotasi, atau log, dan sokong putaran serta pembatalan.
Apakah yang berlaku apabila init container gagal?
Pod tidak akan tersedia dan kontena utama tidak akan bermula secara normal. Dedahkan puncanya, laksanakan percubaan semula dan backoff, serta tentukan sama ada imej lama atau cache yang telah dipanaskan menyediakan sandaran perniagaan yang sah.
Bagaimanakah kemas kini langsung boleh mengelakkan kandungan separa?
Ambil ke dalam direktori versi baharu, selesaikan semakan komit, manifes, dan kebenaran, kemudian namakan semula atau tukar pautan simbolik (symlink) secara atomik. Aplikasi memerlukan kontrak muat semula atau dasar mula semula; pertukaran yang gagal akan mengekalkan versi semasa.
Bagaimanakah anda mencari penggunaan gitRepo yang terlepas pandang?
Imbas objek API, sumber Helm/Kustomize, output yang dirender, dan mutasi kemasukan. Pantau ralat penamatan penggunaan atau medan tidak dikenali selepas naik taraf, dan kekalkan imbasan dalam CI supaya templat baharu tidak memperkenalkan semula pemalam tersebut.
Rujukan
- Pratonton Kubernetes v1.36 (Blog Kubernetes)
- Dokumentasi Volum (Dokumentasi Kubernetes)
- Konfigurasi Volum Terunjur (Dokumentasi Kubernetes)
- Dasar Penamatan Penggunaan Kubernetes (Dokumentasi Kubernetes)
Senarai semak temu duga
Asingkan semantik tetap, pengambilan permulaan, dan kemas kini langsung, kemudian reka bentuk imej, init container, penyegerak, kebenaran, pengesahan, kenari, dan pembalikan bagi setiap satu.
Pengajaran utama dalam satu ayat
Migrasi gitRepo menggantikan pengklonan Git tersirat di sisi nod dengan rantaian penghantaran kandungan yang boleh diulang, berkeistimewaan paling rendah, dan boleh disahkan.
Terus berlatih
Jika repositori mengandungi model bersaiz berbilang gigabait dan konfigurasi yang kerap berubah, bandingkan lapisan imej, storan objek, init container, dan penyegerak dari segi kos dan ketekalan.