一、什麼是 k8srbac
k8srbac 全稱 Kubernetes Role-Based Access Control(基於角色的訪問控制),它是 Kubernetes 集群中的一種訪問控制機制。通過 k8srbac,可以在 Kubernetes 集群中實現許可權的細分與管理,從而提高集群的安全性。
二、k8srbac 相關術語
在了解 k8srbac 的細節之前,先來了解 k8srbac 相關的術語。下面列出了 k8srbac 中比較重要的一些角色和資源:
- Subject: 能夠對 Kubernetes 資源進行訪問的主體,可以是一個用戶或者一個服務賬戶。
- Role: 角色代表了一組許可權操作,例如可以創建、更新或刪除一個或多個資源。在 Kubernetes 中,角色只作用於指定的 Namespace。
- ClusterRole: ClusterRole 與 Role 類似,但是作用於整個 Kubernetes 集群。
- RoleBinding: 用於將 Role 與 Subject 進行綁定,從而賦予 Subject 對 Role 所代表的資源的許可權。
- ClusterRoleBinding: 與 RoleBinding 類似,但是作用於整個 Kubernetes 集群,可以將 ClusterRole 與各種 Subject 進行綁定。
三、k8srbac 角色許可權設置示例
下面我們通過一個示例來展示如何使用 k8srbac 角色進行許可權設置。假設我們有一個 Kubernetes 應用,它只需要訪問該 Cluster 的前端應用資源(例如 Ingress 和 Service),不需要訪問其他類型的資源。針對這種場景,我們可以創建如下的 k8srbac 角色:
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: frontend-role rules: - apiGroups: - networking.k8s.io resources: - ingresses verbs: - get - list - watch - apiGroups: - "" resources: - services verbs: - get - list - watch
在上面的 k8srbac 角色定義中,我們設置了兩個規則:
- 允許讀取 Ingress 資源。
- 允許讀取 Service 資源。
接下來,我們需要將該角色與 Subject 綁定起來。假設我們有一個名為 frontend-svcaccount 的 ServiceAccount,可以通過如下的 RoleBinding 進行綁定:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: frontend-rolebinding namespace: default subjects: - kind: ServiceAccount name: frontend-svcaccount apiGroup: "" roleRef: kind: Role name: frontend-role apiGroup: ""
在上面的 RoleBinding 中,我們將 ServiceAccount frontend-svcaccount 與 Role frontend-role 進行了綁定。這樣,frontend-svcaccount 就可以讀取 Ingress 和 Service 資源了。
四、k8srbac ClusterRole 的使用示例
除了使用 Role 進行 Namespace 級別的許可權控制之外,我們還可以使用 ClusterRole 進行 Kubernetes 集群級別的許可權控制。下面我們來看一個例子,假設我們需要給某個賬號(假設該賬號名字為 devops)賦予下列許可權:
- 讀取 Node 資源。
- 讀取 ConfigMap、Secret、Event 和 Pod 資源。
- 讀取、創建和刪除 Namespace 資源。
- 創建、更新和刪除 Pod 和 Service 資源。
- 更新和刪除 Deployment 和 StatefulSet 資源。
我們可以創建如下的 ClusterRole:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devops-cluster-role rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["configmaps", "secrets", "events", "pods"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["namespaces"] verbs: ["get", "create", "delete"] - apiGroups: [""] resources: ["pods", "services"] verbs: ["get", "create", "delete"] - apiGroups: ["apps"] resources: ["deployments", "statefulsets"] verbs: ["update", "delete"]
接下來,我們需要將該 ClusterRole 與 devops 賬號進行綁定。可以通過如下的 ClusterRoleBinding 完成綁定:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devops-clusterrolebinding subjects: - kind: User name: devops apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: devops-cluster-role apiGroup: rbac.authorization.k8s.io
在上面的 ClusterRoleBinding 中,我們將 devops 賬號與 devops-cluster-role 進行了綁定。這樣,devops 賬號就可以讀取和修改被該 ClusterRole 所授權的 Kubernetes 資源了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/257805.html
微信掃一掃
支付寶掃一掃