Kubernetes RBAC
ServiceAccount、Role、ClusterRole、RoleBinding、ClusterRoleBinding 和权限排查。
Kubernetes RBAC
RBAC 用于控制用户、组和 ServiceAccount 对 Kubernetes API 资源的访问权限。生产环境建议遵循最小权限原则,避免长期使用 cluster-admin。
核心对象
| 对象 | 说明 |
|---|---|
| ServiceAccount | Pod 在集群内访问 API 的身份 |
| Role | 命名空间级权限规则 |
| ClusterRole | 集群级权限规则,也可被 RoleBinding 引用 |
| RoleBinding | 在命名空间内绑定主体和 Role / ClusterRole |
| ClusterRoleBinding | 在集群范围绑定主体和 ClusterRole |
ServiceAccount
# API 版本。ServiceAccount 是核心资源,使用 v1。
apiVersion: v1
# 资源类型。这里表示创建 ServiceAccount。
kind: ServiceAccount
metadata:
# ServiceAccount 名称。
name: app-reader
# 所属命名空间。
namespace: default
Pod 使用指定 ServiceAccount:
spec:
# Pod 使用的 ServiceAccount 名称。
serviceAccountName: app-reader
Role
允许读取当前命名空间的 Pod:
# API 版本。RBAC 资源使用 rbac.authorization.k8s.io/v1。
apiVersion: rbac.authorization.k8s.io/v1
# 资源类型。Role 表示命名空间级权限。
kind: Role
metadata:
# Role 名称。
name: pod-reader
# Role 所属命名空间。
namespace: default
# 权限规则列表。
rules:
# apiGroups 为空字符串表示核心 API 组,例如 pods、services。
- apiGroups: [""]
# 允许访问的资源类型。
resources: ["pods"]
# 允许的操作。
verbs: ["get", "list", "watch"]
常见 verbs:
get list watch create update patch delete
RoleBinding
将 Role 绑定给 ServiceAccount:
# API 版本。RBAC 资源使用 rbac.authorization.k8s.io/v1。
apiVersion: rbac.authorization.k8s.io/v1
# 资源类型。RoleBinding 在命名空间内绑定权限。
kind: RoleBinding
metadata:
# RoleBinding 名称。
name: app-reader-pod-reader
# 绑定生效的命名空间。
namespace: default
# 被授权主体列表。
subjects:
# 主体类型,这里是 ServiceAccount。
- kind: ServiceAccount
# ServiceAccount 名称。
name: app-reader
# ServiceAccount 所在命名空间。
namespace: default
# 引用要绑定的 Role 或 ClusterRole。
roleRef:
# 引用 Role。
kind: Role
# Role 名称。
name: pod-reader
# Role 所属 API 组。
apiGroup: rbac.authorization.k8s.io
ClusterRole
ClusterRole 可用于集群级资源,也可以作为多个命名空间复用的权限模板。
# API 版本。RBAC 资源使用 rbac.authorization.k8s.io/v1。
apiVersion: rbac.authorization.k8s.io/v1
# 资源类型。ClusterRole 表示集群级权限模板。
kind: ClusterRole
metadata:
# ClusterRole 名称。
name: node-reader
# 权限规则列表。
rules:
# apiGroups 为空字符串表示核心 API 组。
- apiGroups: [""]
# nodes 是集群级资源。
resources: ["nodes"]
# 允许读取和监听节点列表。
verbs: ["get", "list", "watch"]
绑定到集群范围:
# API 版本。RBAC 资源使用 rbac.authorization.k8s.io/v1。
apiVersion: rbac.authorization.k8s.io/v1
# 资源类型。ClusterRoleBinding 在集群范围绑定权限。
kind: ClusterRoleBinding
metadata:
# ClusterRoleBinding 名称。
name: app-node-reader
# 被授权主体列表。
subjects:
# 主体类型,这里是 ServiceAccount。
- kind: ServiceAccount
# ServiceAccount 名称。
name: app-reader
# ServiceAccount 所在命名空间。
namespace: default
# 引用要绑定的 ClusterRole。
roleRef:
# 引用 ClusterRole。
kind: ClusterRole
# ClusterRole 名称。
name: node-reader
# ClusterRole 所属 API 组。
apiGroup: rbac.authorization.k8s.io
权限检查
检查当前用户:
kubectl auth can-i get pods -n default
kubectl auth can-i create deployments -n default
kubectl auth can-i get nodes
模拟 ServiceAccount:
kubectl auth can-i get pods \
--as=system:serviceaccount:default:app-reader \
-n default
列出权限对象:
kubectl get role,rolebinding -n default
kubectl get clusterrole,clusterrolebinding
kubectl describe role pod-reader -n default
kubectl describe rolebinding app-reader-pod-reader -n default
常见权限错误
错误示例:
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:app-reader" cannot list resource "pods" in API group "" in the namespace "default"
排查步骤:
- 确认主体身份:用户、组或 ServiceAccount。
- 确认访问资源的 apiGroup、resource、verb。
- 确认权限范围是 namespace 还是 cluster。
- 查看 RoleBinding / ClusterRoleBinding 是否绑定正确。
- 使用
kubectl auth can-i复现。
最小权限建议
- 应用 Pod 使用独立 ServiceAccount。
- 不给业务应用绑定
cluster-admin。 - 只授予需要的 resource 和 verb。
- Secret 权限单独评审。
- 临时权限设置有效期和回收流程。
- 定期审计 ClusterRoleBinding。
常见资源 apiGroup
| 资源 | apiGroup |
|---|---|
| Pod / Service / Secret / ConfigMap | "" |
| Deployment / StatefulSet / DaemonSet | apps |
| Job / CronJob | batch |
| Ingress | networking.k8s.io |
| Role / RoleBinding | rbac.authorization.k8s.io |