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

时间:2017-08-25 10:35:14

标签: kubernetes kubectl

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

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

7 个答案:

答案 0 :(得分:120)

这应该有效:

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

答案 1 :(得分:31)

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

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

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

答案 2 :(得分:5)

或者,您也可以使用jq的{​​{1}}或=运算符来动态更新机密。

|=

尽管它可能不像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-runjq(或base64)命令可用,openssl enc -base64是一个常用的Linux实用程序,用于修剪尾随换行符。

有关tr更新操作符jq的更多详细信息,请参见here

答案 3 :(得分: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}\"}}"

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

答案 4 :(得分:1)

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

答案 5 :(得分: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} ```

答案 6 :(得分:0)

聚会迟到了,但我的意见还在。

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

  • 使用 edit :

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