Làm cách nào để cập nhật thông tin bí mật trên Kubernetes khi nó được tạo từ một tệp?


96

Tôi đã tạo ra một bí mật bằng cách sử dụng kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Nếu tôi muốn cập nhật các giá trị - tôi có thể thực hiện việc này như thế nào?

Câu trả lời:


241

Điều này sẽ hoạt động:

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

21
Tôi thích việc sử dụng thông minh đầu ra cho yaml và áp dụng lệnh. +1
Kevin Mansel

10
Trong phiên bản mới nhất của k8s, bạn sẽ cần phải cung cấp --save-configcho kubectl create secretđể tránh một cảnh báo CLI.
David House,

Cú pháp fyi, gần đây (tháng 9 năm 2019) phù hợp với bí mật của tls: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -Các chứng chỉ ở dạng văn bản thuần túy.
ldg

63

Bạn có thể xóa và tạo lại ngay bí mật:

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

Tôi đặt các lệnh này trong một tập lệnh, trong lần gọi đầu tiên, bạn sẽ nhận được cảnh báo về bí mật tồn tại (chưa), nhưng điều này hoạt động.


3
điều gì xảy ra với nhóm trong khi bí mật bị xóa?
BrunoJCM 17/02/19

4
Các pod đang chạy @BrunoJCM không bị ảnh hưởng, dù có ướt hơn thì chúng vẫn nhận được bí mật thông qua các biến env hoặc được gắn kết dưới dạng tập. Nếu một nhóm mà tôi đã bắt đầu trong thời gian không có bí mật, chúng sẽ gặp lỗi; do đó câu trả lời của Janos là cách được ưu tiên hơn.
PJMeisch

2
Vâng, tôi thấy, sử dụng applycó ý nghĩa hơn nhiều, cảm ơn!
BrunoJCM 19/02/19

Này đã không được làm việc cho tôi vì tôi quên--namespace=kube-system
Souradeep Nanda

phụ thuộc vào không gian tên mà bạn muốn thêm bí mật vào, nếu không phải là mặc định, tất nhiên bạn phải thêm đối số không gian tên.
PJMeisch

8

Ngoài ra, bạn cũng có thể sử dụng jq's =hoặc |=operator để cập nhật các bí mật một cách nhanh chóng.

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 -

Mặc dù nó có thể không đẹp hoặc đơn giản như kubectl create secret generic --dry-runphương pháp này, nhưng về mặt kỹ thuật, phương pháp này thực sự cập nhật các giá trị hơn là xóa / tạo lại chúng. Bạn cũng sẽ cần jqbase64(hoặc openssl enc -base64) các lệnh có sẵn, trlà một tiện ích Linux thường có sẵn để cắt các dòng mới theo sau.

Xem tại đây để biết thêm chi tiết về jqnhà điều hành cập nhật |=.


1

Vì tôi không thể trả lời câu trả lời của Devy ở trên, câu trả lời mà tôi thích vì nó sẽ bảo toàn Quyền sở hữu trong đó việc xóa và tạo lại có khả năng làm mất bất kỳ thông tin bổ sung nào trong hồ sơ. Tôi thêm điều này cho những người mới hơn, những người có thể không hiểu ngay lập tức khi các biến của họ không bị nội suy.

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 -

Điều này khiến tôi cố gắng sử dụng phương pháp 'vá' của kubectl, phương pháp này dường như cũng hoạt động.

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

Cảm ơn Devy vì câu trả lời đáp ứng tốt nhất nhu cầu của tôi.


0

Đối với các trường hợp cụ thể hơn, bạn có thể cần chỉ định không gian tên của mình mà chứng chỉ cần được gia hạn và xóa chứng chỉ cũ.

**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} ```

0

Tôi đã sử dụng cái này và nó hoạt động như một sự quyến rũ:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

docker-server = https://index.docker.io/v1/ (dành cho DockerHub)

Để biết thêm chi tiết: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.