ade*_*asi 1 kubernetes kubectl
我想重命名我的k8s Secrets并想检查是否有未使用的Secrets.另外我想知道有多少和哪些containers参考了Secret.
有没有比在所有部署中搜索机密名称更简单的方法?
没有预期的方法来列出未使用的 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)
谢谢西蒙.根据你的答案,我创建了一个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 tls和imagePullSecrets.此代码段将显示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)
| 归档时间: |
|
| 查看次数: |
1137 次 |
| 最近记录: |