कुबेरनेट्स - नामस्थानों पर गुप्त साझा करना


101

क्या कुबेरनेट्स में नामस्थानों पर रहस्यों को साझा करने का एक तरीका है?

मेरा उपयोग मामला है: मेरे पास मेरे सभी नामस्थानों के लिए एक ही निजी रजिस्ट्री है और मैं प्रत्येक के लिए एक ही रहस्य बनाने से बचना चाहता हूं।

आपकी सहायता के लिए धन्यवाद।


यह गुप्त बंटवारे को स्वचालित करता है: github.com/zakkg3/ClusterSecret
NicoKowe

जवाबों:


93

गुप्त एपीआई ऑब्जेक्ट एक नाम स्थान में रहते हैं। उन्हें केवल उसी नामस्थान में पॉड्स द्वारा संदर्भित किया जा सकता है। मूल रूप से, आपको प्रत्येक नामस्थान के लिए रहस्य बनाना होगा।

https://kubernetes.io/docs/concepts/configuration/secret/#details


4
विन्यास के लिए भी। kubernetes.io/docs/tasks/configure-pod-container/…
ब्रीडली

1
यह सही उत्तर है, उल्लेख के लायक है कि आप kubectl + sed द्वारा किसी अन्य नाम स्थान पर क्लोन कर सकते हैं, सभी एक पंक्ति में, नीचे अपना उत्तर देखें।
NicoKowe

75

उन्हें केवल उसी नामस्थान में पॉड्स द्वारा संदर्भित किया जा सकता है। लेकिन आप सिर्फ एक नाम स्थान से दूसरे में गुप्त कॉपी कर सकते हैं। यहाँ नाम स्थान localdockerregसे गुप्त प्रतिलिपि बनाने का एक उदाहरण defaultहै dev:

 kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -

### अद्यतन ### कुबेरनेट्स में v1.14 --exportध्वज को हटा दिया गया है । तो, -oyamlध्वज के साथ निम्न कमांड आगामी संस्करणों में चेतावनी के बिना काम करेगा।

kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -

या नीचे अगर स्रोत नाम स्थान जरूरी डिफ़ॉल्ट नहीं है

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -

1
यह काम नहीं करेगा यदि आप जिन रहस्यों से निर्यात कर रहे हैं वे डिफ़ॉल्ट नाम स्थान में नहीं हैं
गेरासेलस

1
V1.13 पर किसी भी दो नामस्थानों पर मेरे लिए काम करता है
क्षितिज सरावगी

4
हम्म जब मैं दूसरी कमांड (कोई --exportझंडा नहीं ) का उपयोग करता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि "दिए गए विकल्प से नाम स्थान मेल नहीं खाता"। kubectl संस्करण 1.15। मुझे लगता है कि आपको आउटपुट याम्ल से नेमस्पेस को हटाने के लिए sedउन दो kubectlआदेशों के बीच उपयोग करने या कुछ करने की आवश्यकता हो सकती है
मैट डॉज

6
सटीक होने के लिए, आपको इंटरमीडिएट YAML से स्रोत नेमस्पेस को हटाने की आवश्यकता है: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps को अन्य ऑब्जेक्ट प्रकारों के साथ परीक्षण नहीं किया गया है, लेकिन काम करना चाहिए यदि आप स्थानांतरित कर रहे हैं तो स्रोत को हटाने के लिए मत भूलना
कोस्टा शापिरो

कार्य करता है, और क्‍ब्‍कट के उपयोग के संदर्भ को संदर्भ में बदल देता है यदि समूहों के बीच
विंसेंट गेरिस

17

स्वीकृत उत्तर सही है, यहां एक संकेत है यदि आप नामस्थान के बीच के रहस्य को कॉपी करना चाह रहे हैं।

kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -

/ 2020 संपादित करें:

अब नामस्थानों और उसके पार ClusterSecret ऑपरेटर का उपयोग करके सीक्रेट को साझा या सिंक करने का एक तरीका है:

https://github.com/zakkg3/ClusterSecret


7

राज नामांकित संसाधन हैं, लेकिन आप उन्हें दोहराने के लिए कुबेरनेट्स एक्सटेंशन का उपयोग कर सकते हैं। हम इसका उपयोग सभी नामस्थानों में रहस्यों में संग्रहीत क्रेडेंशियल्स या प्रमाणपत्रों को स्वचालित रूप से प्रचारित करने और उन्हें सिंक में रखने के लिए करते हैं (स्रोत को संशोधित करें और सभी प्रतियां अपडेट की जाती हैं)। कुबेरनेट्स रिफ्लेक्टर ( https://github.com/EmberStack/kubernetes-reflector ) देखें ।

विस्तार आपको एनोटेशन के माध्यम से नामस्थानों में एक गुप्त रूप से स्वचालित रूप से कॉपी और सिंक करने की अनुमति देता है:

स्रोत पर गुप्त एनोटेशन जोड़ें:

 annotations:
   reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"

यह सभी नामस्थानों में रहस्य की एक प्रति बनाएगा। आप उन नामस्थानों को सीमित कर सकते हैं जिनमें एक कॉपी का उपयोग करके बनाया गया है:

reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"

यह एक्सटेंशन कॉन्फ़ोमैप्स और प्रमाणपत्र-प्रबंधक प्रमाणपत्रों का भी समर्थन करता है। डिस्क्लेनर: मैं कुबेरनेट्स रिफलेक्टर एक्सटेंशन का लेखक हूं।


अच्छा जोड़ दिया। अभी इसका उपयोग कर रहे हैं। धन्यवाद!
सीटीआईपीकेए

2

जैसा कि मासूम एनीबो द्वारा उत्तर दिया गया है, आपको उसी नामस्थान में रहस्य रखने की आवश्यकता है। यदि आपको उस गत्यात्मकता का समर्थन करने या गुप्त निर्माण को भूल जाने से बचने की आवश्यकता है, तो यह संभव हो सकता है कि नेमस्पेस ऑब्जेक्ट https://kubernetes.io/docs/admin/extensible-admission-controllers/ के लिए एक इनिशियलाइज़र बनाना संभव हो (अपने दम पर ऐसा नहीं किया है) , इसलिए खिचड़ी भाषा सुनिश्चित करें)


1

@NicoKowe से सुधार

एक लाइनर सभी नामों को एक नाम स्थान से दूसरे तक कॉपी करने के लिए

$ for i in `kubectl get secrets | awk '{print $1}'`; do  kubectl get secret $1 -n <source-namespace> -o yaml | sed s/"namespace: <source-namespace>"/"namespace: <target-namespace>"/ | kubectl apply -n <target-namespace> -f -  ; done

1

--export पदावनत किया गया है

sed YAML या JSON के संपादन के लिए उपयुक्त उपकरण नहीं है।

यहाँ एक उदाहरण है जो jqनामस्थान और अन्य मेटाडेटा को हटाने के लिए उपयोग करता है जो हम नहीं चाहते हैं:

kubectl get secret cure-for-covid-19 -n china -o json | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n rest-of-world -f -

1

@ इवांस टकर के जवाब पर आधारित है, लेकिन केवल हम जो चाहते हैं, उसे बनाए रखने के लिए jq फ़िल्टर के भीतर डिलीट करने के बजाय व्हाइटलाइनिंग का उपयोग करते हैं।

kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name"}' | kubectl apply -n rest-of-world -f -

अनिवार्य रूप से एक ही चीज है लेकिन लेबल को संरक्षित करता है।

kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name", "labels"}' | kubectl apply -n rest-of-world -f -


0

kubectl गुप्त gitlab- रजिस्ट्री - namespace = Revsys-com --export-yaml | \ kubectl लागू करें - namespace = devspectrum-dev -f - प्राप्त करें


0

मूल नामस्थानों पर रहस्य का उपयोग करने के लिए सर्विसबुक को अधिकृत करने के लिए RBAC का उपयोग करें। लेकिन, यह नाम के बीच एक साझा रहस्य रखने के लिए अनुशंसित नहीं है।


0

सभी रहस्यों को कॉपी करने के लिए समाधान।

kubectl delete secret --namespace $TARGET_NAMESPACE--all;
kubectl get secret --namespace default --output yaml \
    | sed "s/namespace: $SOURCE_NAMESPACE/namespace: $TARGET_NAMESPACE/" \
    | kubectl apply --namespace $TARGET_NAMESPACE --filename -;

0

yqYAML फ़ाइलों के संपादन के लिए एक सहायक कमांड लाइन उपकरण है। मैंने इसे प्राप्त करने के लिए अन्य उत्तरों के साथ संयोजन में इसका उपयोग किया:

kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -

0

आप GoDaddy के कुबेरनेट्स बाहरी रहस्य का उपयोग करने के बारे में भी सोच सकते हैं ! जहां आप AWS के सीक्रेट मैनेजर (ASM) और GoDaddy के सीक्रेट कंट्रोलर में अपने सीक्रेट्स को स्टोर करेंगे, इससे सीक्रेट्स अपने आप बन जाएंगे। इसके अलावा, ASM और K8S क्लस्टर के बीच सिंक होगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.