มีวิธีแชร์ความลับข้ามเนมสเปซใน Kubernetes หรือไม่
กรณีการใช้งานของฉันคือ: ฉันมีรีจิสตรีส่วนตัวเดียวกันสำหรับเนมสเปซทั้งหมดของฉันและฉันต้องการหลีกเลี่ยงการสร้างความลับเดียวกันสำหรับแต่ละเนมสเปซ
ขอบคุณสำหรับความช่วยเหลือของคุณ.
มีวิธีแชร์ความลับข้ามเนมสเปซใน Kubernetes หรือไม่
กรณีการใช้งานของฉันคือ: ฉันมีรีจิสตรีส่วนตัวเดียวกันสำหรับเนมสเปซทั้งหมดของฉันและฉันต้องการหลีกเลี่ยงการสร้างความลับเดียวกันสำหรับแต่ละเนมสเปซ
ขอบคุณสำหรับความช่วยเหลือของคุณ.
คำตอบ:
วัตถุ API ลับอยู่ในเนมสเปซ สามารถอ้างอิงได้โดยพ็อดในเนมสเปซเดียวกันเท่านั้น โดยทั่วไปคุณจะต้องสร้างความลับสำหรับทุกเนมสเปซ
https://kubernetes.io/docs/concepts/configuration/secret/#details
สามารถอ้างอิงได้โดยพ็อดในเนมสเปซเดียวกันเท่านั้น แต่คุณสามารถคัดลอกข้อมูลลับจากช่องชื่อหนึ่งไปยังอีกช่องหนึ่งได้ นี่คือตัวอย่างของการคัดลอกข้อมูล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 -
--export
แฟล็ก) ฉันได้รับข้อผิดพลาดว่า "เนมสเปซจากตัวเลือกที่ให้มาไม่ตรงกัน" kubectl เวอร์ชัน 1.15 ฉันคิดว่าคุณอาจต้องใช้sed
หรือบางอย่างในระหว่างสองkubectl
คำสั่งนี้เพื่อลบเนมสเปซออกจากเอาต์พุต yaml
$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f -
ps ไม่ได้ทดสอบกับอ็อบเจ็กต์ประเภทอื่น แต่ควรใช้งานได้ pps อย่าลืมลบแหล่งที่มาหากคุณกำลังย้าย
คำตอบที่ยอมรับนั้นถูกต้องนี่คือคำใบ้หากคุณต้องการคัดลอกความลับระหว่างเนมสเปซ
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:
ความลับคือทรัพยากรที่มีการกำหนดชื่อ แต่คุณสามารถใช้ส่วนขยาย 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
ตามคำตอบของ Innocent Anigbo คุณต้องมีความลับในเนมสเปซเดียวกัน หากคุณต้องการสนับสนุนไดนามิกนั้นหรือหลีกเลี่ยงการลืมการสร้างความลับอาจเป็นไปได้ที่จะสร้างตัวเริ่มต้นสำหรับวัตถุเนมสเปซhttps://kubernetes.io/docs/admin/extensible-admission-controllers/ (ยังไม่ได้ทำด้วยตัวเอง จึงบอกไม่ได้แน่นอน)
ปรับปรุงจาก@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
--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 -
ตามคำตอบของ @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 -
kubectl รับ gitlab-Registry ลับ --namespace = revsys-com - ส่งออก -o yaml | \ kubectl ใช้ --namespace = devspectrum-dev -f -
ใช้ RBAC เพื่ออนุญาตให้บัญชีบริการใช้ข้อมูลลับบนเนมสเปซดั้งเดิม แต่ไม่แนะนำให้มีความลับร่วมกันระหว่างชื่อ
วิธีการคัดลอกความลับทั้งหมด
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 -;
yq
เป็นเครื่องมือบรรทัดคำสั่งที่มีประโยชน์สำหรับการแก้ไขไฟล์ YAML ฉันใช้สิ่งนี้ร่วมกับคำตอบอื่น ๆ เพื่อรับสิ่งนี้:
kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -
คุณอาจคิดถึงการใช้Kubernetes External Secrets ของ GoDaddy ! ซึ่งคุณจะจัดเก็บความลับของคุณใน AWS Secret Manager (ASM) และตัวควบคุมความลับของ GoDaddy จะสร้างความลับโดยอัตโนมัติ นอกจากนี้จะมีการซิงค์ระหว่างคลัสเตอร์ ASM และ K8S
อีกทางเลือกหนึ่งคือการใช้ kubedตามคำแนะนำของคนใจดีที่ Jetstack ที่ให้ใบรับรองแก่เรา นี่คือสิ่งที่พวกเขาเชื่อมโยงไป