Comment copier toutes les ressources dans un nouvel espace de noms?
Je voudrais créer un nouvel espace de noms identique à l'ancien.
Mon approche ressemblerait à quelque chose comme ceci (commande complète ci-dessous):
kubectl get <resources> -o json --namespace OLD-NAMESPACE | jq '.items[].metadata.namespace = "NEW-NAMESPACE"' | kubectl create -f -
Cela obtient fondamentalement toutes les définitions de ressources dans un format json, remplace l'ancien espace de noms par le nouveau et applique tout.
Malheureusement, cela ne fonctionne pas, car les anciennes définitions contiennent des éléments spécifiques aux espaces de noms. Pour éviter cela, il y avait un --export
indicateur, qui est obsolète, voir ici .
Une idée comment je pourrais faire cela?
Commande complète:
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 -
Réponses
tu peux essayer ça
kubectl get all -n OLD_NAMESPACE -o yaml | sed -e 's/namespace: OLD_NAMESPACE/namespace: NEW_NAMESPACE/' | kubectl apply -f -
cela fonctionnera
si vous utilisez une version supérieure de K8 au-dessus de la version 1.14, sed fonctionnera pour remplacer les espaces de noms
sinon en kubectl get all
ajoutant toutes les ressources, nous pouvons appliquer comme
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 -
Pour l'instant, il n'existe aucun moyen établi de résoudre votre tâche.
Vous pouvez essayer certaines approches courantes.
Voir également la discussion ici .
Si une ressource est créée par kubectl apply
yaml alors appliqué, elle sera enregistrée dans une annotation spéciale.
kubectl.kubernetes.io/last-applied-configuration
Vous pouvez le récupérer comme ceci:
kubectl get deploy example -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | jq .
Notez que kubectl create
et kubectl replace
ne conservez PAS cette annotation.
Voir plus d'exemples ici .
Gardez également à l'esprit comment cette approche fonctionne avec les mises à jour d'objets .
Vous pouvez également recourir au traitement direct 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)'
Assurez-vous de supprimer tous les champs de service (par exemple, Helm ajoute beaucoup de choses).
Très probablement kubectl get all
ne fonctionnera pas pour vous. Premièrement, il ne montre pas toutes les ressources.
Voici les règles pour développer l' 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)
De manière confuse, ces informations semblent avoir été supprimées des documents Kubernetes et n'existent que dans des copies archivées, mais elles sont toujours pertinentes.
En outre, cela kubectl get all
vous rendra à la fois des pods et des contrôleurs de déploiement (comme Deployments ou StatefulSets), ce qui n'est pas ce que vous voulez, car dans la plupart des cas, vous ne voulez pas créer vos pods explicitement.