kubernetes authentication - part1
K8s 權限管理三部曲
當一個請求到達 Kubernetes (K8s) API Server 時,它會經過三個階段的檢查,才能被放行:
- 認證 (Authentication) - 你是誰? 驗證請求者的身份。就像在電影院門口驗票,確認你持有有效的電影票。
- 授權 (Authorization) - 你能做什麼? 在確認身份後,檢查該身份是否擁有執行此操作的權限。就像檢查你的票是普通廳還是 VIP 廳,決定你能進入哪個影廳。
- 准入控制 (Admission Control) - 這個操作合規嗎? 這是最後一道防線。即使請求者有權限,准入控制器仍然可以基於叢集的安全策略或最佳實踐,來修改或拒絕這個請求。就像電影院規定「禁止攜帶外食」,即使你有 VIP 票,也不能帶漢堡進去。
本篇和下一篇文章將聚焦於前兩個階段:認證與授權。
你是誰?認識兩種帳號
在 K8s 的世界裡,有兩種截然不同的「身份」:
帳號類型 | 管理方式 | 主要用途 |
---|---|---|
ServiceAccount | 由 K8s 管理,是 K8s 的原生 API 物件。 | 專為應用程式設計。主要被掛載到 Pod 中,讓 Pod 內的程式有權限與 API Server 溝通。 |
Normal User | 不由 K8s 管理。沒有對應的 API 物件。 | 專為人類使用者設計(如開發者、維運人員)。通常需要整合外部身份系統(如 LDAP, OIDC)或手動分發憑證。 |
你能做什麼?RBAC 詳解
K8s 主要使用 RBAC (Role-Based Access Control) 模型來進行授權。RBAC 的核心思想是將「誰 (Subject)」可以對「什麼 (Resource)」做「什麼事 (Verb)」這個問題,拆解成幾個可組合的物件來管理。
graph LR subgraph "誰 (Subject)" U[User] G[Group] SA[ServiceAccount] end subgraph "權限 (Role / ClusterRole)" R["Role<br/>(Namespace-scoped)"] CR["ClusterRole<br/>(Cluster-scoped)"] end subgraph "綁定 (Binding)" RB["RoleBinding<br/>(Namespace-scoped)"] CRB["ClusterRoleBinding<br/>(Cluster-scoped)"] end U --> RB U --> CRB G --> RB G --> CRB SA --> RB SA --> CRB RB --> R RB --> CR CRB --> CR
步驟 1:定義權限 (Role / ClusterRole)
首先,我們需要定義一組權限。
- Role:定義在特定 Namespace 內的權限。
- ClusterRole:定義整個叢集範圍的權限,它不受 Namespace 限制。
範例:建立一個只能讀取 default
namespace 下 Pod 的 Role
|
|
步驟 2:綁定權限 (RoleBinding / ClusterRoleBinding)
接著,我們需要將定義好的權限「綁定」到一個或多個主體 (Subject) 上。
- RoleBinding:在特定 Namespace 內進行綁定。
- ClusterRoleBinding:在整個叢集範圍內進行綁定。
範例:將 pod-reader
Role 綁定給 default
namespace 的 default
ServiceAccount
|
|
重點:
RoleBinding
也可以綁定一個ClusterRole
。這種組合非常實用,它意味著「將一個叢集級別的通用權限,授予給某個特定 Namespace 內的主體」。例如,您可以定義一個admin
ClusterRole,然後透過 RoleBinding 將其授予給不同 Namespace 的開發團隊。
專為應用程式設計的帳號:ServiceAccount
ServiceAccount (SA) 是 K8s 中一等公民,主要用於授權給 Pod。
- 每個 Namespace 在建立時,都會自動產生一個名為
default
的 ServiceAccount。 - 當您建立一個 Pod 卻沒有指定 SA 時,它會自動使用所在 Namespace 的
default
SA。 - SA 的認證資訊 (Token) 會被自動掛載到 Pod 的
/var/run/secrets/kubernetes.io/serviceaccount/
目錄下,供 Pod 內的應用程式使用。
為外部程式產生 SA 的 Kubeconfig
雖然 SA 主要用於 Pod 內部,但有時我們也需要讓外部的 CI/CD 工具或自動化腳本,使用 SA 的身份來存取叢集。這時,我們可以為 SA 產生一個基於 Token 的 kubeconfig
。
|
|
我們已經了解了 K8s 的授權模型 (RBAC) 以及專為應用程式設計的 ServiceAccount。在 Part 2 中,我們將深入探討如何為「人類」使用者設定認證,實現更靈活的權限管理。