AKS跨命名空间部署ingress-nginx时TLS失效:证书秘钥找错命名空间
方案1:开启Ingress-Nginx跨命名空间Secret引用(推荐)
该方案无需在default命名空间开启特权,仅需调整控制器的RBAC权限与启动参数:
更新控制器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添加控制器跨命名空间引用参数
通过Helm升级Ingress-Nginx,启用跨命名空间Secret引用功能:helm upgrade ingress-nginx ingress-nginx/ingress-nginx \ --namespace nginx \ --set controller.extraArgs.enable-cross-namespace-refs=true重新配置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:
复制SecretProviderClass到default命名空间
kubectl get secretproviderclass ingress-tls-csi -n nginx -o yaml | sed 's/namespace: nginx/namespace: default/' | kubectl apply -f -授权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触发Secret生成
可删除并重新创建Ingress资源,或重启default命名空间内关联的Pod,促使CSI驱动生成ingress-tls-csiSecret。
方案3:用ClusterSecret同步跨命名空间Secret
借助ClusterSecret控制器将nginx命名空间的Secret同步到default命名空间:
安装ClusterSecret控制器
helm install clustersecret bitnami/clustersecret -n kube-system创建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更新Ingress配置
确保Ingress的secretName指向default命名空间中同步后的ingress-tls-csiSecret,重新部署Ingress即可。
内容的提问来源于stack exchange,提问作者Josh

