Kubernetes 是一个强大的容器编排平台,能够满足不同规模的应用部署需求。在企业级应用中,安全和权限控制是 Kubernetes 中的一个重要环节。RBAC 是 Kubernetes 中使用的一种权限控制机制,它可以实现精确的访问控制和权限管理,保护 Kubernetes 集群中的服务和数据。
什么是 RBAC
RBAC (Role Based Access Control)是指基于角色的访问控制。在 Kubernetes 中,RBAC 可以由系统管理员对集群中的资源进行授权,来限制用户或者其他服务对指定的资源的访问权限。通过 RBAC,管理员可以建立一系列角色,并授予不同的权限,然后将角色与用户或者服务进行绑定,从而实现资源的细粒度访问控制。
角色
Kubernetes 的 RBAC 机制中可以主要分为三种角色:
- Role:表示在单个命名空间内某些资源上的一组动作,比如创建、删除、查看等操作。Role 只能在命名空间内使用,其定义的权限不能跨越命名空间。Role 可以添加和删除权限,但不能修改现有的权限。
- ClusterRole:表示在整个集群内某些资源上的一组动作,比如创建、删除、查看等操作。ClusterRole 可以跨命名空间使用,其定义的权限可以覆盖整个集群,在所有命名空间中都可以使用。ClusterRole 可以添加和删除权限,但不能修改现有的权限。
- RoleBinding:将 Role 与用户或群组进行绑定。绑定表示该用户或群组可以对指定的资源执行 Role 定义的一组动作。同一个 RoleBinding 可以绑定多个 Role,如需同时绑定多种权限,可以创建多个 RoleBinding。
权限
Kubernetes 中的权限定义了可以执行的任务和能够访问的资源,以及哪些命名空间和用户可以执行。权限定义可以包括以下内容:
- 他们可以操作的资源和动词。
- 指定资源的 API 组。
- 指定资源的 API 版本。
- 指定资源的命名空间或集群范围。
部署 RBAC
在 Kubernetes 中启用 RBAC 需要管理员的授权和部署。首先,需要设置 Kubernetes API server 来使用 RBAC,并启用授权模式,以验证用户或服务的请求。看下面的 yaml 文件,这是一种配置 Kubernetes API server 的方式:
-- -------------------- ---- ------- ----------- -- ----- ------ ------ - ----- -------- ----- ------ ----------------- --------- - ----- --------------- -------- ------- --------------------------------------------- ---------------------- ----------------------- --------- - ----- ------------------------ -------- -------- --------------- ----- -------- ---------------- ------------------------
上述 YAML 表示的是 Kubernetes API server 的配置文件,其中包含了用户和用户的凭证、服务器和节点的配置以及不同运行哪些应用程序的上下文。通过这种配置方式,系统管理员就可以对 Kubernetes 集群中的资源进行访问控制。
创建 Role
在 Kubernetes 中创建 Role 时,需要考虑以下因素:
- 该 Role 只应在哪些 Namespace 中使用。
- 该 Role 应仅限于哪些资源类型。
- 该 Role 所需的 API 版本。
下面是一个名为 demo-role 的 Role YAML 文件示例,其中定义的请求类型是 GET 和 POST,命名空间为 mynamespace,资源类型为 pod:
-- -------------------- ---- ------- ----- ---- ----------- ---------------------------- --------- ----- --------- ---------- ----------- ------ - ---------- ---- ---------- -------- ------ ------- -------
创建 Role 使用 kubectl apply -f FILENAME 命令。
创建 ClusterRole
创建 ClusterRole 类似于创建 Role,唯一的区别是,创建的是跨越整个集群的角色,并且不会在命名空间中使用。 ClusterRole 可以对整个资源库执行授权操作。下面是一个名为 demo-clusterrole 的 ClusterRole YAML 文件示例:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: demo-clusterrole rules: - apiGroups: [""] resources: ["namespaces", "pods", "services"] verbs: ["get", "post", "delete"]
在创建完毕后,使用 kubectl apply -f FILENAME 命令在 Kubernetes 中创建。
创建 RoleBinding
当 Role 或 ClusterRole 已经定义时,就可以创建 RoleBinding 了。 RoleBinding 将用户、群组或 ServiceAccount 与 RBAC 角色绑定起来,这些用户、群组或 ServiceAccount 使用绑定的权限来访问 Kubernetes 集群资源。
示例
RBAC 配置完成后,可以使用命令来模拟 RBAC 的授权过程。下面是一个管理员在默认命名空间中创建 Role,然后使用 RoleBinding 给 ServiceAccount 创建访问权限:
- 创建 role.yaml 文件
-- -------------------- ---- ------- ----- ---- ----------- --------------------------------- --------- ---------- ------- ----- ---------- ------ - ---------- - -- ---------- - ----------- - -------- - --------- - ------- ------ - --- - ---- - -----
- 创建 Role 角色并授权到指定用户
$ kubectl create -f role.yaml
- 创建 ServiceAccount
$ kubectl create sa api-access-serviceaccount
- 创建 RoleBinding
$ kubectl create rolebinding api-access --namespace default --role api-access --serviceaccount default:api-access-serviceaccount
这将覆盖 default 命名空间的所有服务,而 ServiceAccount 仅有到 Role 指定的 API 组的访问权限。启用 RBAC 后,Kubernetes 集群的资源将得到更好的保护和控制。
总结
Kubernetes 中的 RBAC 是一种强大的安全控制机制,可以有效地保护 Kubernetes 集群资源的安全。本文对 RBAC 机制的角色、权限以及配置作了详细的介绍,对部署和使用 Kubernetes 的用户有很好的学习和指导作用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ead527f6b2d6eab3597948