152

我使用创建了一个秘密

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

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

4

8 回答 8

358

这应该有效:

kubectl create secret generic production-tls \
--save-config --dry-run=client \
--from-file=./tls.key --from-file=./tls.crt \
-o yaml | 
kubectl apply -f -
于 2017-08-25T12:17:49.363 回答
98

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

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一次运行时收到警告。

于 2017-08-25T12:21:24.827 回答
12

或者,您也可以使用jq's=|=运算符即时更新机密。

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|=

于 2018-11-16T18:18:11.477 回答
9

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

于 2020-02-21T16:52:23.633 回答
2

Just to expand on these answers I found that adding '--ignore-not-found' to the delete helped with our CICD as it wouldn't error out if the secret didn't exist, it would just go ahead and create it:

kubectl delete secret production-tls --ignore-not-found
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.
于 2020-09-03T08:22:06.227 回答
2

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

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

  • edit

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

于 2021-04-01T08:16:27.370 回答
2

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

用于删除证书

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}
于 2019-11-04T15:06:30.897 回答
0

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

kubectl create secret generic production-tls --from-file=./tls.key  --from-file=./tls.crt --dry-run=client -o yaml | kubectl apply -f -
于 2022-01-25T10:05:55.033 回答