基於角色的存取控制(RBAC,Role-Based Access Control)是 Kubernetes 提供的一種存取控制機制,用於管理和控制對 Kubernetes 資源的存取。RBAC 允許你為用戶、群組或服務帳戶分配特定角色,從而限制它們在 Cluster 中可以執行的操作。這一天的課程將深入探討如何設定 RBAC 來進行身份驗證和授權,確保 Kubernetes Cluster 的安全性。
Role(角色):
RoleBinding(角色綁定):
Subject(主體):
Kubernetes 的 RBAC (Role-Based Access Control) 涉及四個核心組件:Role
、ClusterRole
、RoleBinding
、和 ClusterRoleBinding
。這四個組件之間的關係決定了如何在特定範圍內(如 Namespace)或全域範圍內分配資源存取權限。流程圖示意圖如下:
+--------------------------------------------------+
| Resources/Verbs (e.g., Pod, get,list, create) |
+--------------------------------------------------+
| |
| |
v v
+------------------+ +--------------------+
| Role | | ClusterRole |
| (Namespace Scope)| | (Cluster Scope) |
+------------------+ +--------------------+
| |
| |
v v
+------------------+ +--------------------+
| RoleBinding | | ClusterRoleBinding|
| (Namespace Scope)| | (Cluster Scope) |
+------------------+ +--------------------+
| |
| |
v v
+-------------------------------------------------+
| Subjects (User, Group, Service Account) |
+-------------------------------------------------+
Role (Namespace Scope):
Role
是在特定 Namespace 中的權限集合。它定義了哪些資源(如 Pods)可以被操作,以及具體哪些操作(如 get
、list
)被允許。ClusterRole (Cluster Scope):
ClusterRole
是全域範圍內的權限集合,它可以用於所有 Namespace,或者針對全Cluster範圍的資源進行定義。RoleBinding (Namespace Scope):
RoleBinding
將 Role
綁定到具體的主體(如使用者、群組或服務帳戶)中,使這些主體在指定的 Namespace 中擁有相應的權限。ClusterRoleBinding (Cluster Scope):
ClusterRoleBinding
將 ClusterRole
綁定到全Cluster的主體上,使這些主體在全 Cluster 範圍內擁有指定的權限。Subjects (User, Group, Service Account):
RoleBinding
或 ClusterRoleBinding
,他們被賦予了對特定資源進行操作的權限。Role
和 ClusterRole
定義了權限的範圍(Namespace 限定或全 Cluster)。RoleBinding
和 ClusterRoleBinding
則將這些權限分配給特定的主體。我們展示了 Kubernetes RBAC 的核心概念,並強調了權限如何被具體分配和應用。這種方式可以靈活地控制誰能對 Kubernetes 資源執行什麼操作,從而提高 Cluster 的安全性。
接下來就帶著大家按部就班的進行演練。
以下是一個簡單的 YAML 範例,該角色允許在 default
命名空間中讀取 Pod 資源:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
apiGroups: [""]
表示資源來自核心 API 組。resources: ["pods"]
定義了這個角色管理的資源類型為 Pods。verbs: ["get", "list", "watch"]
指定了允許的操作。將上述角色綁定到特定的服務帳戶,使其能夠在 default
命名空間中執行 Pod 的讀取操作:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: pod-reader-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
subjects
定義了要授權的主體,這裡是 pod-reader-sa
服務帳戶。roleRef
將這個角色綁定到之前定義的 pod-reader
角色。Cluster 角色用於定義跨命名空間的全域權限。例如,以下範例允許讀取 Cluster 中所有命名空間的 Pod 資源:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
將 Cluster 角色綁定到一個具體的用戶,使其擁有全域讀取 Pod 的權限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-all-pods
subjects:
- kind: User
name: jane-doe
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-pod-reader
apiGroup: rbac.authorization.k8s.io
最小權限原則:
命名空間隔離:
定期稽核和更新:
監控和記錄:
RBAC 是 Kubernetes 中控制 Cluster 和資源存取的重要機制。通過正確地設定角色和角色綁定,你可以有效地管理用戶和應用程式的存取權限,從而提高整個 Cluster 的安全性和合規性。在接下來的課程中,我們將探討 Operators 及其在應用程式自動化管理中的作用,這是進一步提升 Kubernetes 運維效率的關鍵。