当一个秘密是从一个文件生成的时候,我如何更新一个关于 Kubernetes 的秘密?

我创造了一个秘密

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

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

147016 次浏览

这应该会奏效:

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防止在第一次运行时获得警告。

或者,您也可以使用 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方法那样优雅或简单,但从技术上讲,这种方法实际上是更新值,而不是删除/重新创建它们。您还需要提供 jqbase64(或 openssl enc -base64)命令,tr是一个常用的 Linux 实用程序,用于修剪尾随换行符。

有关 jq更新操作符 |=的详细信息,请参阅 给你

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

删除证书

kubectl delete secret -n `namespace`

用于创建特定命名空间的新 cert

kubectl create secret {your-cert-name} --key /etc/certs/{name}.com.key --cert /etc/certs/{name}.com.crt -n {namespace}

因为我无法回答 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}\"}}"

谢谢德维的答案,最好地满足我的需要。

为了扩展这些答案,我发现在删除后面加上“忽略-未找到”有助于我们的 CICD,因为如果这个秘密不存在,它就不会出错,它只会继续并创建它:

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

虽然来晚了,但我还是来了。

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

  • edit:

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

    • 这可能对你有帮助

我找到了一个最好的方法:

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

你可以使用补丁秘密:

kubectl patch secret my-secret  --patch="{\"data\": { \"tls.key\": \"$(base64 -w0 ./tls.key)\",\"tls.crt\": \"$(base64 -w0 ./tls.crt)\"  }}"