Kubernetes多租户实践

news2024/11/17 5:22:18

由于namespace本身的限制,Kubernetes对多租户的支持面临很多困难,本文梳理了K8S多租户支持的难点以及可能的解决方案。原文: Multi-tenancy in Kubernetes

alt

是否应该让多个团队使用同一个Kubernetes集群?

是否能让不受信任的用户安全的运行不受信任的工作负载?

Kubernetes支持多租户吗?

本文将探讨支持多租户的集群所面临的挑战。

多租户可以分为:

  1. 软多租户(Soft multi-tenancy) 适用于租户是可信任的情况,例如同一公司的团队共享集群时。
  2. 硬多租户(Hard multi-tenancy) 适用于租户不可信的情况。

实践中也可能是混合模式!

alt

在租户之间共享集群的基本构建块是命名空间(namespace)。

名称空间对资源进行逻辑分组 —— 不提供任何安全机制,也不能保证所有资源都部署在同一节点中。

alt

命名空间中的pod仍然可以与集群中的所有其他pod通信,向API发出请求,并使用尽可能多的资源。

开箱即用,任何用户都可以访问任何命名空间。

如何阻止访问呢?*

通过RBAC,可以限制用户和应用程序可以使用的命名空间或在命名空间内做什么。[1]

常见操作是向有限的用户授予权限。

alt

使用Quota[2]LimitRanges[3],可以限制在命名空间中部署的资源以及可用的内存、CPU等。

如果想限制租户对其命名空间的操作,这是个好主意。

alt

默认情况下,所有pod都可以与Kubernetes中的任何pod通信。

但这并不适用于多租户,可以用NetworkPolicies[4]来纠正这个问题。

NetworkPolicies类似于防火墙规则,可以隔离出站和入站流量。

alt

很好,命名空间现在安全了吗?

别急。

基于RBAC、NetworkPolicies、Quota等作为多租户的基本构建块还是不够。

Kubernetes还有几个共享组件。

Ingress控制器就是一个很好的例子,通常在每个集群中只会部署一个。

如果提交具有相同路径的Ingress清单,最后一个会覆盖之前的定义,并且只有这一个才会生效。

alt

更好的方法是为每个命名空间部署一个控制器。

另一个有趣的挑战是CoreDNS。

如果某个租户滥用DNS怎么办?

集群的其余部分也将受到影响。

可以用一个额外的插件[https://github.com/coredns/policy](CoreDNS external plugin)来限制请求。

alt

Kubernetes API服务器也面临同样的挑战。

Kubernetes不知道租户,如果API接收到太多请求,将会触发全局流控。

我不知道是否有解决办法!

alt

如果进一步考虑共享资源,那么kubelet和工作负载也存在挑战。

正如Philippe Bogaerts提到的[5],租户可以通过liveness探针接管集群中的节点。

这也不容易解决。

alt

可以将扫描器(linter)作为CI/CD的一部分,或者用准入控制器(admission controller)来验证提交给集群的资源是否安全。

这里是Open Policy Agent的库和规则。[6]

alt

还有隔离机制比虚拟机更弱的容器。

Lewis Denham-Parry在这段视频中展示了如何从容器中逃逸。[7]

如何解决这个问题?

可以用gVisor这样的容器沙箱,或者用轻型虚拟机作为容器(Kata Container,firecracker-containerd)或完整的虚拟机(virtlet作为CRI[8])。

alt

希望你已经意识到这个主题的复杂性,以及在Kubernetes中为隔离网络、工作负载和控制器提供严格的边界是多么困难。

这就是为什么不建议在Kubernetes中提供硬多租户[9]的原因。

如果需要硬多租户,建议使用多集群或集群即服务(Cluster-as-a-Service)工具。

  • Cluster API
  • HyperShift
  • Kamaji
  • Gardener

如果可以容忍较弱的多租户模型,以换取简单性和便利性,那么可以推出RBAC、Quota等规则。

还有一些工具可以把这些问题抽象出来:

  • Virtual Cluster (wg-multitenancy)
  • Vcluster
  • Capsule
  • Kiosk

最后,如果对这个话题感兴趣,可以进一步参考以下资源:

  • 我们在 Learnk8s上举办的Kubernetes研讨会
  • twitter讨论集合
  • 每周发布的 Kubernetes时事通讯 [10]

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

参考资料
[1]

Limiting access to Kubernetes resources with RBAC: https://learnk8s.io/rbac-kubernetes

[2]

Resource Quotas: https://kubernetes.io/docs/concepts/policy/resource-quotas

[3]

Limit Ranges: https://kubernetes.io/docs/concepts/policy/limit-range

[4]

Kubernetes Network Policy Recipes: https://github.com/ahmetb/kubernetes-network-policy-recipes

[5]

Exploiting applications using liveness probes in Kubernetes: https://xxradar.medium.com/exploiting-applications-using-livenessprobes-in-kubernetes-cdff6329d320

[6]

OPA Gatekeeper Library: https://github.com/open-policy-agent/gatekeeper-library

[7]

What vulnerabilities? Live hacking of containers and orchestrators - Lewis Denham-Parry: https://www.youtube.com/watch?v=JaMJJTb_bEE

[8]

virtlet: https://github.com/Mirantis/virtlet

[9]

Hard Multi-Tenancy in Kubernetes: https://blog.jessfraz.com/post/hard-multi-tenancy-in-kubernetes

[10]

Learn Kubernetes Weekly: https://learnk8s.io/learn-kubernetes-weekly

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1414048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JaveWeb教程】(28)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(1)

目录 SpringBootWeb案例011. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理 SpringBootWeb案例01 前面我们已经讲解了Web前端开发的基础知识,也讲解了Web后端开发的基础(HTTP协议、请求响应),并且也讲解了数据库…

JavaWeb:商品管理系统(Vue版)

文章目录 1、功能介绍2、技术栈3、环境准备3.1、数据库准备3.2、在新建web项目中导入依赖3.3、编写Mybatis文件3.4、编写pojo类3.5、编写Mybatis工具类3.6、导入前端素材(element-ui & vue.js & axios.js)3.7、前端页面 4、功能实现4.1、查询所有…

ChatGPT惊艳更新!一个@让三百万GPTs为你打工

ChatGPT悄悄更新个大功能!看起来要把插件系统迭代掉了。 部分(灰度)用户已经收到这样的提示: 现在可以在对话中任意GPT商店里的GPTs,就像在群聊中一个人。 体验到的博主Dan Shipper第一时间录视频激动地分享:一个改变游戏规则的…

Jenkins邮件推送配置

目录 涉及Jenkins插件: 邮箱配置 什么是授权码 在第三方客户端/服务怎么设置 IMAP/SMTP 设置方法 POP3/SMTP 设置方法 获取授权码: Jenkins配置 从Jenkins主面板System configuration>System进入邮箱配置 在Email Extension Plugin 邮箱插件…

excel中多行合并后调整行高并打印

首先参考该文,调整全文的行高。 几个小技巧: 1.转换成pdf查看文件格式 2.通过视图--》分页预览,来确定每页的内容(此时页码会以水印的形式显示) 3. 页面布局中的,宽度可以选为自动,因为已经是…

C# .Net6搭建灵活的RestApi服务器

1、准备 C# .Net6后支持顶级语句,更简单的RestApi服务支持,可以快速搭建一个极为简洁的Web系统。推荐使用Visual Studio 2022,安装"ASP.NET 和Web开发"组件。 2、创建工程 关键步骤如下: 包添加了“Newtonsoft.Json”&…

锂电池升6V输出3A芯片。2.7v-5.5v输入,输出6v给马达供电

锂电池升压输出芯片是一种常见的电子元件,广泛应用于各种电子设备中。本文将介绍一款锂电池升压输出芯片,AH8681可以将2.7V-5.5V的输入电压升压至6V,电流可达3A,内置MOS管。 该锂电池升压输出芯片具有以下特点: 1. 输…

蓝桥杯备战——6.串口通讯

1.分析原理图 由上图我们可以看到串口1通过CH340接到了USB口上,通过串口1我们就能跟电脑进行数据交互。 另外需要注意的是STC15F是有两组高速串口的,而且可以切换端口。 2.配置串口 由于比赛时间紧,我们最好不要去现场查寄存器手册&#x…

Redis学习——入门篇③

Redis学习——入门篇③ 1. Redis事务1.1 事务实际操作1.2 watch 2. Redis管道(pipelining)2.1 管道简介2.2 管道实际操作2.3 管道小总结 3. Redis(pub、sub)发布订阅(不重要)3.1 简介3.2 发布订阅实际操作 这是一个分水岭…

uniapp 实现路由拦截,权限或者登录控制

背景: 项目需要判断token,即是否登录,登录之后权限 参考uni-app官方: 为了兼容其他端的跳转权限控制,uni-app并没有用vue router路由,而是内部实现一个类似此功能的钩子:拦截器,由…

Jmeter连接数据库报错Cannot load JDBC driver class‘com.mysql.jdbc.Driver’解决

问题产生: 我在用jmeter连接数据库查询我的接口是否添加数据成功时,结果树响应Cannot load JDBC driver class com.mysql.jdbc.Driver 产生原因: 1、连接数据库的用户密码等信息使用的变量我放在了下面,导致没有取到用户名密码IP等信息,导致连接失败 2、jmeter没有JDB…

echarts 柱状图数据过多时自动滚动

当我们柱状图中X轴数据太多的时候,会自动把柱形的宽度挤的很细,带来的交互非常不好,我们可以用dataZoom属性来解决 简易的版本,横向滚动。 option.dataZoom [{type: "slider",show: true,startValue: 0, //数据窗口范…

对接京东SDK踩坑

背景 最近刚好需要对接京东本地生活,部分接口和数据可以直接对接京东的开放平台,有一些敏感数据需要在京东云鼎上面入驻,然后在鼎内做一些业务逻辑,然后再将数据做一个转发,然后踩了一个坑就是京东SDK打包时未打包依赖…

C语言第十弹---函数(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 函数 1、函数的概念 2、库函数 2.1、标准库和头文件 2.2、库函数的使用方法 2.2.1、功能 2.2.2、头文件包含 2.2.3、实践 2.2.4、库函数文档的⼀般格式 …

C++实现推箱子游戏

推箱子游戏 运行之后的效果如视频所示,在完成游戏后播放音乐 准备工作:建立一个新的文件夹,并在文件夹中任意增加一张背景图片,以及各个部件的照片文件 因为这里用到了贴图技术,要使用graphic.h这个函数&#xff0c…

【DeepLearning-8】MobileViT模块配置

完整代码: import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

C/C++:混肴点分析

C中的常量介绍 字面常量 字面常量是指直接出现在代码中的常量值。例如,整数常量10、浮点数常量3.14、字符常量A等都属于字面常量。字面常量的值在编译时就已经确定,并且不能被修改。 字面常量存在类型,但没有地址 注意字符常量和只包含一个字…

关于我写过那些MySQL专栏

写在文章开头 这是截至今日写过的文章汇总,对于关注笔者公众号有一段时间的读者都知道,笔者会每周对自己写过的文章整理至相关专栏,以便读者可以按需进行检索阅读。 你好,我叫sharkchili,目前还是在一线奋斗的Java开…

免费开源的微信小程序源码、小游戏源码精选70套!

微信小程序已经成为我们日常的一部分了,也基本是每个程序员都会涉及的内容,今天给大家分享从网络收集的70个小程序源码。其中这些源码包含:小游戏到商城小程序,再到实用的工具小程序,以及那些令人惊叹的防各大站点的小…

Docker数据卷操作 Docker挂载Nginx、MySQL数据卷

容器与数据(容器内文件)耦合: 不便于修改:如果需要修改配置文件,需要进入容器的内部。数据不可复用:容器内的修改对外不可见,无法复用。升级维护困难:如果想要升级容器,…