kubernetes的API Server經常使用的受權插件有:
Node、ABAC、RBAC、Webhook
咱們重點說一下RBAC的訪問控制邏輯
RBAC(Role base access control)基於角色的訪問控制
涉及到的資源類型:
Role #角色,基於名稱空間下的資源
RoleBinding #角色綁定,基於名稱空間下的資源
ClusterRole #集羣角色,基於集羣級別下的資源
ClusterRoleBinding #集羣角色綁定,基於集羣級別下的資源
其中,Role和Role是針對於名稱空間級別,授予其所在名稱空間範圍內的許可權限。
而ClusterRole和ClusterRoleBinding是針對於集羣級別,授予其所在集羣範圍內的許可權限。
原理如圖:html
1.將user1經過rolebinding綁定到role,則該用戶將擁有role定義的權限,但操做範圍只能是role所在的名稱空間。
2.將user2經過clusterrolebinding綁定到clusterrole,則該用戶擁有clusterrole定義的權限,操做範圍是clusterrole所在集羣。
3.將user3經過rolebinding綁定到clusterrole,則該用戶擁有clusterrole定義的權限,但操做範圍只能是rolebinding所在名稱空間。
使用 k8s資源配置清單的書寫格式(yaml文件)的便捷方法,快速獲取資源清單的基本框架:
api
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 #用於綁定的集羣中的用戶名。