K8S從secret文件生成密鑰后,如何更新Kubernetes上的密鑰呢?
前提
生成密鑰配置
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key
方法一
相信大多數的人第一反應,是先刪除,再重新創建secret
kubectl delete secret tls-rancher-ingress -n cattle-system
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key
但是此方法存在明顯的問題:在刪除新建secret的空窗期,是存在風險,平時測試或者不大常用的服務還可以嘗試,但是在訪問活躍的情況下,會導致大量的異常請求。
方法二
通過--dry-run參數預覽,然后apply
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key --dry-run -o yaml |kubectl apply -f -
方法二在創建secret的時候,添加了--dry-run的參數,具體使用方法可參考https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands,該參數的主要作用是預覽要發送到集群的對象,而無需真正提交。該方法較方法一更優雅簡單。
方法三
使用jq的=或|=運算符來動態更新密鑰
TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets tls-rancher-ingress -o json \
| jq '.data["tls.key"] |= "$TLS_KEY"' \
| jq '.data["tls.crt"] |= "$TLS_CRT"' \
| kubectl apply -f -
方法三盡管它可能不像kubectl create secret tls --dry-run
方法那樣優雅或簡單,但從技術上講,此方法實際上是在更新值,而不是刪除/重新創建它們。還需要jq和base64(或openssl enc -base64
)命令,tr是一種常用的Linux實用程序,用於修剪尾隨換行符。
K8S從secret文件生成密鑰后,如何更新Kubernetes上的密鑰呢?