क्या कुबेरनेट्स में नामस्थानों पर रहस्यों को साझा करने का एक तरीका है?
मेरा उपयोग मामला है: मेरे पास मेरे सभी नामस्थानों के लिए एक ही निजी रजिस्ट्री है और मैं प्रत्येक के लिए एक ही रहस्य बनाने से बचना चाहता हूं।
आपकी सहायता के लिए धन्यवाद।
क्या कुबेरनेट्स में नामस्थानों पर रहस्यों को साझा करने का एक तरीका है?
मेरा उपयोग मामला है: मेरे पास मेरे सभी नामस्थानों के लिए एक ही निजी रजिस्ट्री है और मैं प्रत्येक के लिए एक ही रहस्य बनाने से बचना चाहता हूं।
आपकी सहायता के लिए धन्यवाद।
जवाबों:
गुप्त एपीआई ऑब्जेक्ट एक नाम स्थान में रहते हैं। उन्हें केवल उसी नामस्थान में पॉड्स द्वारा संदर्भित किया जा सकता है। मूल रूप से, आपको प्रत्येक नामस्थान के लिए रहस्य बनाना होगा।
https://kubernetes.io/docs/concepts/configuration/secret/#details
उन्हें केवल उसी नामस्थान में पॉड्स द्वारा संदर्भित किया जा सकता है। लेकिन आप सिर्फ एक नाम स्थान से दूसरे में गुप्त कॉपी कर सकते हैं। यहाँ नाम स्थान 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 -
--export
झंडा नहीं ) का उपयोग करता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि "दिए गए विकल्प से नाम स्थान मेल नहीं खाता"। kubectl संस्करण 1.15। मुझे लगता है कि आपको आउटपुट याम्ल से नेमस्पेस को हटाने के लिए sed
उन दो kubectl
आदेशों के बीच उपयोग करने या कुछ करने की आवश्यकता हो सकती है
$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f -
ps को अन्य ऑब्जेक्ट प्रकारों के साथ परीक्षण नहीं किया गया है, लेकिन काम करना चाहिए यदि आप स्थानांतरित कर रहे हैं तो स्रोत को हटाने के लिए मत भूलना
स्वीकृत उत्तर सही है, यहां एक संकेत है यदि आप नामस्थान के बीच के रहस्य को कॉपी करना चाह रहे हैं।
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/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]*"
यह एक्सटेंशन कॉन्फ़ोमैप्स और प्रमाणपत्र-प्रबंधक प्रमाणपत्रों का भी समर्थन करता है। डिस्क्लेनर: मैं कुबेरनेट्स रिफलेक्टर एक्सटेंशन का लेखक हूं।
जैसा कि मासूम एनीबो द्वारा उत्तर दिया गया है, आपको उसी नामस्थान में रहस्य रखने की आवश्यकता है। यदि आपको उस गत्यात्मकता का समर्थन करने या गुप्त निर्माण को भूल जाने से बचने की आवश्यकता है, तो यह संभव हो सकता है कि नेमस्पेस ऑब्जेक्ट https://kubernetes.io/docs/admin/extensible-admission-controllers/ के लिए एक इनिशियलाइज़र बनाना संभव हो (अपने दम पर ऐसा नहीं किया है) , इसलिए खिचड़ी भाषा सुनिश्चित करें)
@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
--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 -
@ इवांस टकर के जवाब पर आधारित है, लेकिन केवल हम जो चाहते हैं, उसे बनाए रखने के लिए 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 -
kubectl गुप्त gitlab- रजिस्ट्री - namespace = Revsys-com --export-yaml | \ kubectl लागू करें - namespace = devspectrum-dev -f - प्राप्त करें
yq
YAML फ़ाइलों के संपादन के लिए एक सहायक कमांड लाइन उपकरण है। मैंने इसे प्राप्त करने के लिए अन्य उत्तरों के साथ संयोजन में इसका उपयोग किया:
kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -
आप GoDaddy के कुबेरनेट्स बाहरी रहस्य का उपयोग करने के बारे में भी सोच सकते हैं ! जहां आप AWS के सीक्रेट मैनेजर (ASM) और GoDaddy के सीक्रेट कंट्रोलर में अपने सीक्रेट्स को स्टोर करेंगे, इससे सीक्रेट्स अपने आप बन जाएंगे। इसके अलावा, ASM और K8S क्लस्टर के बीच सिंक होगा।
एक अन्य विकल्प कुबेड का उपयोग करना होगा , जैसा कि जेटस्टैक के दयालु लोगों द्वारा सुझाया गया था जिन्होंने हमें प्रमाणित-प्रबंधक दिया था। यहाँ वे क्या करने के लिए लिंक है।