Kubernetes RBAC

ServiceAccount、Role、ClusterRole、RoleBinding、ClusterRoleBinding 和权限排查。

Kubernetes RBAC

RBAC 用于控制用户、组和 ServiceAccount 对 Kubernetes API 资源的访问权限。生产环境建议遵循最小权限原则,避免长期使用 cluster-admin

核心对象

对象说明
ServiceAccountPod 在集群内访问 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"

排查步骤:

  1. 确认主体身份:用户、组或 ServiceAccount。
  2. 确认访问资源的 apiGroup、resource、verb。
  3. 确认权限范围是 namespace 还是 cluster。
  4. 查看 RoleBinding / ClusterRoleBinding 是否绑定正确。
  5. 使用 kubectl auth can-i 复现。

最小权限建议

  • 应用 Pod 使用独立 ServiceAccount。
  • 不给业务应用绑定 cluster-admin
  • 只授予需要的 resource 和 verb。
  • Secret 权限单独评审。
  • 临时权限设置有效期和回收流程。
  • 定期审计 ClusterRoleBinding。

常见资源 apiGroup

资源apiGroup
Pod / Service / Secret / ConfigMap""
Deployment / StatefulSet / DaemonSetapps
Job / CronJobbatch
Ingressnetworking.k8s.io
Role / RoleBindingrbac.authorization.k8s.io