跨命名空间Kubernetes Ingress控制器无法读取指定证书,使用默认证书
问题分析与解决方案
核心问题
你遇到的是跨命名空间权限不足导致NGINX Ingress控制器无法读取目标命名空间的TLS Secret,从而 fallback到默认证书。报错中的"local"指的是Ingress控制器自身运行的命名空间,控制器默认仅拥有自身命名空间的资源访问权限,无法直接读取其他命名空间的Secret。
必要配置:RBAC权限扩展
要解决这个问题,需要给Ingress控制器的ServiceAccount添加读取目标命名空间(connectivity-proxy)中Secret资源的权限,步骤如下:
1. 创建读取Secret的ClusterRole
创建一个具备Secret读取权限的ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ingress-secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "watch"]
2. 绑定权限到Ingress控制器的ServiceAccount
将上述ClusterRole绑定到Ingress控制器所在命名空间的ServiceAccount,限定作用于connectivity-proxy命名空间:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ingress-secret-reader-binding namespace: connectivity-proxy subjects: - kind: ServiceAccount name: <你的Ingress控制器ServiceAccount名称> namespace: <Ingress控制器运行的命名空间> roleRef: kind: ClusterRole name: ingress-secret-reader apiGroup: rbac.authorization.k8s.io
提示:替换
<你的Ingress控制器ServiceAccount名称>和<Ingress控制器运行的命名空间>为实际值,比如默认NGINX Ingress控制器的ServiceAccount通常是nginx-ingress,命名空间为nginx-ingress或kube-system。
额外验证点
- 确认Ingress的
tls.secretName配置正确:你的Ingress与Secret同属connectivity-proxy命名空间,因此无需在secretName前添加命名空间前缀,当前配置cdf-conn-proxy-ingress-secret是正确的。 - 检查Secret完整性:你的Secret类型为
kubernetes.io/tls,且包含tls.crt和tls.key字段,格式符合要求。 - 重启Ingress控制器:权限配置生效后,建议重启控制器Pod以加载新的RBAC规则。
内容的提问来源于stack exchange,提问作者Prabal Rakshit
相关产品推荐
相关产品推荐

