如何识别 Kubernetes 中未使用的秘密?

How to identify unused secrets in Kubernetes?

我想重命名我的 k8s Secrets 并想检查是否有未使用的 Secrets。我也想知道有多少 containers 参考 Secret.

有比在所有部署中搜索秘密名称更简单的方法吗?

没有列出未使用的 Secret 的预期方法,因为 Secret 本身不包含使用参考。一种解决方案是解析所有 Containers/Pods 以使用机密作为装载和环境变量以匹配您的机密列表。 kubectl get 支持 JSONPath 并使之变得非常简单:

检索用作坐骑的秘密

kubectl get pods --all-namespaces -o jsonpath='{.items[*].spec.volumes[*].secret.secretName}' | xargs -n1 | uniq

检索用作环境变量的机密

kubectl get pods --all-namespaces -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | xargs -n1 | uniq

谢谢西蒙。根据您的回答,我创建了一个差异,其中显示了容器环境部分中未引用的 secretsSecrets也可以参考:

  • TLS Ingresses 部分
  • Pods Volumes 规范,就像西蒙提到的那样
  • ImagePullSecrets 私有存储库
  • CRDs 自定义资源定义

但对我来说,找到环境变量中没有引用的secrets就足够了:

diff \
<(kubectl get pods -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | xargs -n1 | sort | uniq) \
<(kubectl get secrets -o jsonpath='{.items[*].metadata.name}' | xargs -n1 | sort | uniq)

更新 16.04.2018

我创建了一个更高级的版本来查找 volumesingress tlsimagePullSecrets 中引用的秘密。以下代码段将显示当前命名空间所有未使用的 secrets

注意:该脚本并未涵盖所有可以引用机密的选项(例如自定义资源定义)。

更新 15.06.2021:添加了来自 Pod 容器规范 envFrom[*].secretRef.name 的秘密作为秘密来源

envSecrets=$(kubectl get pods -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | xargs -n1)
envSecrets2=$(kubectl get pods -o jsonpath='{.items[*].spec.containers[*].envFrom[*].secretRef.name}' | xargs -n1)
volumeSecrets=$(kubectl get pods -o jsonpath='{.items[*].spec.volumes[*].secret.secretName}' | xargs -n1)
pullSecrets=$(kubectl get pods -o jsonpath='{.items[*].spec.imagePullSecrets[*].name}' | xargs -n1)
tlsSecrets=$(kubectl get ingress -o jsonpath='{.items[*].spec.tls[*].secretName}' | xargs -n1)

diff \
<(echo "$envSecrets\n$envSecrets2\n$volumeSecrets\n$pullSecrets\n$tlsSecrets" | sort | uniq) \
<(kubectl get secrets -o jsonpath='{.items[*].metadata.name}' | xargs -n1 | sort | uniq)