Kapsayıcı içindeki kapsayıcıyı yeniden başlatın


113

test-1495806908-xn5jn2 konteynerli bir bölmem var . Aralarından birini yeniden başlatmak istiyorum container-test. Bir kapsül içindeki tek bir kabı yeniden başlatmak mümkün müdür ve nasıl? Değilse, bölmeyi nasıl yeniden başlatırım?

Bölme şunlarla oluşturuldu deployment.yaml:

kubectl create -f deployment.yaml

Yanıtlar:


145

Tek bir konteyneri yeniden başlatmak mümkün mü

Her kubectlne kadar kümenizin kurulumuna bağlı olarak "hile yapabilir" ve docker kill the-sha-goes-herebu da kubelet'in "başarısız" konteyneri yeniden başlatmasına neden olur (tabii ki, Pod için yeniden başlatma politikasının yapması gereken şeyin bu olduğunu varsayarsak)

bölmeyi nasıl yeniden başlatırım

Bu, Kapsülün nasıl oluşturulduğuna bağlıdır, ancak sağladığınız Kapsül adına bağlı olarak, bir ReplicaSet'in gözetimi altında görünüyor, böylece yapabilirsiniz kubectl delete pod test-1495806908-xn5jnve kubernetes onun yerine yeni bir tane oluşturacaktır (yeni Bölmede bir farklı bir ad, böylece sanmıyoruz kubectl get podsdönmek için test-1495806908-xn5jn) tekrar hiç


7
Varsayılan yeniden başlatma politikası her zaman yeniden başlatmadır
Hem

Bunu yapabiliyorsam: docker kill the-sha-goes-hereneden docker container restart the-sha-goes-hereonun yerine yapmayayım? kubeletyeniden başlatmak için neden güvenmelisiniz ? Her neyse, asıl sorun şu ki docker, konteyneri öldürmek için bile komutu nerede çalıştırmalıyım . Açık could-shell, dockerk8s kümelerinden gelen kapları göstermez!
Nawaz

54

Bölmeyi silmek ve Kubernetes'in onu yeniden oluşturmasına izin vermek yerine belirli bir kapsayıcıyı yeniden başlatmak istediğiniz durumlar vardır.

Bir Doing kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5benim için çalıştı.

(Ben den komutu değişti rebootiçin /sbin/killall5önerileri aşağıda dayalı.)


28
Her konteynerde reboot; Bunun /sbin/killall5yerine yürütme konusunda daha şanslıydım ; bu tüm süreçleri öldürür ve konteyner çıkar.
Ingo Karkat

1
Ve her konteynerin kök kullanıcısı yoktur;)
JuliSmz

4
-1, çünkü ... 'yeniden başlatmanın' yan etkisini tüm süreçleri sonlandırıp Kubernetes kurtarmanın yan etkisini kullanıyorsunuz. Pek çok varsayım yapıyor: kök olarak çalıştırma, konteynırdaki ikili dosyanın kullanılabilirliği, etkinleştirilmiş bir yeniden başlatma politikası, vb. Ayrıca, bu, ideal olmayan bir işlemin başarısızlığı hakkındaki günlükleri karıştırır.
gertvdijk

2
Görünüşe göre alpine killall'a sahip değil, ama / sbin / reboot harika çalışıyor. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootbir cazibe gibi çalıştı
Atifm

39

Hem kapsül hem de kapsayıcı kısa ömürlüdür, belirli bir kabı durdurmak için aşağıdaki komutu kullanmayı deneyin; k8s kümesi yeni bir kabı yeniden başlatacaktır.

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

Bu SIGTERM, kapta çalışan ana işlem olan işlem 1'e bir sinyal gönderecektir . Diğer tüm işlemler, işlem 1'in çocukları olacak ve süreç 1'den çıktıktan sonra sona erdirilecektir. Gönderebileceğiniz diğer sinyaller için öldürme kılavuz sayfasına bakın .


3
Diğer cevapları denedim ve bu benim için işe yarayan tek cevaptı, bana göre en genel cevap bu.
Batato

bir bölmenin içinde çalışan kapsayıcı adını nasıl alırım?
AATHITH RAJENDRAN

Alpine konteynerim bunu denediğimde bir çeşit sağlıksız duruma geçti. kubectl get po, bölmenin durum sütununda Hata gösteriyor.
Atifm

17

Kubernetes'e sahip olmanın tüm nedeni, kapsayıcıları sizin için yönetmesi ve böylece bölmedeki kapların yaşam biçimini çok fazla önemsememenizdir.

deploymentKullanan bir kurulumunuz olduğundan replica set. Bölmeyi kullanarak silebilirsiniz kubectl delete pod test-1495806908-xn5jnve kubernetes herhangi bir kesinti olmaksızın 2 kapsayıcı ile yeni bir bölmenin oluşturulmasını yönetecektir. Bölmelerdeki tekli konteynerleri manuel olarak yeniden başlatmaya çalışmak, kubernetes'in tüm faydalarını ortadan kaldırır.


2
Sonlandırıcı kapsülümün süreci 0/1 olduğunda kesinti yaşadım
Dean Christian Armada

6
"Herhangi bir kesinti olmadan" belirtirken dikkatli olmalısınız. Tam konfigürasyonunuza bağlıdır. Ayrıca sıfır kesinti süresinin kendi başına zorlukları vardır.
Nicolas

Yalnızca 1 çoğaltmayla dağıtımımdaki bir bölmeyi sildiğimde, her zaman kesinti yaşıyorum.
Nyein Chan Wynn

7

Yukarıdaki yanıtların tümü, bölmenin silinmesinden bahsetmiştir ... ancak aynı hizmetin birçok bölmesine sahipseniz, her birini silmek sıkıcı olacaktır ...

Bu nedenle, aşağıdaki çözümü öneriyorum, yeniden başlatın :

  • 1) Ölçeği sıfıra ayarlayın:

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

    Yukarıdaki komut, tüm bölmelerinizi adıyla sonlandıracaktır. <<name>>

  • 2) Bölmeyi yeniden başlatmak için, kopyaları 0'dan büyük olacak şekilde ayarlayın

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

    Yukarıdaki komut, bölmelerinizi 2 kopya ile yeniden başlatacaktır.


5
Soru, bir kapsül içindeki tek bir kabın nasıl yeniden başlatılacağını soruyordu.
Chris Beach

Ayrıca, 0 bölmeye ölçekleme, yüksek düzeyde kullanılabilir uygulamalar için çalışmayacaktır. kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"Bunun yerine kullanın . Bu, dağıtımı güncelleyecek ve bu nedenle, sürekli güncelleme stratejisine göre kendisi tarafından yönetilen tüm bölmelerin yeniden oluşturulmasını başlatacaktır.
Kostrahb

3

Entegrasyon bölmesinde yeni görüntülerin yeniden dağıtımını zorlamak için oldukça kullanışlı bir komut satırı kullanıyoruz.
Alp tipi konteynerlerimizin hepsinin "sürdürme" komutunu PID 5'te çalıştırdığını fark ettik. Bu nedenle, bir SIGTERMsinyal göndererek konteyneri aşağı indirir. imagePullPolicyiçin ayarlanmış olan Alwaysbu konteyner geri getirir ne zaman kubelet yeniden çekme son imajı vardır.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
-15 ve 5 neyi temsil eder?
John Balvin Arias

2
@JohnBalvinArias, yukarıdaki açıklamaya dahil edilmiştir, ancak kill -15 5PID 5 ile işleme "-15" sinyali göndermek için kill komutunu çalıştırıyorsunuz. ) ve açık kaynakları (geçici dosyalar, geri alma db işlemleri, kapatma bağlantıları, her neyse) temizlemek için zaman ayırmasını sağlayın. -9 (SIGKILL) ile karşılaştırıldığında, süreci hemen sonlandırır, açık kaynakları temizlemesine izin vermez.
Conrad.Dean

2

Dockerfile'da belirtilen süreci öldürmek CMD/ ENTRYPOINTbenim için çalışıyor. (Kapsayıcı otomatik olarak yeniden başlar)

Kapsayıcımda yeniden başlatmaya izin verilmedi, bu yüzden bu geçici çözümü kullanmak zorunda kaldım.


2

corednsBölmede bir sorun vardı , bu bölmeyi tarafından sildim

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

Bölmesi otomatik olarak yeniden başlayacaktır.


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

Konteynerin tavsiye edilmeyen kök olarak çalıştırıldığı varsayılır.

Benim durumumda uygulama yapılandırmasını değiştirdiğimde, bir sepet modelinde kullanılan kabı yeniden başlatmak zorunda kaldım, docker kullanıcısına ait olan yaylı önyükleme uygulaması için PID'yi öldürürdüm.


1
Eğer yazarsanız kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., o insanlar / kopyalamak yapıştırmak için çok daha kolay hale getirir.
William Pursell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.