Kubernetes'teki ad alanları arasında sırları paylaşmanın bir yolu var mı?
Benim kullanım durumum: Tüm ad alanlarım için aynı özel kayıt defterine sahibim ve her biri için aynı sırrı oluşturmaktan kaçınmak istiyorum.
Yardımınız için teşekkürler.
Kubernetes'teki ad alanları arasında sırları paylaşmanın bir yolu var mı?
Benim kullanım durumum: Tüm ad alanlarım için aynı özel kayıt defterine sahibim ve her biri için aynı sırrı oluşturmaktan kaçınmak istiyorum.
Yardımınız için teşekkürler.
Yanıtlar:
Gizli API nesneleri bir ad alanında bulunur. Bunlara yalnızca aynı ad alanındaki kapsüller tarafından başvurulabilir. Temel olarak, her ad alanı için sırrı oluşturmanız gerekecektir.
https://kubernetes.io/docs/concepts/configuration/secret/#details
Bunlara yalnızca aynı ad alanındaki kapsüller tarafından başvurulabilir. Ancak sırrı bir ad alanından diğerine kopyalayabilirsiniz. Ad alanından localdockerregsırrı şu adrese kopyalamanın bir örneği :defaultdev
kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -
### GÜNCELLEME ### Kubernetes v1.14'te --exportbayrak kullanımdan kaldırılmıştır . Bu nedenle, aşağıdaki -oyamlbayraklı Komut , gelecek sürümlerde uyarı vermeden çalışacaktır.
kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -
veya kaynak ad alanı mutlaka varsayılan değilse aşağıda
kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -
--exportbayrak yok ) "sağlanan seçenekteki ad alanı eşleşmiyor" şeklinde bir hata alıyorum. kubectl sürüm 1.15. Çıktı yaml'den ad alanını kaldırmak için sedbu iki kubectlkomut arasında bir şey kullanmanız gerekebileceğini düşünüyorum
$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps, diğer nesne türleriyle test edilmemiştir, ancak çalışmanız gerekiyorsa pps, taşıyorsanız kaynağı silmeyi unutmayın
Kabul edilen cevap doğru, burada sırrı ad alanları arasında kopyalamak istiyorsanız bir ipucu.
kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -
/ Nisan 2020'yi düzenle:
Artık, sırları ad alanları arasında ve bunun ClusterSecret operatörünü kullanarak paylaşmanın veya senkronize etmenin bir yolu var:
Gizli diziler ad alanlı kaynaklardır, ancak bunları çoğaltmak için bir Kubernetes uzantısı kullanabilirsiniz. Bunu, gizli dizilerde saklanan kimlik bilgilerini veya sertifikaları tüm ad alanlarına otomatik olarak yaymak ve senkronize halde tutmak için kullanırız (kaynağı değiştirin ve tüm kopyalar güncellenir). Kubernetes Reflector'a bakın ( https://github.com/EmberStack/kubernetes-reflector ).
Uzantı, ek açıklamalar aracılığıyla ad alanları arasında bir sırrı otomatik olarak kopyalamanıza ve senkronize etmenize olanak tanır:
Kaynak sırrına ek açıklamaları ekleyin:
annotations:
reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
Bu, tüm ad alanlarında sırrın bir kopyasını oluşturacaktır. Bir kopyanın oluşturulduğu ad alanlarını aşağıdakileri kullanarak sınırlayabilirsiniz:
reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"
Uzantı, ConfigMaps ve sertifika yöneticisi sertifikalarını da destekler. Sorumluluk Sahibi: Kubernetes Reflector uzantısının yazarıyım.
Masum Anigbo'nun yanıtladığı gibi, sırrı aynı ad alanında bulundurmanız gerekir. Bu dinamikliği desteklemeniz veya gizli oluşturmayı unutmaktan kaçınmanız gerekiyorsa, https://kubernetes.io/docs/admin/extensible-admission-controllers/ ad alanı nesnesi için bir başlatıcı oluşturmak mümkün olabilir (bunu kendi başıma yapmadım) , bu yüzden kesin olarak söyleyemem)
@NicoKowe'den iyileştirme
Tüm sırları bir ad alanından diğerine kopyalamak için tek satır
$ 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
--export kullanımdan kaldırıldı
sed YAML veya JSON'u düzenlemek için uygun bir araç değildir.
Ad jqalanını ve istemediğimiz diğer meta verileri silmek için kullanılan bir örnek :
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'ın cevabına göre, ancak yalnızca istediğimizi korumak için jq filtresinde silme yerine beyaz listeyi kullanıyor.
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 -
Esasen aynı şey ama etiketleri koruyor.
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 gizli gitlab-kayıt defteri --namespace = revsys-com - dışa aktar -o yaml | \ kubectl başvur --namespace = devspectrum-dev -f -
GoDaddy'nin Kubernetes Harici Sırlarını kullanmayı da düşünebilirsiniz ! sırlarınızı AWS Secret Manager'da (ASM) depolayacağınız ve GoDaddy'nin gizli denetleyicisi sırları otomatik olarak oluşturacaktır. Dahası, ASM ve K8S kümesi arasında senkronizasyon olacaktır.
Diğer bir seçenek de Jetstack'te bize sertifika yöneticisi veren türden kişiler tarafından tavsiye edildiği gibi kubed kullanmak olabilir . İşte bağlantı verdikleri şey.