รีสตาร์ทคอนเทนเนอร์ภายในพ็อด


113

ฉันมีฝักที่test-1495806908-xn5jnมี 2 ​​ตู้คอนเทนเนอร์ container-testฉันต้องการที่จะเริ่มต้นใหม่หนึ่งของพวกเขาเรียกว่า เป็นไปได้ไหมที่จะรีสตาร์ทคอนเทนเนอร์เดียวภายในพ็อดและทำอย่างไร ถ้าไม่ฉันจะรีสตาร์ทพ็อดได้อย่างไร

พ็อดถูกสร้างขึ้นโดยใช้deployment.yaml:

kubectl create -f deployment.yaml

คำตอบ:


145

เป็นไปได้หรือไม่ที่จะรีสตาร์ทคอนเทนเนอร์เดียว

ไม่ผ่านkubectlแม้ว่าจะขึ้นอยู่กับการตั้งค่าคลัสเตอร์ของคุณคุณสามารถ "โกง" และdocker kill the-sha-goes-hereซึ่งจะทำให้ kubelet รีสตาร์ทคอนเทนเนอร์ "ล้มเหลว" (สมมติว่านโยบายการรีสตาร์ทสำหรับ Pod บอกว่าเป็นสิ่งที่ควรทำ)

ฉันจะรีสตาร์ทพ็อดได้อย่างไร

ขึ้นอยู่กับวิธีสร้าง Pod แต่ขึ้นอยู่กับชื่อ Pod ที่คุณระบุดูเหมือนว่าจะอยู่ภายใต้การดูแลของ ReplicaSet ดังนั้นคุณสามารถทำได้kubectl delete pod test-1495806908-xn5jnและ kubernetes จะสร้างขึ้นมาใหม่แทน (Pod ใหม่จะมี ชื่ออื่นดังนั้นอย่าหวังว่าkubectl get podsจะกลับมาtest-1495806908-xn5jnอีกเลย)


7
นโยบายการรีสตาร์ทเริ่มต้นคือการเริ่มต้นใหม่เสมอ
Hem

ถ้าทำได้: docker kill the-sha-goes-hereแล้วทำไมไม่ทำdocker container restart the-sha-goes-hereแทนล่ะ? ทำไมต้องพึ่งkubeletรีสตาร์ท? อย่างไรก็ตามปัญหาที่แท้จริงคือฉันจะรันdockerคำสั่งได้ที่ไหนแม้จะฆ่าคอนเทนเนอร์ บนcould-shell, dockerไม่แสดงภาชนะบรรจุออกจากกลุ่ม k8s!
Nawaz

54

มีหลายกรณีที่คุณต้องการรีสตาร์ทคอนเทนเนอร์เฉพาะแทนที่จะลบพ็อดและปล่อยให้ Kubernetes สร้างขึ้นใหม่

ทำkubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5ทำงานให้ฉัน

(ฉันเปลี่ยนคำสั่งจากrebootเป็น/sbin/killall5ตามคำแนะนำด้านล่าง)


28
ไม่ใช่ว่าทุกคนมีภาชนะreboot; ฉันมีโชคมากขึ้นกับการดำเนินการ/sbin/killall5แทน; ที่ฆ่ากระบวนการทั้งหมดและคอนเทนเนอร์จะออก
Ingo Karkat

1
และไม่ใช่ทุกคอนเทนเนอร์ที่มีผู้ใช้รูท;)
JuliSmz

4
-1 เนื่องจาก ... คุณกำลังใช้ผลข้างเคียงของการ 'รีบูต' เพื่อฆ่ากระบวนการทั้งหมดและการกู้คืน Kubernetes มีการตั้งสมมติฐานมากมาย: ทำงานในฐานะรูท, ความพร้อมใช้งานของไบนารีในคอนเทนเนอร์, restartPolicy ที่เปิดใช้งาน ฯลฯ นอกจากนี้สิ่งนี้ยังถ่วงบันทึกเกี่ยวกับความล้มเหลวของกระบวนการซึ่งไม่เหมาะ
gertvdijk

2
ดูเหมือนว่าอัลไพน์ไม่มี killall แต่ / sbin / reboot ใช้งานได้ดี kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootทำงานอย่างมีเสน่ห์
Atifm

39

ทั้งพ็อดและคอนเทนเนอร์เป็นแบบชั่วคราวลองใช้คำสั่งต่อไปนี้เพื่อหยุดคอนเทนเนอร์เฉพาะและคลัสเตอร์ k8s จะรีสตาร์ทคอนเทนเนอร์ใหม่

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

สิ่งนี้จะส่งSIGTERMสัญญาณไปยังกระบวนการที่ 1 ซึ่งเป็นกระบวนการหลักที่ทำงานในคอนเทนเนอร์ กระบวนการอื่น ๆ ทั้งหมดจะเป็นลูกของกระบวนการ 1 และจะสิ้นสุดลงหลังจากออกจากกระบวนการที่ 1 ดูkill manpageสำหรับสัญญาณอื่น ๆ ที่คุณสามารถส่งได้


3
ฉันลองคำตอบอื่น ๆ และคำตอบนี้เป็นคำตอบเดียวที่ใช้ได้ผลสำหรับฉันดูเหมือนว่าฉันจะเป็นคำตอบทั่วไปที่สุด
Batato

ฉันจะรับชื่อคอนเทนเนอร์ที่ทำงานอยู่ในพ็อดได้อย่างไร
AATHITH RAJENDRAN

ตู้คอนเทนเนอร์ Alpine ของฉันอยู่ในสถานะไม่แข็งแรงเมื่อฉันลองสิ่งนี้ kubectl get po แสดงข้อผิดพลาดในคอลัมน์สถานะของพ็อด ..
Atifm

17

เหตุผลทั้งหมดของการมี kubernetes คือการจัดการตู้คอนเทนเนอร์ให้คุณดังนั้นคุณจึงไม่ต้องดูแลมากนักเกี่ยวกับอายุการใช้งานของภาชนะบรรจุในพ็อด

เนื่องจากคุณมีการdeploymentตั้งค่าที่ใช้replica set. คุณสามารถลบพ็อดโดยใช้kubectl delete pod test-1495806908-xn5jnและ kubernetes จะจัดการการสร้างพ็อดใหม่ด้วย 2 คอนเทนเนอร์โดยไม่ต้องหยุดทำงานใด ๆ การพยายามรีสตาร์ทคอนเทนเนอร์เดี่ยวในพ็อดด้วยตนเองจะลบล้างประโยชน์ทั้งหมดของ kubernetes


2
ฉันประสบกับการหยุดทำงานเนื่องจากกระบวนการยุติการใช้งานพ็อดของฉันกลายเป็น 0/1
Dean Christian Armada

6
คุณต้องระมัดระวังในการระบุว่า "โดยไม่มีการหยุดทำงาน" ขึ้นอยู่กับการกำหนดค่าที่แน่นอนของคุณ บวกกับการหยุดทำงานเป็นศูนย์ยังมีความท้าทายในตัวเอง
Nicolas

เมื่อฉันลบพ็อดในการปรับใช้ของฉันด้วยการจำลองเพียง 1 ตัวฉันมักจะพบปัญหาการหยุดทำงาน
Nyein Chan Wynn

7

คำตอบทั้งหมดข้างต้นได้กล่าวถึงการลบพ็อด ... แต่ถ้าคุณมีหลายพ็อดของบริการเดียวกันก็คงจะน่าเบื่อที่จะลบแต่ละอัน ...

ดังนั้นฉันขอเสนอวิธีแก้ปัญหาต่อไปนี้เริ่มต้นใหม่ :

  • 1) ตั้งค่ามาตราส่วนเป็นศูนย์:

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

    คำสั่งดังกล่าวจะยุติพ็อดทั้งหมดของคุณด้วยชื่อ <<name>>

  • 2) ในการเริ่มต้นพ็อดอีกครั้งให้ตั้งค่าแบบจำลองเป็นมากกว่า 0

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

    คำสั่งดังกล่าวจะเริ่มต้นพ็อดของคุณอีกครั้งด้วยการจำลอง 2 รายการ


5
มีคำถามถามเกี่ยวกับวิธีรีสตาร์ทคอนเทนเนอร์เดียวภายในพ็อด
Chris Beach

นอกจากนี้การลดขนาดลงเป็น 0 พ็อดจะใช้ไม่ได้กับแอปพลิเคชันที่มีความพร้อมใช้งานสูง ใช้kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"แทน การดำเนินการนี้จะอัปเดตการปรับใช้และเริ่มใช้งานพ็อดทั้งหมดที่จัดการโดยมันตามกลยุทธ์การอัปเดตแบบต่อเนื่อง
Kostrahb

3

เราใช้บรรทัดคำสั่งที่ค่อนข้างสะดวกในการบังคับให้ใช้งานอิมเมจใหม่บนอินทิเกรตพอดอีกครั้ง
เราสังเกตเห็นว่าตู้คอนเทนเนอร์แบบอัลไพน์ของเราล้วนเรียกใช้คำสั่ง "ค้ำจุน" บน PID 5 ดังนั้นการส่งSIGTERMสัญญาณจะทำให้คอนเทนเนอร์หยุดทำงาน imagePullPolicyถูกตั้งค่าให้Alwayskubelet ดึงภาพล่าสุดอีกครั้งเมื่อนำคอนเทนเนอร์กลับมา

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

1
-15 และ 5 หมายถึงอะไร?
John Balvin Arias

2
@JohnBalvinArias มันซ่อนอยู่ในคำอธิบายด้านบน แต่kill -15 5คุณกำลังเรียกใช้คำสั่ง kill เพื่อส่งสัญญาณ "-15" ไปยังกระบวนการด้วย PID 5 นี่คือวิธีที่คุณบอกกระบวนการที่คุณต้องการให้มันยุติ (SIGTERM ) และต้องใช้เวลาในการล้างทรัพยากรที่เปิดอยู่ (ไฟล์ชั่วคราว, ธุรกรรมฐานข้อมูลย้อนกลับ, การเชื่อมต่อแบบปิด, อะไรก็ตาม) ตรงกันข้ามกับ -9 (SIGKILL) ฆ่ากระบวนการทันทีโดยไม่อนุญาตให้ล้างทรัพยากรที่เปิดอยู่
คอนราดดีน

2

การฆ่ากระบวนการที่ระบุใน Dockerfile CMD/ ENTRYPOINTใช้ได้ผลสำหรับฉัน (คอนเทนเนอร์จะรีสตาร์ทโดยอัตโนมัติ)

ไม่อนุญาตให้รีบูตเครื่องในคอนเทนเนอร์ของฉันดังนั้นฉันจึงต้องใช้วิธีแก้ปัญหานี้


2

มีปัญหาในcorednsพ็อดฉันลบพ็อดดังกล่าวโดย

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

พ็อดจะรีสตาร์ทโดยอัตโนมัติ


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

สมมติว่าคอนเทนเนอร์ถูกรันเป็นรูทซึ่งไม่แนะนำ

ในกรณีของฉันเมื่อฉันเปลี่ยนการกำหนดค่าแอปพลิเคชันฉันต้องรีบูตคอนเทนเนอร์ที่ใช้ในรูปแบบด้านข้างฉันจะฆ่า PID สำหรับแอปพลิเคชันสปริงบูตซึ่งเป็นของผู้ใช้นักเทียบท่า


1
ถ้าคุณเขียนkubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...จะทำให้คนอื่นคัดลอก / วางได้ง่ายขึ้นมาก
William Pursell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.