Wie kopiere ich alle Ressourcen in einen neuen Namespace?
Ich möchte einen neuen Namespace erstellen, der mit dem alten identisch ist.
Mein Ansatz würde ungefähr so aussehen (vollständiger Befehl unten):
kubectl get <resources> -o json --namespace OLD-NAMESPACE | jq '.items[].metadata.namespace = "NEW-NAMESPACE"' | kubectl create -f -
Dadurch werden im Grunde alle Ressourcendefinitionen in einem JSON-Format abgerufen, der alte Namespace durch den neuen ersetzt und alles angewendet.
Leider funktioniert dies nicht, da die alten Definitionen namespace-spezifische Dinge enthalten. Um dies zu vermeiden, gab es früher eine --export
Flagge, die veraltet ist, siehe hier .
Irgendeine Idee, wie ich das machen könnte?
Voller Befehl:
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 -
Antworten
Sie können dies versuchen
kubectl get all -n OLD_NAMESPACE -o yaml | sed -e 's/namespace: OLD_NAMESPACE/namespace: NEW_NAMESPACE/' | kubectl apply -f -
das wird funktionieren
Wenn Sie eine höhere K8s-Version über 1.14 verwenden, ersetzt sed die Namespaces
Wenn kubectl get all
nicht alle Ressourcen hinzugefügt werden, können wir wie anwenden
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 -
Derzeit gibt es keinen etablierten Weg, um Ihre Aufgabe zu lösen.
Es gibt einige gängige Ansätze, die Sie ausprobieren können.
Siehe auch Diskussion hier .
Wenn bis dahin eine Ressource erstellt wurde, wird das kubectl apply
angewendete Yaml in einer speziellen Anmerkung gespeichert.
kubectl.kubernetes.io/last-applied-configuration
Sie können es folgendermaßen abrufen:
kubectl get deploy example -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | jq .
Beachten Sie dies kubectl create
und kubectl replace
behalten Sie diese Anmerkung NICHT bei.
Weitere Beispiele finden Sie hier .
Denken Sie auch daran, wie dieser Ansatz bei Objektaktualisierungen funktioniert .
Alternativ können Sie auch auf die direkte Verarbeitung von json / yaml zurückgreifen.
kubectl get deploy example -ojson | \ice
jq 'del(.metadata.creationTimestamp, .metadata.managedFields, \
.metadata.namespace, .metadata.ownerReferences, \
.metadata.resourceVersion, .metadata.selfLink, \
.metadata.uid, .status)'
Stellen Sie sicher, dass Sie alle Servicefelder löschen (z. B. fügt Helm viele Dinge hinzu).
Höchstwahrscheinlich kubectl get all
wird es bei Ihnen nicht funktionieren. Erstens werden tatsächlich nicht alle Ressourcen angezeigt.
Hier sind die Regeln zum Erweitern des all
Alias.
- 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)
Verwirrenderweise scheinen diese Informationen aus kubernetes-Dokumenten gelöscht worden zu sein und existieren nur in archivierten Kopien, sind aber immer noch relevant.
Außerdem erhalten kubectl get all
Sie sowohl Pods als auch Deployment Controller (wie Deployments oder StatefulSets) zurück, was nicht das ist, was Sie möchten, da Sie in den meisten Fällen Ihre Pods nicht explizit erstellen möchten.