Kubernetesの名前空間間でシークレットを共有する方法はありますか?
私のユースケースは次のとおりです。すべての名前空間に同じプライベートレジストリがあり、それぞれに同じシークレットを作成することは避けたいです。
ご協力いただきありがとうございます。
回答:
シークレットAPIオブジェクトは名前空間に存在します。それらは、同じ名前空間内のポッドによってのみ参照できます。基本的に、すべての名前空間のシークレットを作成する必要があります。
https://kubernetes.io/docs/concepts/configuration/secret/#details
それらは、同じ名前空間内のポッドによってのみ参照できます。ただし、ある名前空間から別の名前空間にシークレットをコピーするだけで済みます。これは、名前空間から次の場所にlocaldockerreg
シークレットをコピーする例です。default
dev
kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -
### UPDATE ### Kubernetesv1.14では--export
フラグは非推奨になりました。したがって、次の-oyaml
フラグ付きコマンドは、今後のバージョンで警告なしに機能します。
kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -
ソース名前空間が必ずしもデフォルトではない場合は以下
kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -
--export
フラグなし)を使用すると、「指定されたオプションの名前空間が一致しません」というエラーが表示されます。kubectlバージョン1.15。私はあなたが使用する必要があるかもしれないと思うsed
それら二つの間にあるか何かkubectl
出力YAMLから名前空間を削除するには、コマンド
$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f -
は他のオブジェクトタイプではテストされていませんが、動作するはずです。移動する場合は、ソースを削除することを忘れないでください
受け入れられた答えは正しいです。名前空間間で秘密をコピーしようとしている場合のヒントは次のとおりです。
kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -
/ 2020年4月編集:
ClusterSecret演算子を使用して、名前空間とその名前空間間でシークレットを共有または同期する方法があります。
シークレットは名前空間付きのリソースですが、Kubernetes拡張機能を使用してシークレットを複製できます。これを使用して、シークレットに格納されている資格情報または証明書をすべての名前空間に自動的に伝播し、同期を維持します(ソースを変更すると、すべてのコピーが更新されます)。Kubernetes Reflector(https://github.com/EmberStack/kubernetes-reflector)を参照してください。
この拡張機能を使用すると、アノテーションを介して名前空間間でシークレットを自動的にコピーして同期を保つことができます。
ソースシークレットに注釈を追加します。
annotations:
reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
これにより、すべての名前空間にシークレットのコピーが作成されます。以下を使用して、コピーが作成される名前空間を制限できます。
reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"
この拡張機能は、ConfigMapsおよびcert-manager証明書もサポートします。免責事項:私はKubernetesReflector拡張機能の作成者です。
Innocent Anigboが回答したように、同じ名前空間にシークレットが必要です。これを動的にサポートする必要がある場合、またはシークレットの作成を忘れないようにする必要がある場合は、名前空間オブジェクトhttps://kubernetes.io/docs/admin/extensible-admission-controllers/のイニシャライザーを作成できる可能性があります(自分で作成したことはありません)。 、確かにわかりません)
@NicoKoweからの改善
ある名前空間から別の名前空間にすべての秘密をコピーするための1つのライナー
$ for i in `kubectl get secrets | awk '{print $1}'`; do kubectl get secret $1 -n <source-namespace> -o yaml | sed s/"namespace: <source-namespace>"/"namespace: <target-namespace>"/ | kubectl apply -n <target-namespace> -f - ; done
@Evans Tuckerの回答に基づいていますが、jqフィルター内で削除するのではなくホワイトリストを使用して、必要なものだけを保持しています。
kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name"}' | kubectl apply -n rest-of-world -f -
基本的に同じことですが、ラベルは保持されます。
kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name", "labels"}' | kubectl apply -n rest-of-world -f -
kubectl get secret gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f-
GoDaddyのKubernetes外部シークレットの使用を検討することもできます。AWSシークレットマネージャー(ASM)にシークレットを保存すると、GoDaddyのシークレットコントローラーがシークレットを自動的に作成します。さらに、ASMとK8Sクラスター間で同期が行われます。
別のオプションは、私たちにcert-managerを与えてくれたJetstackの親切な人々によって推奨されているように、kubedを使用することです。これが彼らがリンクしているものです。