作者:许伟,航天网信研制工程师

K8s 是容器编列和分布式应用布置范畴的领导者,在 K8s 环境中,咱们只需求关怀应用的事务逻辑,减轻了咱们服务器网络以及存储等方面的办理负担。关于一个用户而言,K8s 是一个很复杂的容器编列渠道,学习本钱非常高。KubeSphere 笼统了底层的 K8s,并进行了高度的产品化,构建了一个全栈的多租户容器云渠道,为用户供给了一个强健、安全、功能丰厚、具有极致体会的 Web 控制台,解决了 K8s 运用门槛高和云原生生态东西杂乱等痛点,使咱们能够专注于事务的快速迭代,其多维度的数据监控,关于问题的定位,供给了很大的帮助。

为什么要在 KuberSphere 上完成分级办理

在 KubeSphere 中,资源能够在租户之间共享,依据分配的不同角色,能够对各种资源进行操作。租户与资源之间、资源与资源之间的自由度很高,权限粒度也比较大。在咱们的系统中,资源是有权限等级的,像是低等级用户能够经过约请、赋予权限等操作来操作高等级资源,或许像是低等级项目中的 Pod 能够调度到高等级的节点上,对资源。诸如此类跨等级操作资源等问题,咱们在 KubeSphere 基础上来完成了分级办理。

什么是分级系统

分级,顾名思义就是依照既定的标准对整体进行分化、分类。咱们将其笼统成一个金字塔模型,从地基到塔顶会有很多个层级,咱们将公共资源作为金字塔的地基,具有最高权限的 admin 作为塔顶,其他资源依照权限等级划分红不同等级。低层级资源是不能拜访高等级资源,高等级资源能够获取它等级之下的一切资源,构建了这样一个权益递减、层级间阻隔的分级系统。

基于 KubeSphere 的分级管理实践

怎么完成分级办理

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

基于 KubeSphere 的分级管理实践

例如这儿,咱们创立了一个权限等级是 3 的用户 demo-user,他能够参加权限等级不高于3的企业空间或许项目中。

kind: User
apiVersion: iam.kubesphere.io/v1alpha2
metadata:
  name: demo-user
  labels:
    kubernetes.io/level: 3
spec:
  email: demo-user@kubesphere.io

创立一个权限等级是 2 的项目 demo-ns,那么根据项目创立的负载、Pod、存储等资源的权限等级也是 2。

apiVersion: v1
kind: Namespace
metadata:
   name: demo-ns
   labels:
     kubernetes.io/level: 2

根据 demo-ns 项目创立了一个nginx 的 Pod,他的权限等级也是 2,一起参加节点亲和性,要求其调度到权限等级不高于 2 的节点上。

apiVersion: apps/v1
kind: Pod
metadata:
  labels:
    kubernetes.io/level: 2
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      protocol: TCP
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
       nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/level
            operator: Lt
            values:
            - 2
        - matchExpressions:
          - key: kubernetes.io/level
            operator: In
            values:
            - 2

怎么完成资源的升降级

在分级办理系统中,支持等级的无限划分,只需求定义一个中间值,就能够在两个等级之间刺进一个新的等级,无需操作其他资源;在对资源进行升降级时,只需求修正对应资源的 label 标签,就能够对资源进行升降级操作。当然,在对资源进行升降级的时候,咱们需求对资源进行检测,确保升级时,其上层资源的权限等级不得低于方针等级;一起,降级时,其基层资源的权限等级不得高于方针等级。在不满足升降级操作条件时,需求将对应资源也做相应调整才能够。

基于 KubeSphere 的分级管理实践

不同层级间 Pod 的网络阻隔

在分级系统中,咱们要求高等级的 Pod 能拜访低等级的 Pod,可是低等级的 Pod 不能拜访高等级的 Pod,那咱们需求怎么确保不同层级间 Pod 的网络通信呢。

项目在不开启网络阻隔的情况下,Pod 间的网络是互通的,所以这儿会新增一个黑名单的网络战略。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: demo-ns
  labels:
    kubernetes.io/level: 2
spec:
  podSelector: {}
  policyTypes:
  - Ingress

podSelector:{} 作用于项目中一切 Pod,阻挠一切流量的流入。

然后放行标签等级大于方针等级(这儿是 2)的流量流入(咱们对 Ingress 流量没有做限制)。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: level-match-network-policy
  namespace: demo-ns
  labels:
    kubernetes.io/level: 2
spec:
  podSelector:
    matchExpressions:
    - key: kubernetes.io/level
      operator: Gt
      values:
      - 2
  policyTypes:
  - Ingress

总结

KubeSphere 解决了用户构建、布置、办理和可观测性等方面的痛点,它的资源能够在多个租户之间共享。可是在资源有权限等级的场景中,低等级资源能够操作高等级资源,造成资源越权办理的问题。为解决这一问题,咱们在 KubeSphere 的基础上进行了改造,以适应租户与资源之间和资源与资源之间的分级办理,一起在项目的网络战略中,添加黑名单和白名单战略,增强了项目间的网络阻隔,让资源的办理更安全。

本文由博客一文多发渠道 OpenWrite 发布!