我使用kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt
创建了一个秘密。
如果我想更新值 - 我该怎么做?
答案 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-run
和jq
(或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)
聚会迟到了,但我的意见还在。
可能我们可以同时使用 patch
或 edit
选项。
使用 edit
:
kubectl edit secrets/<SECRET_NAME> -n <NAME_SPACE>
base64
自己编码,然后应在编辑时放置编码值。使用 patch
: