Kubernetes(K8s)中的权限认证涉及多个组件的安全交互。用户或程序通过 API Server 发送请求,这些请求由 API Server 进行验证和授权,然后将指令下发到对应组件(如 Kubelet)进行实际操作。以下是一个简化的流程图:
简单来说权限认证就是:ApiServer 允许 谁 对什么资源,执行什么操作的过程。
谁:请求方,一般是一个服务账号(serviceaccount),可以是程序,也可以是具体的人;
什么资源:k8s集群中的pod、deployment、service、namespace等;
什么操作:查询、修改、删除,也就是 get、list、update、delete等。
RBAC(基于角色的访问控制)是 Kubernetes 中用于管理权限的机制。它通过Role和Roleding来控制 谁 对什么资源,执行什么操作。
ServiceAccount(SA): 服务账号,是集群中程序使用的身份,也就是前面说的 "谁"。
Role: 定义权限(在命名空间内级别,针对每个命名空间授权),也就是前面说的 ”什么资源 + 什么操作“。
RoleBinding: 将 Role(什么资源+什么操作) 和 ServiceAccount(谁) 进行绑定,绑定后,使用SA的程序就具备了Role里定义的权限。
ClusterRole: 定义权限,和Role的区别在于,clusterrole是在整个集群范围内定义权限,作用于全部命名空间。
ClusterRoleBinding: 和rolebing的功能一样,是将 ClusterRole 和 ServiceAccount进行绑定,绑定后,使用SA的程序就具备了权限。
Role 可以定义多种操作权限,包括但不限于:
get: 读取资源。
list: 列出资源。
watch: 监听资源变化。
create: 创建资源。
update: 更新已有资源。
patch: 部分更新资源。
delete: 删除资源。
在生产环境中,TCF框架用到了 Pod 之间的长连接方式。Kubernetes 的 Service 默认采用轮询负载均衡,这可能导致负载不均衡。因此,我们需要自行做负载均衡。方法是先获取 被访问的所有Pod 的 IP 地址,并通过业务逻辑进行负载均衡。
如图, Pod A1 A2 A3需要获取Pod B1 B2 B3的IP地址,用于建立长连接实现访问,并且Pod B的IP地址发生变化时,Pod A需要及时更新。
为了实现这一点,Pod A需要以下权限
Get权限:用于获取 Pod B 的 IP 地址;
List权限:用于列出所有需要的Pod B的IP地址;
Watch权限:用于监听 Pod B的变动,以便在 Pod B被销毁和重建时更新 IP 地址。
创建 ServiceAccount(SA):供应用程序A使用,也可以直接使用默认的sa(default),但不推荐,原因是其他所有使用default sa的pod都会具备权限,不符合最小权限原则。
创建 Role:定义需要的权限(Get 、list 和 Watch)。
创建 RoleBinding:将 Role 绑定到 SA。
创建 ClusterRole 和 ClusterRoleBinding(如果需要集群范围的权限):可选。
以下是一个完整的 YAML 示例:
在创建 RoleBinding 之前,可以使用以下命令验证权限:
此命令表示 我用my-app-sa这个服务账号能否执行get pod操作,如果输出yes,表示具有权限,如果输出no, 表示没有权限。
在创建 RoleBinding 之后,再次验证:
除了给程序授权,RBAC还可用控制对人的授权。当管理员需要执行kubectl命令的时候,也遵循RBAC权限。那管理员如何使用呢?
由于管理员和程序不同,管理员无法直接使用SA,能使用的只有token。此时我们需要为SA创建一个secret,从secret中获取token。
管理员需要执行kubectl命令,那一定少不了 kubeconfig文件。这个文件一般在 ~/.kube/config,其中 client-key-data 这里填的内容就是来自于ServiceAccount的token。拥有这个token即代表拥有管理员权限。
admin权限,也就是允许admin用户对 所有资源 可以执行 任何操作。
创建 ServiceAccount(SA):admin。
创建 ClusterRole :定义需要的权限为 * 。
创建 ClusterRoleBinding:将ClusterRole绑定到 SA。
创建 Secret: 关联上SA,上述的token就是来自这里创建出来的。
创建sa、clusterrole 和 clusterrolebinding的方式和前面的案例是一样的。这里由于k8s集群一般默认已经有 admin的sa、clusterrole 和 clusterrolebinding,我们直接使用就好了。我们只需要从上面第4步开始,创建一个secret,获取到token即可。
保存上述文件为 secret.yaml后,执行 kubectl apply -f secret.yaml即可创建secret
创建好之后,通过 kubectl get secrets -n kube-system admin-token -oyaml 获取token即可,拿到了token,填入前面kubeconfig中的 client-key-data 部分,即可以管理员的身份执行kubectl命令了。
通过以上两个生产环境的案例,介绍了RBAC权限的基本配置和应用。除此之外涉及到K8S中其他需要权限认证的场景也是类似的方式。这种权限管理方式较为灵活,并且也具有较强的系统安全性和可控性,遵循最小权限原则进行授权。
扫码关注 了解更多