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

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

为什么要在 KuberSphere 上实现分级管理

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

什么是分级体系

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

如何实现分级管理

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

例如这里,我们创建了一个权限等级是 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 标签,就可以对资源进行升降级操作。当然,在对资源进行升降级的时候,我们需要对资源进行检测,保证升级时,其上层资源的权限等级不得低于目标等级;同时,降级时,其下层资源的权限等级不得高于目标等级。在不满足升降级操作条件时,需要将对应资源也做相应调整才可以。

不同层级间 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 发布!

基于 KubeSphere 的分级管理实践的更多相关文章

  1. 智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台

    背景 从传统运维到容器化的 Docker Swarm 编排,从 Docker Swarm 转向 Kubernetes,然后在 Kubernetes 运行 SpringCloud 微服务全家桶,到最终拥 ...

  2. 基于 GraphQL 的 BFF 实践

    随着软件工程的发展,系统架构越来越复杂,分层越来越多,分工也越来越细化.我们知道,互联网是离用户最近的行业,前端页面可以说无时无刻不在变化.前端本质上还是用户交互和数据展示,页面的高频变化意味着对数据 ...

  3. 基于 MySQL 的数据库实践(基本查询)

    首先根据准备工作中的操作导入大学模式,打开数据库连接后进入到 MySQL 的交互界面,再使用命令 use db-book; 切换到 db-book 数据库. 单关系查询 SQL 查询的基本结构由三个子 ...

  4. 3D GIS 应用开发 —— 基于 Mapbox GL 的实践总结

    最近在折腾的 web 端的可视化项目,由于相关业务的需要,用到了 Mapbox 这一地图开发的神器.在此先奉上一个基于mapbox-gl实现的demo(来源:uber的deck.gl项目): 下面我们 ...

  5. jenkins X实践系列(2) —— 基于jx的DevOps实践

    jx是云原生CICD,devops的一个最佳实践之一,目前在快速的发展成熟中.最近调研了JX,这里为第2篇,使用已经安装好的jx来实践CICD,旨在让大家了解基于jx的DevOps是如何运转的,感兴趣 ...

  6. 中小团队基于Docker的devops实践

    笔者所在的技术团队负责了数十个项目的开发和维护工作,每个项目都至少有dev.qa.hidden.product四个环境,数百台机器,在各个系统之间疲于奔命,解决各种琐碎的问题,如何从这些琐碎的事情中解 ...

  7. 基于 KubeSphere CI/CD 将 Spring Boot 项目发布至 Kubernetes

    本示例基于开源的 KubeSphere 容器平台 演示如何通过 GitHub 仓库中的 Jenkinsfile 来创建流水线,流水线共包括 8 个阶段,最终将一个 Hello World 页面部署到 ...

  8. KubeSphere 日志备份与恢复实践

    为什么需要日志备份 KubeSphere 日志系统使用 Fluent Bit + ElasticSearch 的日志采集存储方案,并通过 Curator 实现对 Index 的生命周期管理,定期清理久 ...

  9. 2018-2019-2 20165330《网络对抗技术》Exp10 Final 基于PowerShell的渗透实践

    目录 实验内容 实验步骤 实验中遇到的问题 实验总结与体会 实验内容 PoweShell简介 PowerShell入门学习 PowerShell渗透工具介绍 相关渗透实践分析 ms15-034之Pow ...

  10. 前端开发:基于cypress的自动化实践

    作为一个伪开发,在一个平台项目中负责前端的开发工作,开发框架为vue,本文我会站在前端开发的角度介绍,我是如何使用cypress的. [x] 如何在vue中使用cypress [x] 如何运行cypr ...

随机推荐

  1. 世界机器人大会 —— 人形机器人(humanoid)、双足机器人、四足机器人 —— 我国最大的机器人展览会

    相关资料: https://www.bilibili.com/video/BV1iG411g7B4/ https://www.youtube.com/watch?v=8cJV08MTwA0 官网主页: ...

  2. 有没有使用过MindSpore的,体验怎么样啊?

    看到了一个帖子: https://www.zhihu.com/question/386352303/answer/3160948468 ================================ ...

  3. 为什么被要求避免使用orcid

    前段时间收到了最高机构的通知,要求不要使用orcid,并对之前使用的情况进行自查.得到这个通知,我其实还是蛮无感的,毕竟我一篇论文也没法过,而且也没有用过这个orcid,虽然我自己也是有这个的. 关于 ...

  4. 【导师招募】Apache DolphinScheduler 社区又又又入选开源之夏啦!

    很高兴和大家宣布,Apache DolphinScheduler 社区今年再次成功入选入选由中国科学院软件研究所开源软件供应链点亮计划发起的"开源之夏"活动. 入选公示链接:htt ...

  5. Camera | 12.瑞芯微摄像头自动焦距马达驱动移植

    本为你主要讲解如何让摄像头ov13850支持自动对焦功能. 摄像头的对角主要通过VCM马达驱动芯片DW9714来实现的. 一.环境 soc : rk3568 board: EVB1-DDR4-V10 ...

  6. C#反射在数据库连接时的应用

    反射的应用 1.查找指定ID的数据 //查找指定id的数据,返回指定的对象 private T FindData<T>(int id) { Type ty = typeof(T); //在 ...

  7. Win32 动态库dll

    这两天学习动态库的练习,分享下方法 实例.封装窗口类的两种状态. 1.自定义窗口类QWnd 2.资源模板窗口对话框类 下面是dll的头文件,类的声明 #pragma once #ifndef _CLA ...

  8. 讲讲Java的序列化反序列化?

    序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 什么时候会用到 当只在本地 JVM 里运行下 Java 实例,这个时候是不需要什么序列化 ...

  9. freertos学习笔记(十一)直接任务通知

    直接任务通知 起源 队列和信号量是实时操作系统的典型功能,而FreeRTOS提供的直接任务通知比队列和信号量更小且速度更快(快45%) 开发人员应优先使用量身定制的功能:直接任务通知.消息缓冲区和流缓 ...

  10. 使用Pandas和NumPy实现数据获取

    公众号本文地址:https://mp.weixin.qq.com/s/Uc4sUwhjLTpOo85ubj0-QA 以某城市地铁数据为例,通过提取每个站三个月15分钟粒度的上下客量数据,展示Panda ...