Wie kopiere ich alle Ressourcen in einen neuen Namespace?

Nov 24 2020

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 --exportFlagge, 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

3 HarshManvar Nov 24 2020 at 18:56

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 allnicht 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 -
1 OlesyaBolobova Nov 25 2020 at 00:20

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 applyangewendete 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 createund kubectl replacebehalten 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 allwird es bei Ihnen nicht funktionieren. Erstens werden tatsächlich nicht alle Ressourcen angezeigt.
Hier sind die Regeln zum Erweitern des allAlias.

 - 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 allSie 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.