基于 KubeSphere 的分级管理实践

打印 上一主题 下一主题

主题 532|帖子 532|积分 1596

作者:许伟,航天网信研发工程师
K8s 是容器编排和分布式应用部署领域的领导者,在 K8s 环境中,我们只需要关心应用的业务逻辑,减轻了我们服务器网络以及存储等方面的管理负担。对于一个用户而言,K8s 是一个很复杂的容器编排平台,学习成本非常高。KubeSphere 抽象了底层的 K8s,并进行了高度的产品化,构建了一个全栈的多租户容器云平台,为用户提供了一个健壮、安全、功能丰富、具备极致体验的 Web 控制台,解决了 K8s 使用门槛高和云原生生态工具庞杂等痛点,使我们可以专注于业务的快速迭代,其多维度的数据监控,对于问题的定位,提供了很大的帮助。
为什么要在 KuberSphere 上实现分级管理

在 KubeSphere 中,资源可以在租户之间共享,根据分配的不同角色,可以对各种资源进行操作。租户与资源之间、资源与资源之间的自由度很高,权限粒度也比较大。在我们的系统中,资源是有权限等级的,像是低等级用户可以通过邀请、赋予权限等操作来操作高等级资源,或者像是低等级项目中的 Pod 可以调度到高等级的节点上,对资源。诸如此类跨等级操作资源等问题,我们在 KubeSphere 基础上来实现了分级管理。
什么是分级体系

分级,顾名思义就是按照既定的标准对整体进行分解、分类。我们将其抽象成一个金字塔模型,从地基到塔顶会有很多个层级,我们将公共资源作为金字塔的地基,拥有最高权限的 admin 作为塔顶,其他资源按照权限等级划分成不同等级。低层级资源是不能访问高等级资源,高等级资源可以获取它等级之下的所有资源,构建了这样一个权益递减、层级间隔离的分级体系。

如何实现分级管理

我们定义了一个代表等级的标签 kubernetes.io/level。以一个多节点的集群为例,首先我们会给用户、企业空间、节点等资源打上代表等级的标签。在邀请用户加入企业空间或者项目时,要求加入的企业空间或者项目的等级不得高于用户的等级,同样项目在绑定企业空间时,也要求项目的等级不得高于企业空间的等级,才能对资源进行纳管;我们认为同一项目下的资源的等级是相同的,基于项目创建的负载、Pod、服务等资源的等级跟项目保持一致;同时 Pod 中加入节点亲和性,以使 Pod 调度到不高于其权限等级的节点上。

例如这里,我们创建了一个权限等级是 3 的用户 demo-user,他可以加入权限等级不高于3的企业空间或者项目中。
  1. kind: User
  2. apiVersion: iam.kubesphere.io/v1alpha2
  3. metadata:
  4.   name: demo-user
  5.   labels:
  6.     kubernetes.io/level: 3
  7. spec:
  8.   email: demo-user@kubesphere.io
复制代码
创建一个权限等级是 2 的项目 demo-ns,那么基于项目创建的负载、Pod、存储等资源的权限等级也是 2。
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.    name: demo-ns
  5.    labels:
  6.      kubernetes.io/level: 2
复制代码
基于 demo-ns 项目创建了一个nginx 的 Pod,他的权限等级也是 2,同时加入节点亲和性,要求其调度到权限等级不高于 2 的节点上。
  1. apiVersion: apps/v1
  2. kind: Pod
  3. metadata:
  4.   labels:
  5.     kubernetes.io/level: 2
  6.   name: nginx
  7. spec:
  8.   containers:
  9.   - name: nginx
  10.     image: nginx
  11.     imagePullPolicy: IfNotPresent
  12.     ports:
  13.     - containerPort: 80
  14.       protocol: TCP
  15.   affinity:
  16.     nodeAffinity:
  17.       requiredDuringSchedulingIgnoredDuringExecution:
  18.        nodeSelectorTerms:
  19.         - matchExpressions:
  20.           - key: kubernetes.io/level
  21.             operator: Lt
  22.             values:
  23.             - 2
  24.         - matchExpressions:
  25.           - key: kubernetes.io/level
  26.             operator: In
  27.             values:
  28.             - 2
复制代码
如何实现资源的升降级

在分级管理体系中,支持等级的无限划分,只需要定义一个中间值,就可以在两个等级之间插入一个新的等级,无需操作其他资源;在对资源进行升降级时,只需要修改对应资源的 label 标签,就可以对资源进行升降级操作。当然,在对资源进行升降级的时候,我们需要对资源进行检测,保证升级时,其上层资源的权限等级不得低于目标等级;同时,降级时,其下层资源的权限等级不得高于目标等级。在不满足升降级操作条件时,需要将对应资源也做相应调整才可以。

不同层级间 Pod 的网络隔离

在分级体系中,我们要求高等级的 Pod 能访问低等级的 Pod,但是低等级的 Pod 不能访问高等级的 Pod,那我们需要如何保证不同层级间 Pod 的网络通信呢。
项目在不开启网络隔离的情况下,Pod 间的网络是互通的,所以这里会新增一个黑名单的网络策略。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: deny-all
  5.   namespace: demo-ns
  6.   labels:
  7.     kubernetes.io/level: 2
  8. spec:
  9.   podSelector: {}
  10.   policyTypes:
  11.   - Ingress
复制代码
podSelector:{} 作用于项目中所有 Pod,阻止所有流量的流入。
然后放行标签等级大于目标等级(这里是 2)的流量流入(我们对 Ingress 流量没有做限制)。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: level-match-network-policy
  5.   namespace: demo-ns
  6.   labels:
  7.     kubernetes.io/level: 2
  8. spec:
  9.   podSelector:
  10.     matchExpressions:
  11.     - key: kubernetes.io/level
  12.       operator: Gt
  13.       values:
  14.       - 2
  15.   policyTypes:
  16.   - Ingress
复制代码
总结

KubeSphere 解决了用户构建、部署、管理和可观测性等方面的痛点,它的资源可以在多个租户之间共享。但是在资源有权限等级的场景中,低等级资源可以操作高等级资源,造成资源越权管理的问题。为解决这一问题,我们在 KubeSphere 的基础上进行了改造,以适应租户与资源之间和资源与资源之间的分级管理,同时在项目的网络策略中,增加黑名单和白名单策略,增强了项目间的网络隔离,让资源的管理更安全。
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表