मौजूदा एक को हटाने के बिना k8s कॉन्फ़िगर करें या गुप्त अपडेट करें


99

मैं अपनी संपत्तियों का प्रबंधन करने के लिए K8S विन्यास और गुप्त का उपयोग कर रहा हूं। मेरा डिज़ाइन बहुत सरल है, जो एक git repo में प्रॉपर्टीज़ फ़ाइलों को रखता है और बिल्ड सर्वर जैसे Thoughtworks GO का उपयोग करता है, उन्हें अपने k8s क्लस्टर में कॉन्फ़िगमैप या सीक्रेट्स (पसंद की स्थिति पर) स्वचालित रूप से वितरित करने के लिए तैनात करता है।

वर्तमान में, मैंने पाया कि यह वास्तव में कुशल नहीं है कि मुझे हमेशा मौजूदा विन्यास मानचित्र और गुप्त को हटाना होगा और नीचे दिए अनुसार अपडेट करने के लिए नया बनाना होगा:

  1. kubectl delete configmap foo

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

क्या एक कदम से ऊपर और वर्तमान को हटाने की तुलना में अधिक कुशल बनाने का एक अच्छा और सरल तरीका है? संभावित रूप से जो मैं अभी कर रहा हूं वह कंटेनर से समझौता कर सकता है जो कि इन कॉन्फ़िगरेशन का उपयोग करता है यदि यह माउंट करने की कोशिश करता है जबकि पुराने कॉन्फ़िगरेशन को हटा दिया जाता है और नया नहीं बनाया गया है।

अग्रिम में धन्यवाद।


मैंने बस पर्यावरण के मूल्यों के लिए कॉन्फ़िगरमैप मैप करने के लिए एक परियोजना बनाई है, यह किसी के लिए उपयोगी हो सकता है। github.com/Acanguven/kubernetes-configmap-update
Ahmet

जवाबों:


160

आप kubectl create configmapकमांड से YAML प्राप्त कर सकते हैं और इसे kubectl replaceइस तरह से पाइप कर सकते हैं :

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

3
पाइप कमांड जाने का रास्ता है, जो कि -डी-रन के बारे में नहीं सोच रहा था जो कमांड का प्रमुख हिस्सा प्रतीत होता है!
जेम्स जियांग

5
इसके लायक क्या है, यह वही पैटर्न यहां दिखाए गए कॉन्फ़ोमैपैप उदाहरण के अलावा गोपनीयता के लिए काम कर सकता है।
रवेनर

2
1.10 kubernetes के साथ यह कोशिश कर रहा हूं, लेकिन मुझे त्रुटि 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

2
बहुत बढ़िया जवाब। के kubectl applyबजाय का उपयोग करते हुए kubectl replace, नए और मौजूदा विन्यास के लिए काम करेंगे
nahsh

32

भविष्य के संदर्भ के लिए, kubectl replaceअब इसे प्राप्त करने का एक बहुत आसान तरीका है

kubectl replace -f some_spec.yaml आपको एक पूरा कॉन्फिगरेशन (या अन्य ऑब्जेक्ट) अपडेट करने दें

दस्तावेज़ और सीधे उदाहरण देखें यहाँ

मदद से कॉपी / पेस्ट करें:

# 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आवश्यकता से चूक गया । वाई-फाई नहीं बल्कि एक मनमाने फ़ाइल से कॉन्फिगरेशन बनाया जा सकता है।
डेव हिलियर

@ sébastien-portebois धन्यवाद! मुझे इस --forceविकल्प का पता नहीं था , कि हम क्या <dry-run ConfigMap creation> | kubectl replace --force -f -पहली बार भी एप्रोच कमांड का उपयोग कर सकते हैं, जब विन्यास मैप अभी तक मौजूद नहीं है। लेकिन मुझे यकीन नहीं है कि कॉन्फिगरेशन को डिलीट करना सुरक्षित है क्योंकि इसे न ढूंढने के कारण इसकी कमी के दौरान पॉड्स टूट सकते हैं। शायद यह दृष्टिकोण बेहतर है <dry-run ConfigMap creation> | kubectl apply -f -? यह बिंदु @ karthic-c द्वारा पेश किया गया था, आपको क्या लगता है? इसके अलावा @ जोर्डन-लिगिट आपको क्या लगता है?
एलेक्स एमएम

18

configMapउपयोग में छोटे बदलावों के लिएedit

kubectl edit configmap <cfg-name>

यह viएडिटर में configMap खोलेगा । बदलाव करें और इसे बचाएं।


1
ठंडा। हालांकि, जैसा कि ओपी ने उल्लेख किया है, यह स्वचालित प्रक्रियाओं के साथ लक्ष्य को प्राप्त करने के तरीके के बारे में है, जैसे। ThoughtWorks के साथ मेरे परिदृश्य में सर्वर के निर्माण के रूप में जाओ।
जेम्स जियांग

5

kubectl replace यदि कोई कॉन्फ़िगरेशनमैप पहले से मौजूद है तो विफल रहता है:

$ 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जो अगर मौजूद है, तो अपडेट को अपडेट करने के लिए अगर यह मौजूद है, तो कॉन्फ़िगरमैप का निर्माण करेगा:

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

configmap/falco-config configured


6
मुझे लगता है कि आपका मतलब है " kubectl replaceविफल हो जाता है अगर एक कॉन्फ़िगरमैप पहले से मौजूद नहीं है"।
डेविड डूलिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.