Jak skopiować wszystkie zasoby do nowej przestrzeni nazw?

Nov 24 2020

Chciałbym utworzyć nową przestrzeń nazw, która jest identyczna ze starą.

Moje podejście wyglądałoby mniej więcej tak (pełne polecenie poniżej):

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

To w zasadzie pobiera wszystkie definicje zasobów w formacie json, zastępuje starą przestrzeń nazw nową i stosuje wszystko.

Niestety to nie działa, ponieważ stare definicje zawierają elementy specyficzne dla przestrzeni nazw. Aby tego uniknąć, istniała --exportflaga, która została wycofana, zobacz tutaj .

Masz pomysł, jak mogłem to zrobić?

Pełne polecenie:

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  -

Odpowiedzi

3 HarshManvar Nov 24 2020 at 18:56

możesz tego spróbować

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

to zadziała

jeśli używasz wyższej wersji K8s powyżej 1.14, sed będzie działał, aby zastąpić przestrzenie nazw

jeśli kubectl get allnie dodając wszystkich zasobów, które możemy zastosować, np

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

Na razie nie ma żadnego ustalonego sposobu rozwiązania zadania.
Istnieje kilka typowych podejść, które możesz wypróbować.
Zobacz także dyskusję tutaj .


Jeśli zasób zostanie utworzony do kubectl applytego czasu, zastosowany yaml zostanie zapisany w specjalnej adnotacji.
kubectl.kubernetes.io/last-applied-configuration
Możesz to pobrać w ten sposób:

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

Zauważ to kubectl createi kubectl replaceNIE zachowuj tej adnotacji.
Zobacz więcej przykładów tutaj .
Pamiętaj również, jak to podejście działa w przypadku aktualizacji obiektów .


Alternatywnie możesz skorzystać z bezpośredniego przetwarzania json / yaml.

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

Upewnij się, że usunąłeś wszystkie pola usług (na przykład Helm dodaje dużo rzeczy).


Najprawdopodobniej kubectl get allnie zadziała dla Ciebie. Po pierwsze faktycznie nie pokazuje wszystkich zasobów.
Oto zasady rozwijania allaliasu.

 - 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)

Co dziwne, wydaje się, że te informacje zostały usunięte z dokumentów kubernetes i istnieją tylko w zarchiwizowanych kopiach, ale nadal są aktualne.

Poza tym kubectl get allzwróci ci zarówno pody, jak i kontrolery wdrażania (takie jak Deployments lub StatefulSets), co nie jest tym, czego chcesz, ponieważ w większości przypadków nie chcesz jawnie tworzyć podów.