Apakah mungkin untuk memulai ulang satu penampung
Tidak melalui kubectl
, meskipun tergantung pada pengaturan cluster Anda, Anda dapat "menipu" dan docker kill the-sha-goes-here
, yang akan menyebabkan kubelet me-restart container "gagal" (dengan asumsi, tentu saja, kebijakan restart untuk Pod mengatakan bahwa itulah yang seharusnya dilakukan)
bagaimana cara me-restart pod
Itu tergantung pada bagaimana Pod itu dibuat, tetapi berdasarkan nama Pod yang Anda berikan, Pod tersebut tampaknya berada di bawah pengawasan ReplicaSet, jadi Anda bisa kubectl delete pod test-1495806908-xn5jn
dan kubernetes akan membuat yang baru sebagai gantinya (Pod baru akan memiliki nama yang berbeda, jadi jangan berharap kubectl get pods
untuk kembali test-1495806908-xn5jn
lagi)
docker kill the-sha-goes-here
:, lalu mengapa tidak melakukannyadocker container restart the-sha-goes-here
? mengapa mengandalkankubelet
untuk memulainya kembali? Bagaimanapun, masalah sebenarnya adalah di mana saya menjalankandocker
perintah bahkan untuk mematikan wadah. Aktifcould-shell
,docker
tidak menampilkan container dari cluster k8s!Ada beberapa kasus ketika Anda ingin memulai ulang container tertentu daripada menghapus pod dan membiarkan Kubernetes membuatnya kembali.
Melakukan sesuatu
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
untukku.(Saya mengubah perintah dari
reboot
menjadi/sbin/killall5
berdasarkan rekomendasi di bawah ini.)sumber
reboot
; Saya lebih beruntung dengan mengeksekusi/sbin/killall5
; yang mematikan semua proses, dan container akan keluar.kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
bekerja seperti pesonaPod dan container bersifat sementara, coba gunakan perintah berikut untuk menghentikan container tertentu dan cluster k8s akan memulai ulang container baru.
Ini akan mengirimkan
SIGTERM
sinyal ke proses 1, yang merupakan proses utama yang berjalan di dalam container. Semua proses lainnya akan menjadi anak proses 1, dan akan dihentikan setelah proses 1 keluar. Lihat halaman kill man untuk sinyal lain yang dapat Anda kirim.sumber
Seluruh alasan untuk memiliki kubernetes adalah agar ia mengelola container untuk Anda sehingga Anda tidak perlu terlalu peduli dengan lifecyle container di dalam pod.
Karena Anda memiliki
deployment
pengaturan yang menggunakanreplica set
. Anda dapat menghapus pod menggunakankubectl delete pod test-1495806908-xn5jn
dan kubernetes akan mengatur pembuatan pod baru dengan 2 kontainer tanpa waktu henti. Mencoba me-restart container tunggal dalam pod secara manual meniadakan seluruh manfaat dari kubernetes.sumber
Semua jawaban di atas telah menyebutkan penghapusan pod ... tetapi jika Anda memiliki banyak pod dari layanan yang sama maka akan membosankan untuk menghapus setiap pod ...
Oleh karena itu, saya mengusulkan solusi berikut, mulai ulang :
1) Setel skala ke nol:
Perintah di atas akan menghentikan semua pod Anda dengan nama
<<name>>
2) Untuk memulai pod lagi, setel replika menjadi lebih dari 0
Perintah di atas akan memulai pod Anda lagi dengan 2 replika.
sumber
kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"
sebagai gantinya. Ini akan memperbarui penyebaran dan oleh karena itu memulai pembuatan ulang semua pod yang dikelola olehnya sesuai dengan strategi pembaruan bergulir.Kami menggunakan baris perintah yang cukup nyaman untuk memaksa penerapan ulang gambar baru di pod integrasi.
Kami memperhatikan bahwa semua kontainer alpine menjalankan perintah "mempertahankan" mereka pada PID 5. Oleh karena itu, mengirimkannya
SIGTERM
sinyal akan menurunkan kontainer.imagePullPolicy
sedang disetel agarAlways
kubelet menarik kembali image terbaru saat container kembali.sumber
kill -15 5
Anda menjalankan perintah kill untuk mengirim sinyal "-15" ke proses dengan PID 5. Ini adalah cara Anda memberi tahu proses yang Anda ingin agar dihentikan (SIGTERM ) dan meluangkan waktu untuk membersihkan sumber daya yang terbuka (file temp, rollback transaksi db, menutup koneksi, apa pun). Dibandingkan dengan -9 (SIGKILL), proses segera dihentikan, tidak mengizinkannya untuk membersihkan sumber daya yang terbuka.Membunuh proses yang ditentukan di Dockerfile's
CMD
/ENTRYPOINT
bekerja untuk saya. (Penampung dimulai ulang secara otomatis)Mem-boot ulang tidak diizinkan di penampung saya, jadi saya harus menggunakan solusi ini.
sumber
Ada masalah dalam
coredns
pod, saya menghapus pod tersebut olehPodnya akan dimulai ulang secara otomatis.
sumber
Dengan asumsi penampung dijalankan sebagai root yang tidak direkomendasikan.
Dalam kasus saya, ketika saya mengubah konfigurasi aplikasi, saya harus me-reboot container yang digunakan dalam pola sidecar, saya akan mematikan PID untuk aplikasi spring boot yang dimiliki oleh pengguna buruh pelabuhan.
sumber
kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...
, akan lebih mudah bagi orang untuk menyalin / menempel.