Kubernetes - berbagi rahasia di seluruh namespace


96

Apakah ada cara untuk membagikan rahasia di seluruh namespace di Kubernetes?

Kasus penggunaan saya adalah: Saya memiliki registri pribadi yang sama untuk semua ruang nama saya dan saya ingin menghindari membuat rahasia yang sama untuk masing-masing.

Terima kasih atas bantuan Anda.


ini mengotomatiskan berbagi rahasia: github.com/zakkg3/ClusterSecret
NicoKowe

Jawaban:


87

Objek API Rahasia berada di namespace. Mereka hanya bisa direferensikan oleh pod dalam namespace yang sama. Pada dasarnya, Anda harus membuat rahasia untuk setiap namespace.

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



1
Itu jawaban yang benar, patut disebutkan Anda dapat mengkloning ke namespace lain dengan kubectl + sed, semuanya dalam satu baris, lihat jawaban saya di bawah ini.
NicoKowe


69

Mereka hanya bisa direferensikan oleh pod dalam namespace yang sama. Tapi Anda bisa menyalin rahasia dari satu ruang nama ke ruang lain. Berikut adalah contoh menyalin localdockerregrahasia dari defaultnamespace ke dev:

 kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -

### UPDATE ### Di Kubernetes v1.14, --exportflag sudah tidak digunakan lagi . Jadi, Perintah berikut dengan -oyamlbendera akan berfungsi tanpa peringatan di versi yang akan datang.

kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -

atau di bawah jika namespace sumber belum tentu default

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -

1
Ini tidak akan berfungsi jika rahasia yang Anda ekspor tidak ada di namespace default
gerasalus

1
Berfungsi untuk saya di dua namespace di v1.13
Kshitij Saraogi

4
Hmm ketika saya menggunakan perintah kedua (tidak ada --exportbendera) saya mendapatkan kesalahan yang mengatakan "ruang nama dari opsi yang diberikan tidak cocok". kubectl versi 1.15. Saya pikir Anda mungkin perlu menggunakan sedatau sesuatu di antara dua kubectlperintah tersebut untuk menghapus namespace dari output yaml
Matt Dodge

6
Tepatnya, Anda perlu menghapus namespace sumber dari YAML perantara: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps yang tidak diuji dengan tipe objek lain, tetapi harus bekerja pps jangan lupa untuk menghapus sumber jika Anda pindah
Costa Shapiro

16

Jawaban yang diterima benar, berikut adalah petunjuk jika Anda ingin menyalin rahasia antar namespace.

kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -

/ edit apr 2020:

Sekarang ada cara untuk membagikan atau menyinkronkan rahasia di seluruh namespace dan dengan menggunakan operator ClusterSecret:

https://github.com/zakkg3/ClusterSecret


6

Rahasia adalah resource dengan namespace, tetapi Anda dapat menggunakan ekstensi Kubernetes untuk mereplikasi mereka. Kami menggunakan ini untuk menyebarkan kredensial atau sertifikat yang disimpan dalam rahasia ke semua ruang nama secara otomatis dan menjaganya tetap sinkron (ubah sumber dan semua salinan diperbarui). Lihat Kubernetes Reflector ( https://github.com/EmberStack/kubernetes-reflector ).

Ekstensi ini memungkinkan Anda menyalin dan menyinkronkan rahasia di seluruh ruang nama secara otomatis melalui anotasi:

Pada rahasia sumber tambahkan anotasi:

 annotations:
   reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"

Ini akan membuat salinan rahasia di semua ruang nama. Anda dapat membatasi ruang nama tempat salinan dibuat menggunakan:

reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"

Ekstensi ini mendukung ConfigMaps dan sertifikat pengelola sertifikat juga. Pengungkapan: Saya adalah penulis ekstensi Kubernetes Reflector.


Addon yang bagus. Menggunakannya sekarang. Terima kasih!
CTiPKA


1

Meningkatkan dari @NicoKowe

Satu liner untuk menyalin semua rahasia dari satu namespace ke yang lain

$ 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 sudah ditinggalkan

sed bukanlah alat yang sesuai untuk mengedit YAML atau JSON.

Berikut adalah contoh yang digunakan jquntuk menghapus namespace dan metadata lain yang tidak kita inginkan:

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

Berdasarkan jawaban @Evans Tucker tetapi menggunakan daftar putih daripada penghapusan dalam filter jq untuk hanya menyimpan apa yang kita inginkan.

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 -

Pada dasarnya sama tetapi mempertahankan label.

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 dapatkan rahasia gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -


0

Gunakan RBAC untuk mengotorisasi serviceaccoun untuk menggunakan rahasia pada namespace asli. Tapi, ini tidak disarankan untuk memiliki rahasia bersama antar namesapces.


0

Solusi untuk menyalin semua rahasia.

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

yqadalah alat baris perintah yang berguna untuk mengedit file YAML. Saya menggunakan ini bersama dengan jawaban lain untuk mendapatkan ini:

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

0

Anda mungkin juga berpikir untuk menggunakan Rahasia Eksternal Kubernetes GoDaddy ! tempat Anda akan menyimpan rahasia Anda di AWS Secret Manager (ASM) dan pengontrol rahasia GoDaddy akan membuat rahasia secara otomatis. Selain itu, akan ada sinkronisasi antara cluster ASM dan K8S.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.