मैं सभी संसाधनों को एक नए नाम स्थान पर कैसे कॉपी करूं?

Nov 24 2020

मैं एक नया नामस्थान बनाना चाहूंगा जो पुराने के समान हो।

मेरा दृष्टिकोण कुछ इस तरह होगा (नीचे पूर्ण आदेश):

kubectl get <resources> -o json --namespace OLD-NAMESPACE | jq '.items[].metadata.namespace = "NEW-NAMESPACE"' | kubectl create -f  -

यह मूल रूप से एक json प्रारूप में सभी संसाधन परिभाषाएं प्राप्त करता है, पुराने नाम स्थान को नए के साथ बदल देता है, और सब कुछ लागू होता है।

दुर्भाग्य से, यह काम नहीं करता है, क्योंकि पुरानी परिभाषाओं में नाम स्थान विशिष्ट चीजें हैं। इससे बचने के लिए, एक --exportध्वज हुआ करता था, जिसे यहाँ देखने के लिए चित्रित किया गया है ।

किसी भी विचार मैं यह कैसे कर सकता है?

पूर्ण आदेश:

kubectl get bindings,configmaps,endpoints,limitranges,persistentvolumeclaims,persistentvolumes,pods,podtemplates,replicationcontrollers,resourcequotas,secrets,mutatingwebhookconfigurations,validatingwebhookconfigurations,controllerrevisions,daemonsets,deployments,replicasets,statefulsets,tokenreviews,localsubjectaccessreviews,selfsubjectaccessreviews,selfsubjectrulesreviews,subjectaccessreviews,horizontalpodautoscalers,cronjobs,jobs,certificatesigningrequests,leases,endpointslices,events,ingressclasses,networkpolicies,runtimeclasses,poddisruptionbudgets,rolebindings,roles,debugattachments,csidrivers,volumeattachments -o json --namespace OLD-NAMESPACE | jq '.items[].metadata.namespace = "NEW-NAMESPACE"' | kubectl create -f  -

जवाब

3 HarshManvar Nov 24 2020 at 18:56

आप यह कोशिश कर सकते हैं

kubectl get all -n OLD_NAMESPACE -o yaml | sed -e 's/namespace: OLD_NAMESPACE/namespace:  NEW_NAMESPACE/' | kubectl apply -f -

यह काम करेगा

आप 1.14 से ऊपर एक उच्च K8s संस्करण का उपयोग कर रहे हैं sed नामस्थान को बदलने के लिए काम करेंगे

यदि kubectl get allहम सभी संसाधनों को नहीं जोड़ सकते हैं तो हम इस तरह आवेदन कर सकते हैं

kubectl get bindings,configmaps,endpoints,limitranges,persistentvolumeclaims,persistentvolumes,pods,podtemplates,replicationcontrollers,resourcequotas,secrets,mutatingwebhookconfigurations,validatingwebhookconfigurations,controllerrevisions,daemonsets,deployments,replicasets,statefulsets,tokenreviews,localsubjectaccessreviews,selfsubjectaccessreviews,selfsubjectrulesreviews,subjectaccessreviews,horizontalpodautoscalers,cronjobs,jobs,certificatesigningrequests,leases,endpointslices,events,ingressclasses,networkpolicies,runtimeclasses,poddisruptionbudgets,rolebindings,roles,debugattachments,csidrivers,volumeattachments -n OLD_NAMESPACE -o yaml | sed -e 's/namespace: OLD_NAMESPACE/namespace:  NEW_NAMESPACE/' | kubectl apply -f -
1 OlesyaBolobova Nov 25 2020 at 00:20

अभी के लिए आपके कार्य को हल करने का कोई स्थापित तरीका नहीं है।
कुछ सामान्य दृष्टिकोण हैं जिन्हें आप आज़मा सकते हैं।
इसके अलावा चर्चा को देखें यहाँ ।


यदि एक संसाधन बनाया जाता है kubectl applyतो लागू यम को विशेष एनोटेशन में बचाया जाएगा।
kubectl.kubernetes.io/last-applied-configuration
आप इसे इस तरह से पुनः प्राप्त कर सकते हैं:

kubectl get deploy example -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | jq .

ध्यान दें कि kubectl createऔर kubectl replaceइस एनोटेशन को बरकरार न रखें।
अधिक उदाहरण यहां देखें ।
यह भी ध्यान रखें कि यह दृष्टिकोण ऑब्जेक्ट अपडेट के साथ कैसे काम करता है ।


वैकल्पिक रूप से आप डायरेक्ट जसन / यामल प्रोसेसिंग का सहारा ले सकते हैं।

kubectl get deploy example -ojson | \ice 
jq 'del(.metadata.creationTimestamp, .metadata.managedFields, \
  .metadata.namespace, .metadata.ownerReferences, \
  .metadata.resourceVersion, .metadata.selfLink, \
  .metadata.uid, .status)'

सुनिश्चित करें कि आप सभी सेवा क्षेत्रों को हटा दें (उदाहरण के लिए, हेल्म बहुत सारे सामान जोड़ता है)।


अधिकांश शायद kubectl get allआपके लिए काम नहीं करेंगे। पहले यह वास्तव में सभी संसाधनों को नहीं दिखाता है।
यहाँ उर्फ विस्तार के नियम हैं all

 - No cluster scoped resources
 - No namespace admin level resources (limits, quota, policy, authorization rules)
 - No resources that are potentially unrecoverable (secrets and pvc)
 - Resources that are considered "similar" to #3 should be grouped the same (configmaps)

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

इसके अलावा kubectl get allआपको पॉड्स और डेप्लॉयमेंट कंट्रोलर (जैसे डिप्लॉयमेंट या स्टेटफुलसेट) दोनों वापस मिल जाएंगे, जो कि आप नहीं चाहते हैं, जैसा कि ज्यादातर समय में आप स्पष्ट रूप से पॉड्स नहीं बनाना चाहते हैं।