从文件生成密钥后,如何更新Kubernetes上的密钥?


97

我使用创建了一个秘密kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt

如果我想更新值-我该怎么做?

Answers:


241

这应该工作:

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

21
我喜欢将输出巧妙地用于yaml和apply命令。+1
Kevin Mansel

10
在最新版本的k8s中,您需要提供--save-configkubectl create secret以避免CLI警告。
David House

fyi,最近(2019年9月)的语法适用于tls机密:kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -证书采用纯文本格式。
ldg

63

您可以删除并立即重新创建机密:

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

我将这些命令放在脚本中,在第一个调用中,您会收到有关(尚未)存在的机密的警告,但这是可行的。


3
机密删除后,豆荚会怎样?
BrunoJCM

4
@BrunoJCM运行的pod不会受到影响,无论它们是通过env变量获取秘密还是作为卷装入。如果我在没有秘密的情况下启动了pod,那么它们就会出错。因此,Janos的答案是首选方法。
PJMeisch

2
是的,我知道,使用apply更有意义,谢谢!
BrunoJCM '19

这对我不起作用,因为我忘记了--namespace=kube-system
Souradeep Nanda

取决于要向其添加机密的名称空间,如果不是默认值,则必须添加名称空间参数。
PJMeisch

8

另外,您还可以使用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技术上讲它可能不那么优雅或简单,但该方法实际上是在更新值,而不是删除/重新创建它们。您还将需要jqbase64(或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 -

这导致我尝试使用kubectl的“ patch”方法,该方法似乎也有效。

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

感谢Devy提供的最能满足我需求的答案。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.