อัพเดต k8s ConfigMap หรือ Secret โดยไม่ต้องลบที่มีอยู่


100

ฉันใช้ K8S ConfigMap และ Secret เพื่อจัดการคุณสมบัติของเรา การออกแบบของฉันค่อนข้างเรียบง่ายที่เก็บไฟล์คุณสมบัติไว้ใน git repo และใช้ build server เช่น Thoughtworks GO เพื่อปรับใช้โดยอัตโนมัติเป็น ConfigMaps หรือ Secrets (ตามเงื่อนไขที่เลือก) กับคลัสเตอร์ k8s ของฉัน

ตอนนี้ฉันพบว่ามันไม่มีประสิทธิภาพจริงๆที่ฉันจะต้องลบ ConfigMap และ Secret ที่มีอยู่เสมอและสร้างอันใหม่เพื่ออัปเดตดังนี้:

  1. kubectl delete configmap foo

  2. kubectl create configmap foo --from-file foo.properties

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


ฉันเพิ่งสร้างโครงการเพื่อแมป configmap กับค่าสภาพแวดล้อมโดยอัตโนมัติมันจะมีประโยชน์สำหรับใครบางคน github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

คำตอบ:


161

คุณสามารถรับ YAML จากkubectl create configmapคำสั่งและไพพ์ไปที่kubectl replaceดังนี้:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

3
ไพพ์คำสั่งเป็นวิธีที่จะไปไม่ได้คิดถึง --dry-run ซึ่งดูเหมือนจะเป็นส่วนสำคัญของคำสั่ง!
James Jiang

5
รูปแบบเดียวกันนี้สามารถใช้กับความลับได้อย่างไรนอกเหนือจากตัวอย่าง ConfigMaps ที่แสดงที่นี่
rwehner

2
ลองใช้ kubernetes 1.10 แต่ฉันได้รับข้อผิดพลาดerror: error validating "STDIN": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
เรื่อย ๆ

2
นั่นคือข้อบกพร่องใน 1.10 แก้ไขใน 1.10.1 - ดูที่github.com/kubernetes/kubernetes/issues/61780และgithub.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt

2
คำตอบที่ดี โดยใช้kubectl applyแทนkubectl replaceจะใช้ได้ทั้งกับ configmap ใหม่และที่มีอยู่
nahsh

34

สำหรับการอ้างอิงในอนาคตkubectl replaceตอนนี้เป็นวิธีที่สะดวกมากในการบรรลุเป้าหมายนี้

kubectl replace -f some_spec.yaml ให้คุณอัปเดต configMap ที่สมบูรณ์ (หรือวัตถุอื่น ๆ )

ดูเอกสารและตัวอย่างโดยตรงที่นี่

คัดลอก / วางจากวิธีใช้:

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json

2
สิ่งนี้พลาด--from-fileข้อกำหนด Configmaps สามารถสร้างได้จากไฟล์โดยพลการไม่ใช่แค่ yaml
Dave Hillier

@ sébastien-portebois ขอบคุณ! ฉันไม่รู้--forceตัวเลือกอะไรที่จะทำให้เราใช้<dry-run ConfigMap creation> | kubectl replace --force -f -คำสั่งapproach ได้แม้ในครั้งที่ 1 เมื่อยังไม่มี ConfigMap แต่ฉันไม่แน่ใจว่าจะปลอดภัยหรือไม่ที่จะลบ ConfigMap เนื่องจาก Pods อาจพังในระหว่างที่ไม่มีเนื่องจากหาไม่พบ อาจจะดีกว่าแนวทาง<dry-run ConfigMap creation> | kubectl apply -f -? ประเด็นนี้ได้รับการแนะนำโดย @ karthic-c คุณคิดอย่างไร? ยัง @ jordan-liggitt คุณคิดอย่างไร?
Alex MM

19

สำหรับการเปลี่ยนแปลงเล็กน้อยconfigMapให้ใช้edit

kubectl edit configmap <cfg-name>

เพื่อเปิด configMap ในตัวviแก้ไข ทำการเปลี่ยนแปลงและบันทึก


1
เย็น. อย่างไรก็ตามตามที่ OP กล่าวมานี้เป็นเรื่องเกี่ยวกับวิธีการบรรลุเป้าหมายด้วยกระบวนการอัตโนมัติเช่น ด้วย ThoughtWorks Go เป็นเซิร์ฟเวอร์สร้างในสถานการณ์ของฉัน
James Jiang

5

kubectl replace ล้มเหลวหากมี configmap อยู่แล้ว:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

ทางออกที่ดีที่สุดคือใช้kubectl applyซึ่งจะสร้าง configmap หากไม่มีอยู่ให้อัปเดต configmap อื่นหากมีอยู่:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -

configmap/falco-config configured


6
ฉันคิดว่าคุณหมายถึง " kubectl replaceล้มเหลวหากไม่มี configmap อยู่แล้ว"
David Dooling

0

ถ่ายสำเนาของ configmap ที่มีอยู่:

kubectl get configmap foo -o yaml > foo.yaml

จากนั้นทำการปรับเปลี่ยนและใช้คำสั่ง Apply สิ่งนี้จะได้ผล

kubectl apply -f foo.yaml

หมายเหตุ: ในกรณีที่คุณพบปัญหาใด ๆ ต่อไปนี้ให้รวม "resourceVersion" ล่าสุดจากแผนที่กำหนดค่าที่มีอยู่แล้วลองอีกครั้ง

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

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