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

时间:2017-09-25 13:36:19

标签: kubernetes kubectl

我想重命名我的k8 Secrets,并想检查是否有未使用的Secrets。另外,我想知道有多少containers引用Secret

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

2 个答案:

答案 0 :(得分:6)

谢谢西蒙。根据你的回答,我创建了一个diff,它显示了容器env部分中没有引用的secretsSecrets也可以在以下网址中引用:

    Ingress的
  • TLS部分
  • Pods Volumes规范,就像Simon提到的那样
  • 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)

更新16.04.2018

我创建了一个更高级的版本,以查找volumesingress 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)

答案 1 :(得分:1)

没有预定的方法来列出未使用的秘密,因为Secrets本身不包含使用参考。一种解决方案是将所有容器/容器解析为使用秘密作为装载和环境变量来匹配您的秘密列表。 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