Como copio todos os recursos para um novo namespace?

Nov 24 2020

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

3 HarshManvar Nov 24 2020 at 18:56

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

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 applyyaml 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 createe kubectl replaceNÃ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 allnão funcionará para você. Primeiro, na verdade, não mostra todos os recursos.
Aqui estão as regras para expandir o 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)

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.