如何查询Kubernetes集群中使用指定secret的deployment资源?
全集群Kubernetes Secret引用查询方案
以下方法覆盖原生部署和Helm部署场景,无需逐个读取工作负载YAML:
一、原生Kubectl查询方法
Secret为命名空间级资源,所有引用方必须与Secret处于同一命名空间,执行以下命令前请替换<TARGET_SECRET_NS>(Secret所在命名空间)、<TARGET_SECRET_NAME>(Secret名称)。
1. 查询所有工作负载的引用
覆盖Deployment、StatefulSet、DaemonSet、CronJob、Job、Pod等资源,包含volume挂载、env直接引用、envFrom批量引用三种场景:
kubectl get deploy,sts,ds,cronjobs,jobs,pods -n <TARGET_SECRET_NS> -o json | jq --arg secName <TARGET_SECRET_NAME> ' .items[] | select( (.spec.template.spec.volumes[]?.secret.secretName == $secName) or (.spec.template.spec.containers[]?.env[]?.valueFrom.secretKeyRef.name == $secName) or (.spec.template.spec.containers[]?.envFrom[]?.secretRef.name == $secName) ) | {kind: .kind, resourceName: .metadata.name}'
2. 查询Ingress TLS引用
如果你的Secret是HTTPS证书类Secret,需额外查询Ingress的TLS配置引用:
kubectl get ingress -n <TARGET_SECRET_NS> -o json | jq --arg secName <TARGET_SECRET_NAME> ' .items[] | select(.spec.tls[]?.secretName == $secName) | {kind: "Ingress", resourceName: .metadata.name}'
3. 查询ServiceAccount镜像拉取密钥引用
如果Secret是镜像仓库凭证类Secret,需查询ServiceAccount的imagePullSecret绑定:
kubectl get sa -n <TARGET_SECRET_NS> -o json | jq --arg secName <TARGET_SECRET_NAME> ' .items[] | select(.imagePullSecrets[]?.name == $secName) | {kind: "ServiceAccount", resourceName: .metadata.name}'
二、Helm部署资源专属查询方法
对于通过Helm部署的服务,可直接基于Helm Release的渲染清单查询,避免遗漏Chart模板动态生成的Secret引用:
# 遍历当前命名空间所有Helm Release,筛选引用目标Secret的版本 helm list -q | while read relName; do helm get manifest $relName | grep -q "<TARGET_SECRET_NAME>" && echo "关联Helm Release:$relName" done # 如需查询全集群所有命名空间的Release,把第一行替换为 helm list -A -q | while read ns relName; do # 对应helm get manifest 命令增加 -n $ns 参数即可
辅助验证方法(K8s 1.27+)
可通过事件查询近期调用过该Secret的资源,辅助校验查询结果完整性:
kubectl events -n <TARGET_SECRET_NS> --field-selector involvedObject.kind=Secret,involvedObject.name=<TARGET_SECRET_NAME>
内容的提问来源于stack exchange,提问作者Tomer Amir
相关产品推荐
相关产品推荐

