You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除Ingress.yaml中secretName后K8s残留证书的解决方案问询

解决Helm管理下未使用证书Secret的自动清理问题

一、利用Helm自身机制实现自动清理

你的证书Secret通过{{- if eq .Values.certificate.enabled true }}条件渲染,可通过以下步骤让Helm自动清理:

  1. 将Values.certificate.enabled设为false(可修改values.yaml,或升级时通过--set certificate.enabled=false指定)
  2. 执行Helm升级命令时加上--prune参数,Helm会自动移除当前release资源清单中不再存在的对象:
helm upgrade <你的release名称> <chart路径> --set certificate.enabled=false --prune -n <release命名空间>

注意:--prune会删除所有不在当前manifest内的关联资源,需确认无其他需保留资源被误删。

二、通过Helm Hook实现针对性清理

如果不想依赖--prune的全局清理,可自定义Helm Hook在Ingress更新后清理旧证书:

  1. 在Helm Chart中添加Hook文件(如templates/cleanup-cert-secret.yaml):
{{- if and (not .Values.certificate.enabled) (eq .Values.name "customer-tls") }}
apiVersion: batch/v1
kind: Job
metadata:
  name: cleanup-{{ .Values.name }}-cert
  namespace: edge
  annotations:
    "helm.sh/hook": post-upgrade
    "helm.sh/hook-delete-policy": hook-succeeded,hook-failed
spec:
  template:
    spec:
      serviceAccountName: cleanup-cert-sa
      containers:
      - name: kubectl
        image: bitnami/kubectl:latest
        command: ["kubectl", "delete", "secret", "{{ .Values.name }}-cert", "-n", "edge"]
      restartPolicy: OnFailure
{{- end }}
  1. 创建对应的ServiceAccount与权限(如templates/cleanup-sa.yaml):
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cleanup-cert-sa
  namespace: edge
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: secret-deleter
  namespace: edge
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cleanup-cert-binding
  namespace: edge
subjects:
- kind: ServiceAccount
  name: cleanup-cert-sa
roleRef:
  kind: Role
  name: secret-deleter
  apiGroup: rbac.authorization.k8s.io

设置certificate.enabled=false执行升级时,Helm会触发该Job自动删除指定证书Secret。

三、集群级自动清理机制

若需长期自动清理所有未被引用的证书Secret,可部署定期执行的CronJob:

  1. 创建CronJob配置,每日检查并删除未被Ingress引用的TLS Secret:
apiVersion: batch/v1
kind: CronJob
metadata:
  name: unused-cert-cleanup
  namespace: kube-system
spec:
  schedule: "0 0 * * *" # 每日凌晨执行一次
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: unused-cert-cleaner
          containers:
          - name: cleanup
            image: bitnami/kubectl:latest
            command: ["/bin/sh", "-c"]
            args:
            - |
              # 获取所有被Ingress引用的Secret名称
              USED_SECRETS=$(kubectl get ingress --all-namespaces -o jsonpath='{range .items[*].spec.tls[*]}{.secretName}{"\n"}{end}' | sort | uniq)
              # 获取所有TLS类型的Secret
              ALL_TLS_SECRETS=$(kubectl get secrets --all-namespaces -o jsonpath='{range .items[*]}{@.metadata.namespace}/{@.metadata.name}{"\n"}{end}' | grep -E "kubernetes.io/tls")
              # 遍历删除未被引用的TLS Secret
              for SECRET in $ALL_TLS_SECRETS; do
                SECRET_NAME=$(echo $SECRET | cut -d'/' -f2)
                if ! echo "$USED_SECRETS" | grep -q "$SECRET_NAME"; then
                  kubectl delete secret "$SECRET_NAME" -n $(echo $SECRET | cut -d'/' -f1)
                fi
              done
          restartPolicy: OnFailure
  1. 创建对应的ServiceAccount与ClusterRole权限(需跨命名空间操作):
apiVersion: v1
kind: ServiceAccount
metadata:
  name: unused-cert-cleaner
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: unused-cert-cleaner
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list", "delete"]
- apiGroups: ["networking.k8s.io"]
  resources: ["ingresses"]
  verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: unused-cert-cleaner-binding
subjects:
- kind: ServiceAccount
  name: unused-cert-cleaner
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: unused-cert-cleaner
  apiGroup: rbac.authorization.k8s.io

该CronJob会自动清理集群内所有未被Ingress引用的TLS Secret,适合批量自动化清理场景。

补充说明

你提到的--enable-dynamic-certificates是旧版Nginx Ingress Controller的废弃参数,无法解决当前问题。上述方案中,第一种最贴合现有Helm管理流程,操作简单可控;第二种适合针对性清理特定证书;第三种为长期自动化解决方案。

内容的提问来源于stack exchange,提问作者Aman Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:31:22