cover_image

Kubernetes 中 RBAC 权限在生产环境中的应用

CX 三七互娱技术团队
2024年11月27日 10:00
01

权限认证体系概述

图片
图片

Kubernetes(K8s)中的权限认证涉及多个组件的安全交互。用户或程序通过 API Server 发送请求,这些请求由 API Server 进行验证和授权,然后将指令下发到对应组件(如 Kubelet)进行实际操作。以下是一个简化的流程图:

图片

简单来说权限认证就是:ApiServer 允许 什么资源,执行什么操作的过程。

  • :请求方,一般是一个服务账号(serviceaccount),可以是程序,也可以是具体的人;

  • 什么资源:k8s集群中的pod、deployment、service、namespace等;

  • 什么操作:查询、修改、删除,也就是 get、list、update、delete等。

02

RBAC 权限的概念

图片
图片

  RBAC(基于角色的访问控制)是 Kubernetes 中用于管理权限的机制。它通过Role和Roleding来控制什么资源,执行什么操作

关键组件

  • ServiceAccount(SA): 服务账号,是集群中程序使用的身份,也就是前面说的 ""。

    Role: 定义权限(在命名空间内级别,针对每个命名空间授权),也就是前面说的 ”什么资源 + 什么操作“。

    RoleBinding: 将 Role(什么资源+什么操作) 和 ServiceAccount() 进行绑定,绑定后,使用SA的程序就具备了Role里定义的权限。

    ClusterRole: 定义权限,和Role的区别在于,clusterrole是在整个集群范围内定义权限,作用于全部命名空间。

    ClusterRoleBinding: 和rolebing的功能一样,是将 ClusterRole 和 ServiceAccount进行绑定,绑定后,使用SA的程序就具备了权限。


图片

Role 权限示例

Role 可以定义多种操作权限,包括但不限于:

  • get: 读取资源。

    list: 列出资源。

    watch: 监听资源变化。

    create: 创建资源。

    update: 更新已有资源。

    patch: 部分更新资源。

    delete: 删除资源。


图片
图片
03

生产环境中的应用

图片
图片

应用一:TCF 框架案例

3.1.1 场景说明

在生产环境中,TCF框架用到了 Pod 之间的长连接方式。Kubernetes 的 Service 默认采用轮询负载均衡,这可能导致负载不均衡。因此,我们需要自行做负载均衡。方法是先获取 被访问的所有Pod 的 IP 地址,并通过业务逻辑进行负载均衡。

如图, Pod A1 A2 A3需要获取Pod B1 B2 B3的IP地址,用于建立长连接实现访问,并且Pod B的IP地址发生变化时,Pod A需要及时更新。

图片
3.1.2 权限需求

为了实现这一点,Pod A需要以下权限

  • Get权限:用于获取 Pod B 的 IP 地址;

  • List权限:用于列出所有需要的Pod B的IP地址;

  • Watch权限:用于监听 Pod B的变动,以便在 Pod B被销毁和重建时更新 IP 地址。

3.1.3 实现步骤
  1. 创建 ServiceAccount(SA):供应用程序A使用,也可以直接使用默认的sa(default),但不推荐,原因是其他所有使用default sa的pod都会具备权限,不符合最小权限原则。

  2. 创建 Role:定义需要的权限(Get 、list 和 Watch)。

  3. 创建 RoleBinding:将 Role 绑定到 SA。

  4. 创建 ClusterRole 和 ClusterRoleBinding(如果需要集群范围的权限):可选。

3.1.4 示例配置

以下是一个完整的 YAML 示例:

图片
3.1.5 创建效果验证

在创建 RoleBinding 之前,可以使用以下命令验证权限:

此命令表示 我用my-app-sa这个服务账号能否执行get pod操作,如果输出yes,表示具有权限,如果输出no, 表示没有权限。

图片

在创建 RoleBinding 之后,再次验证:

图片

应用二:管理员管理集群场景

除了给程序授权,RBAC还可用控制对人的授权。当管理员需要执行kubectl命令的时候,也遵循RBAC权限。那管理员如何使用呢?

3.2.1 场景说明

由于管理员和程序不同,管理员无法直接使用SA,能使用的只有token。此时我们需要为SA创建一个secret,从secret中获取token。

管理员需要执行kubectl命令,那一定少不了 kubeconfig文件。这个文件一般在  ~/.kube/config,其中 client-key-data 这里填的内容就是来自于ServiceAccount的token。拥有这个token即代表拥有管理员权限。

图片

3.2.2 权限需求

admin权限,也就是允许admin用户对 所有资源 可以执行 任何操作。

3.2.3 实现步骤
  1. 创建 ServiceAccount(SA):admin。

  2. 创建 ClusterRole :定义需要的权限为 * 。

  3. 创建 ClusterRoleBinding:将ClusterRole绑定到 SA。

  4. 创建 Secret: 关联上SA,上述的token就是来自这里创建出来的。


创建sa、clusterrole 和 clusterrolebinding的方式和前面的案例是一样的。这里由于k8s集群一般默认已经有 admin的sa、clusterrole 和 clusterrolebinding,我们直接使用就好了。我们只需要从上面第4步开始,创建一个secret,获取到token即可。

图片

保存上述文件为 secret.yaml后,执行 kubectl apply -f secret.yaml即可创建secret

3.2.4 获取token

创建好之后,通过 kubectl get secrets -n kube-system admin-token -oyaml 获取token即可,拿到了token,填入前面kubeconfig中的 client-key-data 部分,即可以管理员的身份执行kubectl命令了。

图片

04

小结

图片
图片

通过以上两个生产环境的案例,介绍了RBAC权限的基本配置和应用。除此之外涉及到K8S中其他需要权限认证的场景也是类似的方式。这种权限管理方式较为灵活,并且也具有较强的系统安全性和可控性,遵循最小权限原则进行授权。


END


三七互娱技术团队

扫码关注 了解更多

图片



继续滑动看下一个
三七互娱技术团队
向上滑动看下一个