รีสตาร์ทพ็อดเมื่อมีการอัปเดต configmap ใน Kubernetes?


121

ฉันจะรีสตาร์ท Kubernetes พ็อดและพ็อดที่เชื่อมโยงกับการปรับใช้โดยอัตโนมัติได้อย่างไรเมื่อมีการเปลี่ยนแปลง / อัปเดต Configmap


ฉันรู้ว่ามีการพูดคุยเกี่ยวกับความสามารถในการรีสตาร์ทพ็อดโดยอัตโนมัติเมื่อแมปการกำหนดค่าเปลี่ยนไป แต่จากความรู้ของฉันสิ่งนี้ยังไม่มีใน Kubernetes 1.2

ดังนั้นสิ่งที่ (ฉันคิดว่า) ฉันต้องการทำคือ "การรีสตาร์ทแบบกลิ้ง" ของทรัพยากรการปรับใช้ที่เกี่ยวข้องกับพ็อดที่ใช้แมป config เป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นจะบังคับให้รีสตาร์ทการปรับใช้ใน Kubernetes โดยไม่เปลี่ยนแปลงอะไรในเทมเพลตจริง ขณะนี้เป็นวิธีที่ดีที่สุดหรือมีทางเลือกอื่นที่ดีกว่านี้


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...ทำงานให้ฉัน
maciek

คำตอบ:


60

การส่งสัญญาณพ็อดในการอัปเดตแผนที่กำหนดค่าเป็นคุณสมบัติในการทำงาน ( https://github.com/kubernetes/kubernetes/issues/22368 )

คุณสามารถเขียน pid1 ที่กำหนดเองได้ตลอดเวลาโดยสังเกตว่า Confimap มีการเปลี่ยนแปลงและรีสตาร์ทแอปของคุณ

คุณยังสามารถเช่น: เมานต์คอนฟิกแมปเดียวกันใน 2 คอนเทนเนอร์แสดงการตรวจสอบความสมบูรณ์ของ http ในคอนเทนเนอร์ที่สองที่ล้มเหลวหากแฮชของคอนเทนต์การกำหนดค่าคอนฟิกเปลี่ยนแปลงและดันสิ่งนั้นเป็นโพรบความเป็นอยู่ของคอนเทนเนอร์แรก (เนื่องจากคอนเทนเนอร์ใน a พ็อดแชร์เนมสเปซเครือข่ายเดียวกัน) kubelet จะรีสตาร์ทคอนเทนเนอร์แรกให้คุณเมื่อโพรบล้มเหลว

แน่นอนว่าหากคุณไม่สนใจว่าโหนดใดที่อยู่ในพ็อดคุณสามารถลบออกได้และตัวควบคุมการจำลองจะ "รีสตาร์ท" ให้คุณ


เมื่อ "ลบพ็อด" คุณหมายถึง: รวบรวมชื่อพ็อดทั้งหมดลบหนึ่งชื่อรอจนกว่าจะแทนที่ลบอันที่สองรอจนกว่าจะแทนที่เป็นต้นถูกต้องหรือไม่?
Torsten Bronger

6
โดยใช้การปรับใช้ฉันจะลดขนาดลงและเพิ่มขึ้น คุณจะยังคงมีเวลาหยุดทำงานเล็กน้อย คุณสามารถทำได้ในบรรทัดเดียวเพื่อลดสิ่งนั้น ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H

หากคุณไม่ต้องการค้นหาพ็อดทั้งหมดและไม่สนใจเกี่ยวกับการหยุดทำงานเพียงแค่ถอด RC ออกแล้วสร้าง RC ใหม่
Drew

1
นี่หมายความว่าไดรฟ์ข้อมูลที่ติดตั้งได้รับการอัปเดตและคุณเพียงแค่ต้องอ่านไฟล์บนพ็อดอีกครั้งโดยไม่ต้องรีสตาร์ททั้งพ็อด
Matt Williamson

@NickH รวดเร็วและสกปรกโชคดีที่การหยุดทำงานเป็นที่ยอมรับในกรณีของฉันและมันก็ใช้งานได้ดีขอบคุณ!
ChocolateAndCheese

130

วิธีแก้ปัญหาที่ดีที่สุดในปัจจุบัน (อ้างอิงลึก ๆ ในhttps://github.com/kubernetes/kubernetes/issues/22368 ที่เชื่อมโยงในคำตอบพี่น้อง) คือการใช้การปรับใช้และพิจารณาว่า ConfigMaps ของคุณไม่เปลี่ยนรูป

เมื่อคุณต้องการเปลี่ยนการกำหนดค่าของคุณให้สร้าง ConfigMap ใหม่พร้อมกับการเปลี่ยนแปลงที่คุณต้องการทำและชี้การปรับใช้ของคุณที่ ConfigMap ใหม่ หากการกำหนดค่าใหม่ใช้งานไม่ได้การปรับใช้จะปฏิเสธที่จะลดขนาดของ ReplicaSet ที่ใช้งานได้ หากการกำหนดค่าใหม่ใช้งานได้ ReplicaSet เก่าของคุณจะถูกปรับขนาดเป็น 0 แบบจำลองและลบออกและพ็อดใหม่จะเริ่มต้นด้วยการกำหนดค่าใหม่

ไม่เร็วเท่ากับการแก้ไข ConfigMap แต่ปลอดภัยกว่ามาก


2
นี่คือแนวทางที่เราเคยทำเช่นกัน
โยฮัน

5
ควรค่าแก่การกล่าวถึงว่าเครื่องมือทดลองใหม่kustomizeรองรับการสร้างแฮช configmap ที่กำหนดโดยอัตโนมัติซึ่งหมายความว่าคุณไม่จำเป็นต้องสร้าง configmap ใหม่ด้วยตนเอง: github.com/kubernetes-sigs/kustomize/blob/…
Symmetric

นี่คือสิ่งที่ Spinnaker ทำอยู่เบื้องหลังดังนั้นหากคุณใช้มันคุณจะไม่ต้องกังวลเกี่ยวกับเรื่องนี้
กัส

33

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

บ่อยครั้งที่ configmaps หรือข้อมูลลับถูกแทรกเป็นไฟล์คอนฟิกูเรชันในคอนเทนเนอร์ ทั้งนี้ขึ้นอยู่กับแอปพลิเคชันอาจจำเป็นต้องมีการรีสตาร์ทหากมีการอัปเดตในภายหลังhelm upgradeแต่หากข้อกำหนดการปรับใช้เองไม่ได้เปลี่ยนแปลงแอปพลิเคชันจะยังคงทำงานด้วยการกำหนดค่าแบบเก่าซึ่งส่งผลให้การปรับใช้ไม่สอดคล้องกัน

sha256sumฟังก์ชั่นที่สามารถใช้ร่วมกับincludeฟังก์ชั่นเพื่อให้แน่ใจว่าการใช้งานส่วนแม่แบบที่มีการปรับปรุงหากมีการเปลี่ยนแปลงข้อมูลจำเพาะอื่น:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

ในกรณีของฉันด้วยเหตุผลบางประการ$.Template.BasePathไม่ได้ผล แต่$.Chart.Nameทำ:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}

9
ไม่สามารถใช้ได้กับการใช้งาน Kubernetes ทั่วไปใช้ได้กับ Helm
Emii Khaos

3
คำตอบมีประโยชน์ แต่อาจไม่เกี่ยวข้องกับคำถามนี้
Anand Singh Kunwar

helm3 เปิดตัวเมื่อไม่นานมานี้ ดังนั้นลิงก์จึงล้าสมัย มันชี้ไปที่masterสาขา URL ต่อไปนี้จะนำไปสู่ ​​(ปัจจุบัน) helm2 เอกสารล่าสุด: github.com/helm/helm/blob/release-2.16/docs/…
Marcel Hoyer

น้ำยาเด็ด. ผมเปลี่ยนไป sha1sum เช่นเดียวกับในกรณีของฉัน sha256sum มี 65 Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 charactersตัวอักษรซึ่งมีผลใน ทางเลือกจะเป็น| trunc 63แต่ sha1sum ควร "มีเอกลักษณ์มากขึ้น"
iptizer

32

วิธีที่ดีที่สุดที่ฉันพบคือเรียกใช้Reloader

ช่วยให้คุณสามารถกำหนด configmaps หรือความลับในการรับชมเมื่อได้รับการอัปเดตจะมีการดำเนินการอัปเดตแบบต่อเนื่องของการปรับใช้ของคุณ นี่คือตัวอย่าง:

คุณมีการใช้งานfooและ ConfigMap foo-configmapที่เรียกว่า คุณต้องการม้วนพ็อดของการปรับใช้ทุกครั้งที่มีการเปลี่ยนแปลง configmap คุณต้องเรียกใช้ Reloader ด้วย:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

จากนั้นระบุคำอธิบายประกอบนี้ในการปรับใช้ของคุณ:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...

Reloader เข้ากันได้กับ kubernetes> = 1.9
jacktrade

11

คุณสามารถอัปเดตป้ายกำกับข้อมูลเมตาที่ไม่เกี่ยวข้องกับการปรับใช้ของคุณ จะทำให้เกิดการอัปเดตแบบต่อเนื่อง

ตัวอย่างเช่น:

metadata:
  labels:
    configmap-version: 1

ฉันกำลังดูเอกสารเกี่ยวกับข้อมูลเมตา: label: configmap-version: 1
c4f4t0r

7
การเปลี่ยนแปลงป้ายกำกับข้อมูลเมตาไม่ทำให้เกิดการรีสตาร์ท
dan carter

คำตอบนี้มีประโยชน์มากดังนั้นฉันจึงต้องถาม หากเราอัปเดตข้อมูลเมตาคลัสเตอร์ Kubernetes จะทริกเกอร์การอัปเดตต่อเนื่องหรือไม่ @ maoz-zadok
titus

1
ฉันเชื่อว่าสิ่งนี้ใช้ได้ตราบเท่าที่ป้ายกำกับข้อมูลเมตาอยู่ภายใต้template.spec
Saikiran Yerram

1

มีปัญหานี้ที่การปรับใช้อยู่ในแผนภูมิย่อยและค่าที่ควบคุมอยู่ในไฟล์ค่าของแผนภูมิหลัก นี่คือสิ่งที่เราใช้เพื่อเริ่มการรีสตาร์ท:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

เห็นได้ชัดว่าสิ่งนี้จะทำให้เกิดการรีสตาร์ทเมื่อมีการเปลี่ยนแปลงค่าใด ๆแต่ใช้ได้กับสถานการณ์ของเรา สิ่งที่มีอยู่เดิมในแผนภูมิลูกจะใช้ได้ก็ต่อเมื่อ config.yaml ในแผนภูมิลูกมีการเปลี่ยนแปลง:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

ฉันแก้ปัญหาของควอนต้าและมันก็ทำงานได้อย่างสมบูรณ์ แต่สิ่งที่ฉันไม่เข้าใจคือพ็อดไม่ได้รีสตาร์ท ... พ็อดยังเหมือนเดิม แต่มีการเปลี่ยนแปลงอยู่ที่นั่น!

ตัวอย่างเช่น Pod ทำงานตั้งแต่ 50 นาทีและฉันเปลี่ยนบางอย่างและการเปลี่ยนแปลงกำลังออนไลน์ฉันเห็นมันบนเบราว์เซอร์ของฉันและพ็อดยังคงทำงานอยู่ + 50 นาที !! ฉันใช้ Helm3 ... คุณรู้ไหมว่าอะไรทำให้เป็นไปได้โดยไม่ต้องรีสตาร์ทอัปเดต configmap?


1
ตกลง! ฉันพบว่า ... เพราะเราติดตั้ง configmap ของเราเป็นโวลุ่มและอัปเดตแบบไดนามิก ... นั่นคือเหตุผลที่เมื่อฉันทำสิ่งนี้ '' checksum '' แล้วพ็อดของฉันไม่รีสตาร์ท แต่มีการเปลี่ยนแปลงอยู่! ฉันขอแนะนำให้เป็น ทางออกที่ดี :)
Ibrahim Yesilay

-1

อีกวิธีหนึ่งคือติดไว้ในส่วนคำสั่งของ Deployment:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

หรือเพื่อให้เหมือน ConfigMap มากขึ้นให้ใช้การปรับใช้เพิ่มเติมที่จะโฮสต์การกำหนดค่านั้นในcommandส่วนและดำเนินการkubectl createในขณะที่เพิ่ม 'เวอร์ชัน' ที่ไม่ซ้ำกันให้กับชื่อ (เช่นการคำนวณแฮชของเนื้อหา) และแก้ไขทั้งหมด การปรับใช้ที่ใช้ config นั้น:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

ฉันอาจจะโพสต์kubectl-apply-config.shถ้ามันใช้งานได้

(อย่าทำแบบนั้นมันดูแย่เกินไป)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.