ฉันจะอัปเดตความลับบน Kubernetes ได้อย่างไรเมื่อสร้างจากไฟล์


คำตอบ:


274

สิ่งนี้ควรใช้งานได้:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -

24
ฉันชอบการใช้เอาท์พุตอย่างชาญฉลาดกับ yaml และใช้คำสั่ง +1
Kevin Mansel

12
ในรุ่นล่าสุดของ k8s คุณจะต้องให้--save-configไปkubectl create secretเพื่อหลีกเลี่ยงการเตือน CLI
David House

fyi ไวยากรณ์ล่าสุด (กันยายน 2019) ที่ใช้กับ tls secret: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -ใบรับรองอยู่ในรูปแบบข้อความธรรมดา
ldg

1
ต้องใช้--dry-run=clientกับ kubectl 1.18 ขึ้นไป
RichVel

67

คุณสามารถลบและสร้างความลับใหม่ได้ทันที:

kubectl delete secret production-tls
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt

ฉันใส่คำสั่งเหล่านี้ในสคริปต์ในการโทรครั้งแรกคุณจะได้รับคำเตือนเกี่ยวกับความลับที่มีอยู่ (ยังไม่มี) แต่ใช้งานได้


3
จะเกิดอะไรขึ้นกับพ็อดในขณะที่ความลับถูกลบ
BrunoJCM

4
@BrunoJCM รันพ็อดจะไม่ได้รับผลกระทบไม่ว่าพวกเขาจะได้รับความลับผ่านตัวแปร env หรือเมาท์เป็นโวลุ่ม หากพ็อดที่ฉันเริ่มต้นในช่วงเวลาที่ไม่มีความลับพวกเขาพบข้อผิดพลาด ดังนั้นคำตอบของ Janos จึงเป็นวิธีที่ดีที่สุด
PJMeisch

2
ใช่ฉันเห็นว่าการใช้applyมันสมเหตุสมผลกว่ามากขอบคุณ!
BrunoJCM

สิ่งนี้ใช้ไม่ได้สำหรับฉันเพราะฉันลืม--namespace=kube-system
Souradeep Nanda

1
ขึ้นอยู่กับเนมสเปซที่คุณต้องการเพิ่มความลับถ้าไม่ใช่ค่าเริ่มต้นแน่นอนคุณต้องเพิ่มอาร์กิวเมนต์เนมสเปซ
PJMeisch

9

หรือคุณยังสามารถใช้jq' =หรือ|=โอเปอเรเตอร์เพื่ออัปเดตความลับได้ทันที

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq '.data["tls.key"] |= "$TLS_KEY"' \
        | jq '.data["tls.crt"] |= "$TLS_CRT"' \
        | kubectl apply -f -

แม้ว่าวิธีนี้อาจจะไม่สวยหรูหรือเรียบง่ายเหมือนkubectl create secret generic --dry-runวิธีการ แต่ในทางเทคนิคแล้ววิธีนี้เป็นการอัปเดตค่าอย่างแท้จริงแทนที่จะลบ / สร้างใหม่ คุณจะต้องมีjqและbase64(หรือopenssl enc -base64) คำสั่งที่พร้อมใช้งานซึ่งtrเป็นยูทิลิตี้ Linux ที่มีอยู่ทั่วไปสำหรับการตัดแต่งบรรทัดใหม่

ดู ที่นี่สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการดำเนินการปรับปรุงjq|=


1

เนื่องจากฉันไม่สามารถตอบกลับคำตอบของ Devy ข้างต้นได้ซึ่งฉันชอบเพราะมันจะรักษาความเป็นเจ้าของไว้ซึ่งการลบและสร้างใหม่มีโอกาสที่จะสูญเสียข้อมูลเพิ่มเติมใด ๆ ในบันทึก ฉันกำลังเพิ่มสิ่งนี้สำหรับผู้คนใหม่ ๆ ที่อาจไม่เข้าใจในทันทีว่าตัวแปรของพวกเขาไม่ได้รับการแก้ไข

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq ".data[\"tls.key\"] |= \"$TLS_KEY\"" \
        | jq ".data[\"tls.crt\"] |= \"$TLS_CRT\"" \
        | kubectl apply -f -

สิ่งนี้ทำให้ฉันพยายามใช้วิธี 'patch' ของ kubectl ซึ่งดูเหมือนจะได้ผลเช่นกัน

kubectl \
        patch \
        secret \
        production-tls \
        -p "{\"data\":{\"tls.key\":\"${TLS_KEY}\",\"tls.crt\":\"${TLS_CRT}\"}}"

ขอบคุณ Devy สำหรับคำตอบที่ตรงกับความต้องการของฉันมากที่สุด


1

เพื่อขยายคำตอบเหล่านี้ฉันพบว่าการเพิ่ม '--ignore-not-found' ในการลบช่วยให้ CICD ของเราไม่ผิดพลาดหากไม่มีความลับก็จะดำเนินการต่อและสร้าง:

kubectl delete secret production-tls --ignore-not-found
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

0

สำหรับกรณีที่เฉพาะเจาะจงมากขึ้นคุณอาจต้องระบุเนมสเปซของคุณที่จะต้องต่ออายุใบรับรองและลบใบรับรองเก่า

**For deletion of the cert **
kubectl delete secret -n `namespace`

**For creation of new cert to specific namespace **
kubectl create secret {your-cert-name} --key /etc/certs/{name}.com.key --cert /etc/certs/{name}.com.crt -n {namespace} ```
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.