Kubernetes-名前空間間でシークレットを共有する


100

Kubernetesの名前空間間でシークレットを共有する方法はありますか?

私のユースケースは次のとおりです。すべての名前空間に同じプライベートレジストリがあり、それぞれに同じシークレットを作成することは避けたいです。

ご協力いただきありがとうございます。


:これは秘密共有自動化 github.com/zakkg3/ClusterSecret
NicoKowe

回答:


93

シークレットAPIオブジェクトは名前空間に存在します。それらは、同じ名前空間内のポッドによってのみ参照できます。基本的に、すべての名前空間のシークレットを作成する必要があります。

https://kubernetes.io/docs/concepts/configuration/secret/#details


4
configmapsについても同じです。kubernetes.io/docs/tasks/configure-pod-container/...
Breedly

1
これは正解です。kubectl+ sedを使用して、別の名前空間にすべて1行で複製できます。以下の私の答えを参照してください。
NicoKowe

75

それらは、同じ名前空間内のポッドによってのみ参照できます。ただし、ある名前空間から別の名前空間にシークレットをコピーするだけで済みます。これは、名前空間から次の場所にlocaldockerregシークレットをコピーする例です。defaultdev

 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 -

1
エクスポート元のシークレットがデフォルトの名前空間にない場合、これは機能しません
gerasalus 2013

1
v1.13の任意の2つの名前空間で機能します
KshitijSaraogi19年

4
うーん、2番目のコマンド(--exportフラグなし)を使用すると、「指定されたオプションの名前空間が一致しません」というエラーが表示されます。kubectlバージョン1.15。私はあなたが使用する必要があるかもしれないと思うsedそれら二つの間にあるか何かkubectl出力YAMLから名前空間を削除するには、コマンド
マット・ダッジ

6
正確には、中間YAMLからソース名前空間を削除する必要があります。ps$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - は他のオブジェクトタイプではテストされていませんが、動作するはずです。移動する場合は、ソースを削除することを忘れないでください
Costa Shapiro

クラスタ間kubectlの使用状況と作品、および変更コンテキストの場合
ヴィンセントGerris

17

受け入れられた答えは正しいです。名前空間間で秘密をコピーしようとしている場合のヒントは次のとおりです。

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演算子を使用して、名前空間とその名前空間間でシークレットを共有または同期する方法があります。

https://github.com/zakkg3/ClusterSecret


7

シークレットは名前空間付きのリソースですが、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拡張機能の作成者です。


素敵なアドオン。今それを使用しています。ありがとう!
CTiPKA

2

Innocent Anigboが回答したように、同じ名前空間にシークレットが必要です。これを動的にサポートする必要がある場合、またはシークレットの作成を忘れないようにする必要がある場合は、名前空間オブジェクトhttps://kubernetes.io/docs/admin/extensible-admission-controllers/のイニシャライザーを作成できる可能性があります(自分で作成したことはありません)。 、確かにわかりません)


1

@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

1

--export 非推奨です

sed YAMLまたはJSONを編集するための適切なツールではありません。

jq不要な名前空間やその他のメタデータを削除するために使用する例を次に示します。

kubectl get secret cure-for-covid-19 -n china -o json | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n rest-of-world -f -

1

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


0

kubectl get secret gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f-


0

RBACを使用して、serviceaccounが元の名前空間でシークレットを使用することを承認します。ただし、namesapces間で秘密を共有することはお勧めしません。


0

すべての秘密をコピーするためのソリューション。

kubectl delete secret --namespace $TARGET_NAMESPACE--all;
kubectl get secret --namespace default --output yaml \
    | sed "s/namespace: $SOURCE_NAMESPACE/namespace: $TARGET_NAMESPACE/" \
    | kubectl apply --namespace $TARGET_NAMESPACE --filename -;

0

yqYAMLファイルを編集するための便利なコマンドラインツールです。私はこれを他の答えと組み合わせて利用してこれを取得しました:

kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -

0

GoDaddyのKubernetes外部シークレットの使用を検討することもできます。AWSシークレットマネージャー(ASM)にシークレットを保存すると、GoDaddyのシークレットコントローラーがシークレットを自動的に作成します。さらに、ASMとK8Sクラスター間で同期が行われます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.