如何从文件生成Kubernetes时更新秘密?

Chr*_*ski 64 kubernetes kubectl

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

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

Jan*_*art 167

这应该工作:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢巧妙地使用输出到yaml和apply命令.+1 (17认同)
  • 在最新版本的k8s中,您需要向“ kubectl create secret”提供“ --save-config”以避免CLI警告。 (6认同)
  • 仅供参考,最近(2019 年 9 月)适用于 tls Secret 的语法:```kubectl create Secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt - -dry-run -o yaml | - 干运行 -o yaml | kubectl apply -f -``` 证书是纯文本形式的。 (4认同)
  • 需要在 kubectl 1.18 或更高版本中使用 `--dry-run=client`。 (4认同)
  • @Froxz,Secret 中的值未加密;它们只是经过 Base64 编码。使用此命令不会改变安全性。 (2认同)

P.J*_*sch 46

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

kubectl delete secret production-tls
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt
Run Code Online (Sandbox Code Playgroud)

我把这些命令放在一个脚本中,在第一次调用时你得到一个关于(尚未)存在的秘密的警告,但这是有效的.

  • 删除机密后 pod 会发生什么? (3认同)
  • @BrunoJCM运行的pod不受影响,无论它们是通过env变量获取秘密还是作为卷安装。如果我在没有秘密的情况下启动了pod,那么它们就会出错。因此,Janos的答案是首选方法。 (3认同)
  • 是的,我明白了,使用 `apply` 更有意义,谢谢! (2认同)
  • 取决于您要将机密添加到哪个名称空间,如果不是 _default_,当然您必须添加名称空间参数。 (2认同)

Dev*_*evy 6

另外,您还可以使用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 -
Run Code Online (Sandbox Code Playgroud)

尽管从kubectl create secret generic --dry-run技术上讲它可能不那么优雅或简单,但从技术上讲,此方法实际上是在更新值,而不是删除/重新创建它们。您还将需要jqbase64(或openssl enc -base64)命令可用,这tr是一个常用的Linux实用程序,用于修剪尾随的换行符。

有关更新运算符的更多详细信息,请参见此处jq|=


CJ *_*ahs 6

由于我无法回复上面 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 -
Run Code Online (Sandbox Code Playgroud)

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

kubectl \
        patch \
        secret \
        production-tls \
        -p "{\"data\":{\"tls.key\":\"${TLS_KEY}\",\"tls.crt\":\"${TLS_CRT}\"}}"
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 `base64 -w 0` 而不是 `tr -d` (2认同)