Chuyển đến nội dung chính

第3課:RBAC & 授權

Role/ClusterRole、RoleBinding/ClusterRoleBinding。ServiceAccount。 CKA 考試中的權限管理與 RBAC 除錯。

RBAC 模型 — Role、ClusterRole、RoleBinding、ClusterRoleBinding

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. 速查表

任務指令
建立 Rolekubectl create role NAME --verb=get,list --resource=pods -n NS
建立 RoleBindingkubectl create rolebinding NAME --role=ROLE --user=USER -n NS
建立 ClusterRolekubectl create clusterrole NAME --verb=get,list --resource=nodes
權限檢查kubectl auth can-i VERB RESOURCE --as USER -n NS
建立 SAkubectl 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 內)。