Mulai ulang penampung di dalam pod

112

Saya memiliki pod test-1495806908-xn5jndengan 2 wadah. Saya ingin memulai ulang salah satu dari mereka yang dipanggil container-test. Apakah mungkin untuk memulai ulang satu kontainer dalam sebuah pod dan bagaimana caranya? Jika tidak, bagaimana cara me-restart pod?

Pod dibuat menggunakan deployment.yamldengan:

kubectl create -f deployment.yaml
s5s
sumber

Jawaban:

144

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-xn5jndan kubernetes akan membuat yang baru sebagai gantinya (Pod baru akan memiliki nama yang berbeda, jadi jangan berharap kubectl get podsuntuk kembali test-1495806908-xn5jnlagi)

mdaniel
sumber
7
Kebijakan restart default selalu restart
Hem
Jika saya bisa melakukan ini docker kill the-sha-goes-here:, lalu mengapa tidak melakukannya docker container restart the-sha-goes-here? mengapa mengandalkan kubeletuntuk memulainya kembali? Bagaimanapun, masalah sebenarnya adalah di mana saya menjalankan dockerperintah bahkan untuk mematikan wadah. Aktif could-shell, dockertidak menampilkan container dari cluster k8s!
Nawaz
53

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/killall5untukku.

(Saya mengubah perintah dari rebootmenjadi /sbin/killall5berdasarkan rekomendasi di bawah ini.)

Zsolt Katona
sumber
28
Tidak setiap wadah memiliki reboot; Saya lebih beruntung dengan mengeksekusi /sbin/killall5; yang mematikan semua proses, dan container akan keluar.
Ingo Karkat
1
Dan tidak setiap penampung memiliki pengguna root;)
JuliSmz
4
-1, karena ... Anda menggunakan efek samping 'reboot' yang mematikan semua proses dan pemulihan Kubernetes. Ini membuat banyak asumsi: berjalan sebagai root, ketersediaan biner dalam wadah, restartPolicy yang diaktifkan, dll. Selain itu, ini mengacaukan log tentang kegagalan proses, yang tidak ideal.
gertvdijk
1
Jadi sepertinya alpine tidak memiliki killall, tetapi / sbin / reboot berfungsi dengan baik. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootbekerja seperti pesona
Atifm
38

Pod dan container bersifat sementara, coba gunakan perintah berikut untuk menghentikan container tertentu dan cluster k8s akan memulai ulang container baru.

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

Ini akan mengirimkan SIGTERMsinyal 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.

ROY
sumber
3
Saya mencoba jawaban lain dan yang ini adalah satu-satunya yang berhasil untuk saya, menurut saya itu yang paling umum.
Batato
bagaimana cara mendapatkan nama container yang berjalan di dalam pod ??
AATHITH RAJENDRAN
Kontainer Alpine saya mengalami status tidak sehat ketika saya mencoba ini. kubectl get po menunjukkan Kesalahan pada kolom status untuk pod ..
Atifm
17

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 deploymentpengaturan yang menggunakan replica set. Anda dapat menghapus pod menggunakan kubectl delete pod test-1495806908-xn5jndan 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.

Anigbo yang tidak bersalah
sumber
2
Saya mengalami downtime karena proses terminating pod saya menjadi 0/1
Dean Christian Armada
6
Anda harus berhati-hati dalam menyatakan "tanpa downtime". Itu tergantung pada konfigurasi Anda yang sebenarnya. Ditambah zero-downtime memiliki tantangan tersendiri.
Nicolas
Saat saya menghapus pod dalam penerapan saya hanya dengan 1 replika, saya selalu mengalami waktu henti.
Nyein Chan Wynn
7

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:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    Perintah di atas akan menghentikan semua pod Anda dengan nama <<name>>

  • 2) Untuk memulai pod lagi, setel replika menjadi lebih dari 0

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    Perintah di atas akan memulai pod Anda lagi dengan 2 replika.

Ajay Reddy
sumber
5
Pertanyaannya adalah tentang bagaimana memulai kembali satu kontainer dalam sebuah pod.
Chris Beach
Selain itu, memperkecil hingga 0 pod tidak akan berfungsi untuk aplikasi yang sangat tersedia. Gunakan 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.
Kostrahb
3

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 SIGTERMsinyal akan menurunkan kontainer. imagePullPolicysedang disetel agar Alwayskubelet menarik kembali image terbaru saat container kembali.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5
Alexis LEGROS
sumber
1
apa yang diwakili -15 dan 5?
John Balvin Arias
2
@JohnBalvinArias terselip dalam deskripsi di atas, tetapi saat kill -15 5Anda 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.
Conrad.Dean
2

Membunuh proses yang ditentukan di Dockerfile's CMD/ ENTRYPOINTbekerja untuk saya. (Penampung dimulai ulang secara otomatis)

Mem-boot ulang tidak diizinkan di penampung saya, jadi saya harus menggunakan solusi ini.

Kevin
sumber
2

Ada masalah dalam corednspod, saya menghapus pod tersebut oleh

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

Podnya akan dimulai ulang secara otomatis.

j3ffyang
sumber
2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

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.

GreenThumb
sumber
1
Jika Anda menulis kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., akan lebih mudah bagi orang untuk menyalin / menempel.
William Pursell