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

AKS跨命名空间部署ingress-nginx时TLS失效:证书秘钥找错命名空间

解决方案

方案1:开启Ingress-Nginx跨命名空间Secret引用(推荐)

该方案无需在default命名空间开启特权,仅需调整控制器的RBAC权限与启动参数:

  1. 更新控制器RBAC权限
    创建ClusterRole与ClusterRoleBinding,允许nginx命名空间的Ingress控制器ServiceAccount读取所有命名空间的Secrets:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: ingress-nginx-cross-namespace-secret-reader
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: ingress-nginx-cross-namespace-secret-reader
    subjects:
    - kind: ServiceAccount
      name: ingress-nginx-controller
      namespace: nginx
    roleRef:
      kind: ClusterRole
      name: ingress-nginx-cross-namespace-secret-reader
      apiGroup: rbac.authorization.k8s.io
    

    应用配置:kubectl apply -f cross-namespace-rbac.yaml

  2. 添加控制器跨命名空间引用参数
    通过Helm升级Ingress-Nginx,启用跨命名空间Secret引用功能:

    helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
      --namespace nginx \
      --set controller.extraArgs.enable-cross-namespace-refs=true
    
  3. 重新配置Ingress资源
    删除原有Ingress(解决不可变字段问题),重新创建时指定跨命名空间的Secret:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: your-ingress
      namespace: default
    spec:
      tls:
      - hosts:
        - your-domain.com
        secretName: nginx/ingress-tls-csi
      rules:
      - host: your-domain.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: your-service
                port:
                  number: 80
    

    应用配置:kubectl apply -f your-ingress.yaml

方案2:修复default命名空间的SecretProviderClass配置

若方案1不适用,可调整default命名空间的SecretProviderClass,确保其能生成目标Secret:

  1. 复制SecretProviderClass到default命名空间

    kubectl get secretproviderclass ingress-tls-csi -n nginx -o yaml | sed 's/namespace: nginx/namespace: default/' | kubectl apply -f -
    
  2. 授权default命名空间ServiceAccount访问Azure Key Vault
    创建RoleBinding,将CSI驱动所需权限绑定到default命名空间的ServiceAccount:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: secrets-store-csi-driver-reader
      namespace: default
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: default
    roleRef:
      kind: ClusterRole
      name: secrets-store-csi-driver-node-clusterrole
      apiGroup: rbac.authorization.k8s.io
    

    应用配置:kubectl apply -f sa-rolebinding.yaml

  3. 触发Secret生成
    可删除并重新创建Ingress资源,或重启default命名空间内关联的Pod,促使CSI驱动生成ingress-tls-csi Secret。

方案3:用ClusterSecret同步跨命名空间Secret

借助ClusterSecret控制器将nginx命名空间的Secret同步到default命名空间:

  1. 安装ClusterSecret控制器

    helm install clustersecret bitnami/clustersecret -n kube-system
    
  2. 创建ClusterSecret资源

    apiVersion: bitnami.com/v1alpha1
    kind: ClusterSecret
    metadata:
      name: ingress-tls-csi-cluster
    spec:
      secretName: ingress-tls-csi
      namespace: nginx
      targetNamespaces:
      - default
    

    应用配置:kubectl apply -f cluster-secret.yaml

  3. 更新Ingress配置
    确保Ingress的secretName指向default命名空间中同步后的ingress-tls-csi Secret,重新部署Ingress即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:15:36