모든 리소스를 새 네임 스페이스에 복사하려면 어떻게합니까?

Nov 24 2020

이전 네임 스페이스와 동일한 새 네임 스페이스를 만들고 싶습니다.

내 접근 방식은 다음과 같습니다 (아래 전체 명령).

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

이것은 기본적으로 json 형식의 모든 리소스 정의를 가져오고 이전 네임 스페이스를 새 네임 스페이스로 대체하고 모든 것을 적용합니다.

안타깝게도 이전 정의에는 네임 스페이스 관련 항목이 포함되어 있으므로 작동하지 않습니다. 이를 방지하기 위해 사용 --export되지 않는 플래그가있었습니다 . 여기를 참조하십시오 .

내가 어떻게 할 수 있는지 어떤 아이디어?

전체 명령 :

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  -

답변

3 HarshManvar Nov 24 2020 at 18:56

당신은 이것을 시도 할 수 있습니다

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

이것은 작동 할 것이다

1.14보다 높은 K8s 버전을 사용하는 경우 sed 가 네임 스페이스를 대체합니다.

경우 kubectl get all모든 리소스를 추가하지 우리는 같은 적용 할 수 있습니다

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

현재로서는 작업을 해결할 수있는 확실한 방법이 없습니다.
시도 할 수있는 몇 가지 일반적인 접근 방식이 있습니다. 여기에서
토론을 참조 하십시오 .


리소스가 생성 kubectl apply되면 적용된 yaml은 특수 주석에 저장됩니다.
kubectl.kubernetes.io/last-applied-configuration
다음과 같이 검색 할 수 있습니다.

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

kubectl createkubectl replace이 주석을 유지하지 않습니다. 여기에서
더 많은 예를 참조 하십시오 .
또한이 접근 방식이 객체 업데이트와 함께 작동 하는 방식을 염두에 두십시오 .


또는 직접 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)'

모든 서비스 필드를 삭제해야합니다 (예 : Helm은 많은 항목을 추가 함).


아마도 kubectl get all당신을 위해 작동하지 않을 것 입니다. 먼저 실제로 모든 리소스를 표시하지는 않습니다 . 별칭 확장 규칙
은 다음과 같습니다 .all

 - 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)

혼란스럽게도이 정보는 kubernetes 문서에서 삭제 된 것으로 보이며 보관 된 사본에만 존재하지만 여전히 관련이 있습니다.

게다가 kubectl get all대부분의 경우 pod를 명시 적으로 생성하고 싶지 않기 때문에 원하는 것이 아닌 Pod 및 배포 컨트롤러 (예 : Deployments 또는 StatefulSets)를 모두 반환합니다.