Bagaimana cara saya secara otomatis memulai ulang pod dan pod Kubernetes yang terkait dengan penerapan ketika configmapnya diubah / diperbarui?
Saya tahu telah ada pembicaraan tentang kemampuan untuk secara otomatis memulai ulang pod ketika peta konfigurasi berubah tetapi sepengetahuan saya ini belum tersedia di Kubernetes 1.2.
Jadi yang (menurut saya) ingin saya lakukan adalah "memulai ulang secara bergulir" dari sumber daya penerapan yang terkait dengan pod yang menggunakan peta konfigurasi. Apakah mungkin, dan jika demikian bagaimana, untuk memaksa restart bergulir dari penerapan di Kubernetes tanpa mengubah apapun di template sebenarnya? Apakah saat ini cara terbaik untuk melakukannya atau apakah ada pilihan yang lebih baik?
$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...
lakukan pekerjaan untuk sayaJawaban:
Memberi sinyal pada pod pada update config map adalah fitur yang sedang dikerjakan ( https://github.com/kubernetes/kubernetes/issues/22368 ).
Anda selalu dapat menulis pid1 khusus yang memperhatikan bahwa confimap telah berubah dan memulai ulang aplikasi Anda.
Anda juga dapat misalnya: memasang config map yang sama dalam 2 kontainer, mengekspos health check http di kontainer kedua yang gagal jika hash konten config map berubah, dan mendorongnya sebagai probe liveness dari kontainer pertama (karena kontainer dalam pod berbagi namespace jaringan yang sama). Kubelet akan memulai ulang container pertama Anda saat probe gagal.
Tentu saja jika Anda tidak peduli pada node mana pod tersebut berada, Anda dapat dengan mudah menghapusnya dan pengontrol replikasi akan "memulai ulang" untuk Anda.
sumber
kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Solusi terbaik saat ini untuk masalah ini (dirujuk jauh di https://github.com/kubernetes/kubernetes/issues/22368 ditautkan dalam jawaban saudara) adalah dengan menggunakan Deployments, dan menganggap ConfigMaps Anda tidak dapat diubah.
Jika Anda ingin mengubah konfigurasi, buat ConfigMap baru dengan perubahan yang ingin Anda buat, dan arahkan penerapan Anda ke ConfigMap baru. Jika konfigurasi baru rusak, Deployment akan menolak untuk menurunkan ReplicaSet Anda yang berfungsi. Jika konfigurasi baru berfungsi, maka ReplicaSet lama Anda akan diskalakan menjadi 0 replika dan dihapus, dan pod baru akan dimulai dengan konfigurasi baru.
Tidak secepat hanya mengedit ConfigMap di tempatnya, tetapi jauh lebih aman.
sumber
kustomize
mendukung pembuatan hash configmap deterministik secara otomatis, yang berarti Anda tidak perlu membuat configmap baru secara manual: github.com/kubernetes-sigs/kustomize/blob/…Cara terbaik yang saya temukan untuk melakukannya adalah dengan berlari Reloader
Ini memungkinkan Anda untuk menentukan configmaps atau rahasia yang harus diperhatikan, ketika diperbarui, pembaruan berkelanjutan dari penerapan Anda dilakukan. Berikut contohnya:
Anda memiliki penerapan
foo
dan ConfigMap dipanggilfoo-configmap
. Anda ingin menggulung pod penerapan setiap kali configmap diubah. Anda perlu menjalankan Reloader dengan:Kemudian tentukan anotasi ini dalam penerapan Anda:
sumber
https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change
Sering kali configmaps atau rahasia dimasukkan sebagai file konfigurasi di container. Bergantung pada aplikasinya, restart mungkin diperlukan jika mereka diperbarui dengan yang berikutnya
helm upgrade
, tetapi jika spesifikasi penerapan itu sendiri tidak mengubah aplikasi tetap berjalan dengan konfigurasi lama yang mengakibatkan penerapan tidak konsisten.The
sha256sum
fungsi dapat digunakan bersama-sama denganinclude
fungsi untuk memastikan penyebaran bagian template diperbarui jika perubahan spesifikasi lain:Dalam kasus saya, karena beberapa alasan,
$.Template.BasePath
tidak berfungsi tetapi berfungsi$.Chart.Name
:sumber
helm
3 dirilis baru-baru ini. Dengan demikian, tautannya sudah usang. Itu menunjuk kemaster
cabang. URL berikut akan mengarah ke (saat ini)helm
2 dokumen terbaru : github.com/helm/helm/blob/release-2.16/docs/…Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters
. Alternatifnya adalah| trunc 63
, tapi sha1sum harus "lebih unik".Anda dapat memperbarui label metadata yang tidak relevan untuk penerapan Anda. itu akan memicu pembaruan berkelanjutan
sebagai contoh:
sumber
template.spec
Mengalami masalah saat Deployment berada di sub-diagram dan nilai yang mengendalikannya ada di file nilai diagram induk. Inilah yang kami gunakan untuk memicu restart:
Jelas ini akan memicu restart pada setiap perubahan nilai tetapi berfungsi untuk situasi kita. Apa yang awalnya di bagan anak hanya akan berfungsi jika config.yaml di bagan anak itu sendiri berubah:
sumber
Saya melakukan solusi dari quanta "s dan bekerja dengan sempurna. Tetapi yang tidak saya mengerti adalah bahwa pod sebenarnya tidak restart ... Pod masih sama tetapi ada perubahan!
Sebagai contoh: Pod berjalan sejak 50 menit dan saya mengubah sesuatu dan mengubahnya online. Saya dapat melihatnya di browser saya dan pod masih berjalan + 50 menit !! Saya menggunakan Helm3 ... Tahukah Anda apa yang membuat hal ini mungkin terjadi tanpa memperbarui configmap?
sumber
Cara lain adalah dengan memasukkannya ke bagian perintah Deployment:
Atau, untuk membuatnya lebih mirip ConfigMap, gunakan Deployment tambahan yang hanya akan menghosting konfigurasi itu di
command
bagian dan menjalankannyakubectl create
sambil menambahkan 'versi' unik ke namanya (seperti menghitung hash konten) dan memodifikasi semua penerapan yang menggunakan konfigurasi itu:Saya mungkin akan memposting
kubectl-apply-config.sh
jika akhirnya berhasil.(jangan lakukan itu; itu terlihat terlalu buruk)
sumber