¿Cómo copio todos los recursos a un nuevo espacio de nombres?

Nov 24 2020

Me gustaría crear un nuevo espacio de nombres que sea idéntico al anterior.

Mi enfoque se vería así (comando completo a continuación):

kubectl get <resources> -o json --namespace OLD-NAMESPACE | jq '.items[].metadata.namespace = "NEW-NAMESPACE"' | kubectl create -f  -

Básicamente, esto obtiene todas las definiciones de recursos en formato json, reemplaza el antiguo espacio de nombres con el nuevo y aplica todo.

Desafortunadamente, esto no funciona, ya que las definiciones antiguas contienen elementos específicos del espacio de nombres. Para evitar esto, solía haber una --exportbandera, que ha quedado obsoleta, consulte aquí .

¿Alguna idea de cómo podría hacer esto?

Mando completo:

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  -

Respuestas

3 HarshManvar Nov 24 2020 at 18:56

puedes probar esto

kubectl get all -n OLD_NAMESPACE -o yaml | sed -e 's/namespace: OLD_NAMESPACE/namespace:  NEW_NAMESPACE/' | kubectl apply -f -

esto funcionará

si está utilizando una versión de K8 superior a la 1.14, sed funcionará para reemplazar los espacios de nombres

si kubectl get allno agregamos todos los recursos podemos aplicar como

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

Por ahora no existe una forma establecida de resolver tu tarea.
Hay algunos enfoques comunes que puede probar.
También vea la discusión aquí .


Si se crea un recurso, el kubectl applyyaml aplicado se guardará en una anotación especial.
kubectl.kubernetes.io/last-applied-configuration
Podrías recuperarlo así:

kubectl get deploy example -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | jq .

Tenga en cuenta eso kubectl createy kubectl replaceNO conserve esta anotación.
Vea más ejemplos aquí .
También tenga en cuenta cómo funciona este enfoque con las actualizaciones de objetos .


Alternativamente, puede recurrir al procesamiento directo de 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)'

Asegúrese de eliminar todos los campos de servicio (por ejemplo, Helm agrega muchas cosas).


Lo más probable kubectl get alles que no funcione para usted. Primero, en realidad, no muestra todos los recursos.
Estas son las reglas para expandir el 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)

Confusamente, esta información parece haber sido eliminada de los documentos de Kubernetes y existe solo en copias archivadas, pero sigue siendo relevante.

Además, eso kubectl get allle devolverá tanto los pods como los controladores de implementación (como Deployments o StatefulSets), lo cual no es lo que desea, ya que en la mayoría de las ocasiones no desea crear sus pods explícitamente.