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.

matth3o
sumber
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

Anigbo yang tidak bersalah
sumber
3
Sama untuk configmaps. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly
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 -
Hansika Madushan Weerasena
sumber
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

NicoKowe
sumber
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.

winromulus
sumber
Addon yang bagus. Menggunakannya sekarang. Terima kasih!
CTiPKA
2

Seperti yang dijawab oleh Innocent Anigbo, Anda harus memiliki rahasia di namespace yang sama. Jika Anda perlu mendukung dinamika itu atau menghindari lupa pembuatan rahasia, dimungkinkan untuk membuat penginisialisasi untuk objek namespace https://kubernetes.io/docs/admin/extensible-admission-controllers/ (belum melakukannya sendiri , jadi tidak tahu pasti)

Radek 'Goblin' pieczonka
sumber
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
Halil Kaskavalci
sumber
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 -
Evans Tucker
sumber
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 -

Bruce
sumber
0

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

pengguna128364
sumber
0

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

jmselmi
sumber
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 -;
alextes
sumber
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 -
Reiny
sumber
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.

Thilee
sumber