【问题标题】:How can I update a secret on Kubernetes when it is generated from a file?从文件生成秘密时,如何在 Kubernetes 上更新秘密?
【发布时间】:2018-02-03 09:24:08
【问题描述】:

我使用

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

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

【问题讨论】:

    标签: kubernetes kubectl kubernetes-secrets


    【解决方案1】:

    这应该可行:

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

    【讨论】:

    • 在最新版本的 k8s 中,您需要将 --save-config 提供给 kubectl create secret 以避免 CLI 警告。
    • 仅供参考,最近(2019 年 9 月)适用于 tls secret 的语法:kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f - 证书是纯文本格式。
    • 需要在 kubectl 1.18 或更高版本中使用--dry-run=client
    【解决方案2】:

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

    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 可防止在第一次运行时收到警告。

    【讨论】:

    • 秘密被删除时 pod 会发生什么?
    • @BrunoJCM 运行的 pod 不受影响,无论它们是通过 env 变量获取机密还是作为卷安装。如果我在没有秘密的情况下启动了一个 pod,它们会遇到错误;因此,Janos 的回答是首选方式。
    • 是的,我明白了,使用apply 更有意义,谢谢!
    • 这对我不起作用,因为我忘记了--namespace=kube-system
    • 取决于你想要添加秘密的命名空间,如果不是默认,当然你必须添加命名空间参数。
    【解决方案3】:

    或者,您也可以使用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更新操作员|=的更多详细信息,请参阅here

    【讨论】:

    • 您可以在base64 命令中添加-w0 以禁用换行吗? linux.die.net/man/1/base64
    • @chunk_split no.我正在使用 macOS,base64 命令的 BSD 版本没有该选项。
    【解决方案4】:

    由于我无法回复 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 的“补丁”方法,这似乎也有效。

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        聚会迟到了,但我仍然在这里。

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

        • edit

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

        【讨论】:

          【解决方案7】:

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

          用于删除证书

          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}
          

          【讨论】:

          • 例如:一个例子oc delete secret secret-name -n "openshift-config".
          【解决方案8】:

          我找到了最好的方法:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-01-20
            • 2016-08-21
            • 1970-01-01
            • 2022-12-23
            • 2018-09-05
            • 2019-08-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多