Como copio todos os recursos para um novo namespace?
Gostaria de criar um novo namespace idêntico ao antigo.
Minha abordagem seria mais ou menos assim (comando completo abaixo):
kubectl get <resources> -o json --namespace OLD-NAMESPACE | jq '.items[].metadata.namespace = "NEW-NAMESPACE"' | kubectl create -f -
Isso basicamente obtém todas as definições de recursos em um formato json, substitui o namespace antigo pelo novo e aplica tudo.
Infelizmente, isso não funciona, pois as definições antigas contêm coisas específicas de namespace. Para evitar isso, costumava haver um --export
sinalizador, que foi descontinuado, consulte aqui .
Alguma ideia de como eu poderia fazer isso?
Comando 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 -
Respostas
você pode tentar isso
kubectl get all -n OLD_NAMESPACE -o yaml | sed -e 's/namespace: OLD_NAMESPACE/namespace: NEW_NAMESPACE/' | kubectl apply -f -
isso vai funcionar
se você estiver usando uma versão superior do K8s acima de 1.14, o sed irá substituir os namespaces
se kubectl get all
não adicionar todos os 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 enquanto, não existe uma maneira estabelecida de resolver sua tarefa.
Existem algumas abordagens comuns que você pode tentar.
Veja também a discussão aqui .
Se um recurso for criado pelo kubectl apply
yaml aplicado, será salvo em uma anotação especial.
kubectl.kubernetes.io/last-applied-configuration
Você pode recuperá-lo assim:
kubectl get deploy example -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | jq .
Observe isso kubectl create
e kubectl replace
NÃO guarde esta anotação.
Veja mais exemplos aqui .
Além disso, lembre-se de como essa abordagem funciona com atualizações de objetos .
Alternativamente, você pode recorrer ao processamento json / yaml direto.
kubectl get deploy example -ojson | \ice
jq 'del(.metadata.creationTimestamp, .metadata.managedFields, \
.metadata.namespace, .metadata.ownerReferences, \
.metadata.resourceVersion, .metadata.selfLink, \
.metadata.uid, .status)'
Certifique-se de excluir todos os campos de serviço (por exemplo, o Helm adiciona muitas coisas).
Provavelmente kubectl get all
não funcionará para você. Primeiro, na verdade, não mostra todos os recursos.
Aqui estão as regras para expandir o 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)
Surpreendentemente, essa informação parece ter sido excluída dos documentos do Kubernetes e existe apenas em cópias arquivadas, mas ainda é relevante.
Além disso kubectl get all
, você retornará pods e controladores de implantação (como Deployments ou StatefulSets), o que não é o que você deseja, pois na maioria das vezes você não deseja criar pods explicitamente.