¿Cómo copio todos los recursos a un nuevo espacio de nombres?
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
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 -
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.