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.
namespaces
kubernetes
matth3o
sumber
sumber
Jawaban:
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
sumber
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
localdockerreg
rahasia daridefault
namespace kedev
:kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -
### UPDATE ### Di Kubernetes v1.14,
--export
flag sudah tidak digunakan lagi . Jadi, Perintah berikut dengan-oyaml
bendera 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 -
sumber
--export
bendera) saya mendapatkan kesalahan yang mengatakan "ruang nama dari opsi yang diberikan tidak cocok". kubectl versi 1.15. Saya pikir Anda mungkin perlu menggunakansed
atau sesuatu di antara duakubectl
perintah tersebut untuk menghapus namespace dari output yaml$ 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 pindahJawaban 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
sumber
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.
sumber
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)
sumber
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
sumber
--export
sudah ditinggalkansed
bukanlah alat yang sesuai untuk mengedit YAML atau JSON.Berikut adalah contoh yang digunakan
jq
untuk 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 -
sumber
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 -
sumber
kubectl dapatkan rahasia gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -
sumber
Gunakan RBAC untuk mengotorisasi serviceaccoun untuk menggunakan rahasia pada namespace asli. Tapi, ini tidak disarankan untuk memiliki rahasia bersama antar namesapces.
sumber
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 -;
sumber
yq
adalah 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 -
sumber
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.
sumber
Pilihan lain adalah menggunakan kubed , seperti yang direkomendasikan oleh orang-orang baik di Jetstack yang memberi kami manajer-sertifikat. Inilah yang mereka tautkan.
sumber