kubernetes的API Server常用的授權插件有:
Node、ABAC、RBAC、Webhook
我們重點說一下RBAC的訪問控制邏輯
RBAC(Role base access control)基於角色的訪問控制
涉及到的資源類型:
Role #角色,基於名稱空間下的資源
RoleBinding #角色綁定,基於名稱空間下的資源
ClusterRole #集群角色,基於集群級別下的資源
ClusterRoleBinding #集群角色綁定,基於集群級別下的資源
其中,Role和Role是針對於名稱空間級別,授予其所在名稱空間范圍內的許可權限。
而ClusterRole和ClusterRoleBinding是針對於集群級別,授予其所在集群范圍內的許可權限。
原理如圖:
1.將user1通過rolebinding綁定到role,則該用戶將擁有role定義的權限,但操作范圍只能是role所在的名稱空間。
2.將user2通過clusterrolebinding綁定到clusterrole,則該用戶擁有clusterrole定義的權限,操作范圍是clusterrole所在集群。
3.將user3通過rolebinding綁定到clusterrole,則該用戶擁有clusterrole定義的權限,但操作范圍只能是rolebinding所在名稱空間。
使用 k8s資源配置清單的書寫格式(yaml文件)的便捷方法,快速獲取資源清單的基本框架:
1 創建角色:kubectl ceate role ROLE_NAME --verb=ACTION --resource=KIND --dry-run -o yaml >role-damo.yaml 2 創建角色綁定:kubectl create rolebinding ROLEBINDING_NAME --role=ROLE_NAME --user=USER_NAME --dry-run -o yaml > rolebinding.yaml 3 創建集群角色:kubectl create clusterrole CLUSTERROLE_NAME --verb=ACTION --resource=KIND --dry-run -o yaml > cluster-role.yaml 4 創建集群角色綁定:kubectl create clusterrolebinding CLUSTERROLEBINDING_NAEM --clusterrole=CLUSTERROLE_NAME --user=USER_NAME --dry-run -o yaml > cluster-binding.yaml
注:這些資源對象的修改會立即生效的
--verb:是動作名稱如:get,list,watch等。
--resource:是資源類型如:pods,deploy,svc等;注意這里如果寫入namespaces是無用的,因為role就是在namespace級別的,而namespaces選項是集群級別的。
--dry-run:運行這條命令,但不生效,常用於測試。
--role:是集群中現已存在的role資源對象。
--user:填寫集群中現已存在的用戶。或創建完rolebinding后創建這個用戶。
--clusterrole:是集群中現已存在的clusterrole資源對象。
資源清單書寫格式:
role\clusterrole(兩個role寫法差不多):
1 apiVersion: rbac.authorization.k8s.io/v1 2 kind: ClusterRole 3 metadata: 4 name: smbands-cluster-role 5 rules: 6 - apiGroups: #apigroups是包含資源的apigroup的名稱。如果指定了多個API組,對其中一個將允許任何API組中的枚舉資源。 7 - ""
8 resources: #寫資源類型 9 - pods 10 - services 11 - namespaces 12 verbs: #寫授權動作 13 - get
14 - list 15 - watch 16 - apiGroups: 17 - extensions 18 resources: 19 - deployments 20 verbs: 21 - get
22 - list 23 - watch
rolebinding\clusterrolebinding(兩個binding寫法差不多):
1 apiVersion: rbac.authorization.k8s.io/v1 2 kind: RoleBinding 3 metadata: 4 name: smbands-binding 5 roleRef: 6 apiGroup: rbac.authorization.k8s.io #apigroup是被引用資源的組。 7 kind: ClusterRole #正在引用的資源類型(role或clusterrole)。 8 name: smbands-cluster-role #定義role或clusterrole時定義的資源名稱。 9 subjects: 10 - apiGroup: rbac.authorization.k8s.io #這個apiGroup是參考類,默認對於ServiceAccount是"",默認對於用戶或組是"rbac.authorization.k8s.io"
11 kind: User #用戶類型:User,Group,ServiceAccount. 12 name: smbands #用於綁定的集群中的用戶名。