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

ade*_*asi 1 kubernetes kubectl

我想重命名我的k8s Secrets并想检查是否有未使用的Secrets.另外我想知道有多少和哪些containers参考了Secret.

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

Sim*_*sar 8

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

取回用作坐骑的秘密

kubectl get pods --all-namespaces -o jsonpath='{.items[*].spec.volumes[*].secret.secretName}' | xargs -n1 | uniq
Run Code Online (Sandbox Code Playgroud)

检索用作环境变量的机密

kubectl get pods --all-namespaces -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.name}' | xargs -n1 | uniq
Run Code Online (Sandbox Code Playgroud)


ade*_*asi 8

谢谢西蒙.根据你的答案,我创建了一个diff,它显示secrets在容器env部分中没有引用.Secrets也可以参考:

  • TLS Ingresses部分
  • Pods Volumes 规范,像西蒙提到的那样
  • ImagePullSecrets 对于私人存储库

但对我来说,找到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)
Run Code Online (Sandbox Code Playgroud)

更新于16.04.2018

我创建了一个更高级的版本来查找引用的秘密volumes,ingress tlsimagePullSecrets.此代码段将显示secrets当前命名空间未使用的所有内容:

envSecrets=$(kubectl get pods -o jsonpath='{.items[*].spec.containers[*].env[*].valueFrom.secretKeyRef.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$volumeSecrets\n$pullSecrets\n$tlsSecrets" | sort | uniq) \
<(kubectl get secrets -o jsonpath='{.items[*].metadata.name}' | xargs -n1 | sort | uniq)
Run Code Online (Sandbox Code Playgroud)