使用 Kubectl 获取和删除孤立的 Secret
维护干净有序的 Kubernetes 集群对于 DevOp 团队非常重要,这样他们就不会不必要地浪费计算或财务资源,或者在孤立机密的情况下,留下可能危及安全的暴露资源。
在本指南中,我们将专注于通过查找和删除孤立的 Secret 来清理您的 Kubernetes 集群。
Secret是为保存少量机密数据(如密码、令牌或密钥)而创建的 API 对象。这些对象允许将私有加密数据与容器映像、Pod 规范和应用程序代码分开,从而提供额外有用的 Pod 安全层。
如果 Secret 与创建它们以支持的部署隔离开来,或者如果它们的所有者已被清除,则它们可能会成为孤立的。通过删除孤立的 Secret,您将减少集群中的混乱并消除安全漏洞。
查找和删除孤立的秘密
以下是您应该采取的识别和删除孤立 Secret 的步骤:
第 1 步:找到所有秘密
首先,您可以使用以下命令生成所有 Secret 的列表:
kubectl get secrets -all-namespaces -o json
此命令将返回所有命名空间中的 Secret 列表,但正如您将看到的,Secret 对象不引用其所有者。
您需要列出资源引用的所有 Secret。可以在几个地方引用秘密:
- Pods volumes
- 容器环境
- 入口的 TLS 部分
- ImagePullSecrets
- 自定义资源定义
第 2 步:与已用机密列表进行比较
要列出当前命名空间的所有秘密,您可以运行以下命令列出所有使用的秘密并与现有秘密列表进行比较:
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)
现在您有了所有未使用的孤立机密的列表,您可以通过删除它们来开始清理。
第 3 步:删除孤立的秘密
使用以下命令删除找到的孤立 Secret:
kubectl delete secret samplesecret
确认删除的示例输出:
secret "samplesecret" deleted
删除所有孤立的 Secret 后,您将从集群中删除不需要的资源,从而释放存储空间并使集群更加安全。如果您定期删除孤立资源,您将确保您的团队保持最佳的 Kubernetes 资源管理。
希望本指南可以帮助您清理 Kubernetes 集群!