Repository Reading Site
RBAC — 谁能做什么
一个集群里有运维、开发、测试、CI/CD 流水线,它们需要不同的权限: RBAC(Role-Based Access Control)就是 K8s 的权限体系。 --- | | Role | ClusterRole | |---|------|-------------| | **RoleBinding** | 只在该 NS 生效 | 在该 NS 内使用集群
RBAC — 谁能做什么
为什么需要 RBAC?
一个集群里有运维、开发、测试、CI/CD 流水线,它们需要不同的权限:
- 开发人员:只能看 dev 命名空间的 Pod 日志
- CI/CD:只能在 prod 命名空间部署 Deployment
- 运维:可以管理所有资源但不能删 PV
- 监控系统:只能读取 metrics
RBAC(Role-Based Access Control)就是 K8s 的权限体系。
四个核心概念
谁(Subject) + 能做什么(Role) = 绑定(Binding)
Subject(三种):
├── User (人,K8s 不管理用户,由外部认证)
├── Group (用户组)
└── ServiceAccount (程序身份,K8s 管理)
Role(两种):
├── Role (命名空间级)
└── ClusterRole (集群级)
Binding(两种):
├── RoleBinding (在某个命名空间内绑定)
└── ClusterRoleBinding (集群级绑定)
权限矩阵
| Role | ClusterRole | |
|---|---|---|
| RoleBinding | 只在该 NS 生效 | 在该 NS 内使用集群角色 |
| ClusterRoleBinding | ❌ 不合法 | 集群范围生效 |
典型组合:
- Role + RoleBinding → "张三可以在 dev 空间读 Pod"
- ClusterRole + RoleBinding → "张三可以在 dev 空间用 view 角色"(复用内置 ClusterRole)
- ClusterRole + ClusterRoleBinding → "监控系统可以读所有空间的 metrics"
我们的实操
1. 创建 ServiceAccount
kubectl -n dev create serviceaccount developer
ServiceAccount 是给程序用的身份。每个 Pod 默认挂载所在 namespace 的 default ServiceAccount。创建自定义 SA 可以给特定程序精确的权限。
2. 创建 Role
kubectl -n dev create role pod-reader \
--verb=get,list,watch \
--resource=pods,pods/log
等价 YAML:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: dev
rules:
- apiGroups: [""] # "" 表示核心 API 组(pods, services 等)
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
verb 对应的操作:
| Verb | 含义 | kubectl 命令 |
|---|---|---|
| get | 读取单个 | kubectl get pod nginx-xxx |
| list | 列出所有 | kubectl get pods |
| watch | 监听变化 | kubectl get pods -w |
| create | 创建 | kubectl create / kubectl apply |
| update | 更新 | kubectl edit / kubectl apply |
| patch | 部分更新 | kubectl patch |
| delete | 删除 | kubectl delete |
子资源(subresource):
pods/log— Pod 日志(kubectl logs)pods/exec— 进入容器(kubectl exec)pods/portforward— 端口转发deployments/scale— 扩缩容
3. 创建 RoleBinding
kubectl -n dev create rolebinding developer-read \
--role=pod-reader \
--serviceaccount=dev:developer
4. 验证权限
# 模拟 developer SA 的身份检查权限
$ kubectl -n dev auth can-i list pods --as=system:serviceaccount:dev:developer
yes ✓ 有权限
$ kubectl -n dev auth can-i delete pods --as=system:serviceaccount:dev:developer
no ✗ Role 只给了 get/list/watch
$ kubectl -n dev auth can-i list deployments --as=system:serviceaccount:dev:developer
no ✗ Role 只授权了 pods 资源
$ kubectl -n prod auth can-i list pods --as=system:serviceaccount:dev:developer
no ✗ Role 只在 dev 命名空间
K8s 内置的 ClusterRole
K8s 自带几个常用 ClusterRole,不需要自己创建:
| ClusterRole | 权限范围 |
|---|---|
view |
只读大部分资源(不含 Secret) |
edit |
读写大部分资源(不含 RBAC) |
admin |
命名空间内的完全管理权限 |
cluster-admin |
集群最高权限(相当于 root) |
# 给 developer 在 dev 空间的 edit 权限(用内置 ClusterRole)
kubectl -n dev create rolebinding developer-edit \
--clusterrole=edit \
--serviceaccount=dev:developer
面试深度题
Q: User 和 ServiceAccount 的区别?
| User | ServiceAccount | |
|---|---|---|
| 管理者 | K8s 外部(LDAP、OIDC、证书) | K8s 内部(kubectl create sa) |
| 存储 | 不存在 K8s 中 | 存为 K8s 资源对象 |
| 用途 | 人类操作 kubectl | 程序/Pod 调用 API |
| 作用域 | 集群全局 | 命名空间级 |
| Token | 手动管理 | 自动挂载到 Pod |
Q: 如何设计 CI/CD 的 RBAC?
# 1. 创建专用 SA
apiVersion: v1
kind: ServiceAccount
metadata:
name: ci-deployer
namespace: prod
# 2. 精确授权:只能操作 Deployment 和 Service
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deployer
namespace: prod
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "create", "update"]
# 3. 绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ci-deployer-binding
namespace: prod
subjects:
- kind: ServiceAccount
name: ci-deployer
namespace: prod
roleRef:
kind: Role
name: deployer
apiGroup: rbac.authorization.k8s.io
原则:最小权限。 CI/CD 不需要 delete 权限(防止误删),不需要访问 Secret(密码通过 External Secrets Operator 管理),不需要操作其他 namespace。
Q: 有人在 prod 空间里删了重要的 Deployment,怎么查?
答案:审计日志(Audit Log)。K8s API Server 支持记录所有 API 请求,包括谁、什么时间、做了什么操作。Phase 3 会配置审计日志。
Phase 1 总结
| 主题 | 核心收获 |
|---|---|
| Namespace | 资源隔离、权限隔离、配额隔离 |
| Deployment | 滚动更新、回滚、ReplicaSet 版本管理 |
| Service | ClusterIP/NodePort、DNS 发现、Endpoints |
| ConfigMap/Secret | 配置外置、base64≠加密、volume 更新 vs env 不更新 |
| StatefulSet | 有序命名、稳定 DNS、独立 PVC |
| DaemonSet | 每节点一份、自动跟随节点 |
| Job/CronJob | 批处理、并行度、concurrencyPolicy |
| RBAC | Role/ClusterRole、最小权限、ServiceAccount |
| metrics-server | kubectl top 节点/Pod 资源监控基础 |