すべてのリソースを新しい名前空間にコピーするにはどうすればよいですか?

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 createしてkubectl 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、ポッドとデプロイメントコントローラー(DeploymentsやStatefulSetsなど)の両方が返されますが、ほとんどの場合、ポッドを明示的に作成したくないため、これは必要なものではありません。