Jak skopiować wszystkie zasoby do nowej przestrzeni nazw?
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 --export
flaga, 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
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 all
nie 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 -
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 apply
tego 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 create
i kubectl replace
NIE 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 all
nie zadziała dla Ciebie. Po pierwsze faktycznie nie pokazuje wszystkich zasobów.
Oto zasady rozwijania all
aliasu.
- 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 all
zwró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.