我使用了一个方法创建了一个秘密
kubectl create secret generic production-tls \
--from-file=./tls.key \
--from-file=./tls.crt
如果我想更新这些值,我该怎么做?
我使用了一个方法创建了一个秘密
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
参数可以防止在第一次运行时收到警告。
apply
更有意义,谢谢! - Bruno Medeiros另外,您还可以使用 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
那样优雅或简单,但从技术上讲,该方法确实是更新值而非删除/重新创建。你还需要可用的jq
和base64
(或openssl enc -base64
)命令,tr
是一个常见的Linux实用程序,用于修剪尾随的换行符。
有关jq
更新运算符|=
的更多详细信息,请参见此处。
base64
命令中添加-w0
以禁用行换行?https://linux.die.net/man/1/base64 - patricknelsonset -x
打开调试时。在更实际的层面上,由于 jq 参数位于单引号之间,因此 shell 变量不会被扩展。因此,最终的秘密将具有文字字符 $TLS_KEY 和 $TLS_CRT,而不是它们的实际值。
您需要执行类似以下的操作:jq --arg TLS_KEY $TLS_KEY '.data["tls.key"] |= "$TLS_KEY"' - Denilson由于我无法回复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给出最符合我需求的答案。
base64 -w 0
替代 tr -d
。 - Jeremy Morren"stringData"
而不是"data"
,你就不需要对值进行base64编码。 - neu242虽然来晚了,但这里是我的意见。
潜在地,我们可以同时使用patch
或edit
选项。
With edit
:
kubectl edit secrets/<SECRET_NAME> -n <NAME_SPACE>
base64
encode by yourself and then the encoded value should be placed while editing.With patch
:
对于更具体的情况,您可能需要指定需要更新证书的名称空间并删除旧证书。
删除证书
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"
。 - Eduardo Luciokubectl patch secret my-secret --patch="{\"data\": { \"tls.key\": \"$(base64 -w0 ./tls.key)\",\"tls.crt\": \"$(base64 -w0 ./tls.crt)\" }}"
base64
命令需要一个-i
输入参数,并且没有-w
换行参数。意思是:kubectl patch secret tls-secret --patch="{\"data\": { \"tls.key\": \"$(base64 -i ./key.pem)\",\"tls.crt\": \"$(base64 -i ./cert.crt)\" }}"
。 - undefined为了进一步解释这些答案,我发现在删除时添加“--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.
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt --dry-run=client -o yaml | kubectl apply -f -
kubectl create secret
命令中提供--save-config
参数。 - David Housekubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -
证书是明文的。 - ldg--dry-run=client
。 - RichVel