1. RBAC 模型
RBAC 的四種資源:
Namespace 範圍 RBAC:
Role ──────────► 定義特定 Namespace 的權限
RoleBinding ──► 將 User 或 SA 綁定到 Role
叢集範圍 RBAC:
ClusterRole ────► 定義叢集層級的權限
ClusterRoleBinding ► 將 User 或 SA 綁定到 ClusterRole
2. Role & ClusterRole
# Namespace 內的權限(Role)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: pod-reader
rules:
- apiGroups: [""] # core API group
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
# 叢集層級的權限(ClusterRole)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list"]
3. RoleBinding & ClusterRoleBinding
# 將 User 綁定到 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: dev
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
---
# 將 SA 綁定到 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-nodes-global
subjects:
- kind: ServiceAccount
name: monitoring-sa
namespace: monitoring
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
考試重點:
kubectl auth can-i是 RBAC 除錯的利器。kubectl auth can-i get pods --as jane -n dev可以檢查特定使用者的權限。
4. ServiceAccount
# 建立 SA
kubectl create serviceaccount monitoring-sa -n monitoring
# 確認 SA token(v1.24+ 使用 TokenRequest API)
kubectl create token monitoring-sa -n monitoring
# 在 Pod 中指定 SA
apiVersion: v1
kind: Pod
metadata:
name: monitor-pod
spec:
serviceAccountName: monitoring-sa
containers:
- name: app
image: monitor:latest
5. RBAC 除錯
# 權限檢查
kubectl auth can-i create deployments --as jane -n dev
kubectl auth can-i delete nodes --as system:serviceaccount:monitoring:monitoring-sa
# 列出所有權限
kubectl auth can-i --list --as jane -n dev
# 檢查 RBAC 資源
kubectl get roles,rolebindings -n dev
kubectl get clusterroles,clusterrolebindings | grep node-reader
kubectl describe rolebinding read-pods -n dev
6. 速查表
| 任務 | 指令 |
|---|---|
| 建立 Role | kubectl create role NAME --verb=get,list --resource=pods -n NS |
| 建立 RoleBinding | kubectl create rolebinding NAME --role=ROLE --user=USER -n NS |
| 建立 ClusterRole | kubectl create clusterrole NAME --verb=get,list --resource=nodes |
| 權限檢查 | kubectl auth can-i VERB RESOURCE --as USER -n NS |
| 建立 SA | kubectl create sa NAME -n NS |
7. 練習題
Q1:使用者 john 可以在 dev namespace 中建立 Pod,但在 default namespace 中不行。使用了哪種 RBAC 資源組合?
- A) ClusterRole + ClusterRoleBinding
- B) Role(dev ns 內)+ RoleBinding(dev ns 內) ✓
- C) ClusterRole + RoleBinding(dev ns 內)
- D) Role(default ns 內)+ RoleBinding
解析:限定特定 Namespace 的權限使用 Role 和 RoleBinding。選項 C 技術上也正確,但 B 是最直接的答案。使用 RoleBinding 綁定 ClusterRole 時,ClusterRole 的權限僅在該 Namespace 內生效。
Q2:kubectl auth can-i delete pods --as system:serviceaccount:app:mysa -n app 結果為 "no",需要授予什麼權限?
- A) 在 app Namespace 建立 Pod delete 的 Role 和 RoleBinding,綁定 ServiceAccount mysa ✓
- B) 在 kube-system Namespace 授予 admin 的 cluster-admin 權限
- C) 刪除並重新建立 ServiceAccount
- D) 重新啟動 kubelet
解析:要授予 ServiceAccount Pod 刪除權限,需建立 verb: delete 的 Role 並用 RoleBinding 綁定 SA。指令:kubectl create role pod-deleter --verb=delete --resource=pods -n app,kubectl create rolebinding pod-deleter-binding --role=pod-deleter --serviceaccount=app:mysa -n app。
Q3:ClusterRoleBinding 和 RoleBinding 的差異是什麼?
- A) 只有 ClusterRoleBinding 支援 ServiceAccount
- B) ClusterRoleBinding 在整個叢集生效,RoleBinding 只在特定 Namespace 內生效 ✓
- C) RoleBinding 無法參照 ClusterRole
- D) ClusterRoleBinding 可以參照 Role
解析:ClusterRoleBinding 是叢集範圍,RoleBinding 是 Namespace 範圍。RoleBinding 可以參照 ClusterRole(此時 ClusterRole 的權限會限定在該 Namespace 內)。