Comment copier toutes les ressources dans un nouvel espace de noms?

Nov 24 2020

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

3 HarshManvar Nov 24 2020 at 18:56

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

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 applyyaml 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 createet kubectl replacene 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 allne fonctionnera pas pour vous. Premièrement, il ne montre pas toutes les ressources.
Voici les règles pour développer l' 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)

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