Kubernetes中system:serviceaccount无法访问Service,如何适配RBAC?
解决Nginx Ingress控制器的RBAC权限错误
这个问题我之前部署旧版本Ingress控制器时也碰到过,核心原因是默认的default服务账户在启用RBAC的K8s集群里没有足够权限访问default命名空间下的Service资源。下面是适配RBAC的完整配置步骤:
1. 创建RBAC权限配置文件
新建一个nginx-ingress-rbac.yaml文件,内容如下,它会创建专用的服务账户、集群角色以及绑定关系:
# 专用的ServiceAccount,用于运行Ingress控制器 apiVersion: v1 kind: ServiceAccount metadata: name: nginx-ingress-serviceaccount namespace: default # 定义Ingress控制器需要的集群级权限 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: nginx-ingress-clusterrole rules: - apiGroups: [""] resources: ["services", "endpoints", "pods", "nodes"] verbs: ["get", "list", "watch"] - apiGroups: ["extensions", "networking.k8s.io"] resources: ["ingresses", "ingressclasses"] verbs: ["get", "list", "watch", "update"] - apiGroups: [""] resources: ["configmaps", "secrets"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "patch"] # 将ClusterRole绑定到专用ServiceAccount apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: nginx-ingress-clusterrolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: nginx-ingress-clusterrole subjects: - kind: ServiceAccount name: nginx-ingress-serviceaccount namespace: default
2. 修改Nginx控制器的Deployment配置
打开你原来的nginx-controller.yaml,找到Deployment的spec.template.spec部分,添加serviceAccountName字段,指定我们刚才创建的专用服务账户:
spec: template: spec: serviceAccountName: nginx-ingress-serviceaccount # 新增这一行 containers: - name: nginx-ingress-controller # 原有容器配置...
3. 应用配置并验证
先执行RBAC配置:
kubectl apply -f nginx-ingress-rbac.yaml
再应用修改后的控制器配置:
kubectl apply -f nginx-controller.yaml
等待Pod启动后,检查日志确认没有权限错误:
kubectl logs -l app=nginx-ingress
补充说明
- 这里用
ClusterRole是因为Ingress控制器需要跨命名空间访问Ingress、Service等资源,如果你只需要单命名空间的权限,可以换成Role和RoleBinding。 - 权限规则里的资源和verbs是Ingress控制器正常运行所需的最小权限集合,你可以根据实际需求调整。
内容的提问来源于stack exchange,提问作者Philip Kirkbride
相关产品推荐
相关产品推荐

