Kubernetes - การแชร์ความลับข้ามเนมสเปซ


95

มีวิธีแชร์ความลับข้ามเนมสเปซใน Kubernetes หรือไม่

กรณีการใช้งานของฉันคือ: ฉันมีรีจิสตรีส่วนตัวเดียวกันสำหรับเนมสเปซทั้งหมดของฉันและฉันต้องการหลีกเลี่ยงการสร้างความลับเดียวกันสำหรับแต่ละเนมสเปซ

ขอบคุณสำหรับความช่วยเหลือของคุณ.


การแบ่งปันความลับนี้เป็นไปโดยอัตโนมัติ: github.com/zakkg3/ClusterSecret
NicoKowe

คำตอบ:


86

วัตถุ API ลับอยู่ในเนมสเปซ สามารถอ้างอิงได้โดยพ็อดในเนมสเปซเดียวกันเท่านั้น โดยทั่วไปคุณจะต้องสร้างความลับสำหรับทุกเนมสเปซ

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


3
เหมือนกันสำหรับ configmaps kubernetes.io/docs/tasks/configure-pod-container/…
พันธุ์

1
นั่นเป็นคำตอบที่ถูกต้องควรค่าแก่การกล่าวถึงคุณสามารถโคลนไปยังเนมสเปซอื่นโดย kubectl + sed ทั้งหมดในบรรทัดเดียวดูคำตอบของฉันด้านล่าง
NicoKowe


69

สามารถอ้างอิงได้โดยพ็อดในเนมสเปซเดียวกันเท่านั้น แต่คุณสามารถคัดลอกข้อมูลลับจากช่องชื่อหนึ่งไปยังอีกช่องหนึ่งได้ นี่คือตัวอย่างของการคัดลอกข้อมูลlocaldockerregลับจากdefaultเนมสเปซไปที่dev:

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

### UPDATE ### ใน Kubernetes V1.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

1
ใช้งานได้กับฉันในสองเนมสเปซบน v1.13
Kshitij Saraogi

4
อืมเมื่อฉันใช้คำสั่งที่สอง (ไม่มี--exportแฟล็ก) ฉันได้รับข้อผิดพลาดว่า "เนมสเปซจากตัวเลือกที่ให้มาไม่ตรงกัน" kubectl เวอร์ชัน 1.15 ฉันคิดว่าคุณอาจต้องใช้sedหรือบางอย่างในระหว่างสองkubectlคำสั่งนี้เพื่อลบเนมสเปซออกจากเอาต์พุต yaml
Matt Dodge

6
เพื่อความแม่นยำคุณต้องลบเนมสเปซต้นทางออกจาก YAML ระดับกลาง: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps ไม่ได้ทดสอบกับอ็อบเจ็กต์ประเภทอื่น แต่ควรใช้งานได้ pps อย่าลืมลบแหล่งที่มาหากคุณกำลังย้าย
Costa Shapiro

16

คำตอบที่ยอมรับนั้นถูกต้องนี่คือคำใบ้หากคุณต้องการคัดลอกความลับระหว่างเนมสเปซ

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:

ตอนนี้มีวิธีแชร์หรือซิงค์ข้อมูลลับระหว่างเนมสเปซและโดยใช้ตัวดำเนินการ ClusterSecret:

https://github.com/zakkg3/ClusterSecret


6

ความลับคือทรัพยากรที่มีการกำหนดชื่อ แต่คุณสามารถใช้ส่วนขยาย 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 และใบรับรองตัวจัดการใบรับรองเช่นกัน ผู้เปิดเผยข้อมูล: ฉันเป็นผู้เขียนส่วนขยาย Kubernetes Reflector


แอดออนที่ดี ใช้ตอนนี้ ขอบคุณ!
CTiPKA

2

ตามคำตอบของ Innocent Anigbo คุณต้องมีความลับในเนมสเปซเดียวกัน หากคุณต้องการสนับสนุนไดนามิกนั้นหรือหลีกเลี่ยงการลืมการสร้างความลับอาจเป็นไปได้ที่จะสร้างตัวเริ่มต้นสำหรับวัตถุเนมสเปซhttps://kubernetes.io/docs/admin/extensible-admission-controllers/ (ยังไม่ได้ทำด้วยตัวเอง จึงบอกไม่ได้แน่นอน)


1

ปรับปรุงจาก@NicoKowe

ซับหนึ่งเพื่อคัดลอกความลับทั้งหมดจากเนมสเปซหนึ่งไปยังอีกเนมสเปซ

$ 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

ใช้ RBAC เพื่ออนุญาตให้บัญชีบริการใช้ข้อมูลลับบนเนมสเปซดั้งเดิม แต่ไม่แนะนำให้มีความลับร่วมกันระหว่างชื่อ


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

yqเป็นเครื่องมือบรรทัดคำสั่งที่มีประโยชน์สำหรับการแก้ไขไฟล์ YAML ฉันใช้สิ่งนี้ร่วมกับคำตอบอื่น ๆ เพื่อรับสิ่งนี้:

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

0

คุณอาจคิดถึงการใช้Kubernetes External Secrets ของ GoDaddy ! ซึ่งคุณจะจัดเก็บความลับของคุณใน AWS Secret Manager (ASM) และตัวควบคุมความลับของ GoDaddy จะสร้างความลับโดยอัตโนมัติ นอกจากนี้จะมีการซิงค์ระหว่างคลัสเตอร์ ASM และ K8S


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.