当从文件生成机密时,如何更新 Kubernetes 上的机密?

How can I update a secret on Kubernetes when it is generated from a file?

我使用

创建了一个密文
kubectl create secret generic production-tls \
  --from-file=./tls.key \
  --from-file=./tls.crt

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

这应该有效:

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

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

kubectl delete secret production-tls \
--ignore-not-found

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

我将这些命令放在脚本中。 --ignore-not-found 防止在第一个 运行.

上收到警告

或者,您也可以使用 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 方法那样优雅或简单,但从技术上讲,这种方法是真正更新值而不是 deleting/recreating 它们。您还需要可用的 jqbase64(或 openssl enc -base64)命令,tr 是一个常用的 Linux 实用程序,用于修剪尾随换行符。

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

对于更具体的情况,您可能需要指定需要更新证书的名称空间并删除旧证书。

删除证书

kubectl delete secret -n `namespace`

为特定命名空间创建新证书

kubectl create secret {your-cert-name} --key /etc/certs/{name}.com.key --cert /etc/certs/{name}.com.crt -n {namespace}

因为我无法回复上面 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 提供最能满足我需求的答案。

只是为了扩展这些答案,我发现在删除中添加“--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.

派对迟到了,但我的意见仍然在这里。

我们可以同时使用 patchedit 选项。

  • edit:

    kubectl edit secrets/<SECRET_NAME> -n <NAME_SPACE>
    
    • 不是 推荐的秘密编辑方式。
    • 您应该有足够的权限来进行上述编辑。
    • 这个值应该是自己base64编码,编码后的值在编辑的时候放上
  • patch:

    • 这可能对你有帮助

我找到了这样做的最佳方法:

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