【发布时间】:2018-02-03 09:24:08
【问题描述】:
我使用
创建了一个秘密kubectl create secret generic production-tls \
--from-file=./tls.key \
--from-file=./tls.crt
如果我想更新这些值 - 我该怎么做?
【问题讨论】:
标签: kubernetes kubectl kubernetes-secrets
我使用
创建了一个秘密kubectl create secret generic production-tls \
--from-file=./tls.key \
--from-file=./tls.crt
如果我想更新这些值 - 我该怎么做?
【问题讨论】:
标签: kubernetes kubectl kubernetes-secrets
这应该可行:
kubectl create secret generic production-tls \
--save-config --dry-run=client \
--from-file=./tls.key --from-file=./tls.crt \
-o yaml |
kubectl apply -f -
【讨论】:
--save-config 提供给 kubectl create secret 以避免 CLI 警告。
kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f - 证书是纯文本格式。
--dry-run=client。
您可以删除并立即重新创建密钥:
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 更有意义,谢谢!
--namespace=kube-system
或者,您也可以使用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更新操作员|=的更多详细信息,请参阅here。
【讨论】:
base64 命令中添加-w0 以禁用换行吗? linux.die.net/man/1/base64
由于我无法回复 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 提供的最能满足我需求的答案。
【讨论】:
只是为了扩展这些答案,我发现在删除中添加“--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.
【讨论】:
聚会迟到了,但我仍然在这里。
可能我们可以同时使用patch 或edit 选项。
edit:
kubectl edit secrets/<SECRET_NAME> -n <NAME_SPACE>
base64自行编码,然后在编辑时放置编码值。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".
我找到了最好的方法:
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt --dry-run=client -o yaml | kubectl apply -f -
【讨论】: