当前位置: 首页 > news >正文

Kubernetes多租户实践

由于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.lryc.cn/news/286181.html

相关文章:

  • 【GEE】GEE反演地表温度相关问题说明(空洞、Landsat9数据集等)
  • 【蓝桥备赛】数组分割——组合数学?
  • iphone5s基带部分电源部分主主电源供电及
  • 【每日一题】按分隔符拆分字符串
  • spawn_group_template | spawn_group | linked_respawn
  • 软考系分之计算机网络规划设计、综合布线、RAID和网络存储等
  • 使用ElEment组件实现vue表单校验空值
  • processing集训day01
  • java面试——juc篇
  • CSS 实现卡片以及鼠标移入特效
  • 芯课堂 | SWM34S系列驱动TFT-LCD显示模组应用基本注意事项
  • java8 列表通过 stream流 根据对象属性去重的三种实现方法
  • 鸿蒙开发DevEco Studio Setup 工具认识及使用
  • 程序员裁员潮:技术变革下的职业危机
  • Cesium快速入门
  • Android.mk和Android.bp的区别和转换详解
  • 卡尔曼滤波器原理By_DR_CAN 学习笔记
  • 013 异常
  • 微服务Spring Cloud架构详解
  • 推荐一一款小众黑科技工具,低调使用建议收藏
  • HiP框架:多AI模型联手,助力机器人驾驭复杂规划大局
  • 关于OC中变量相关知识点
  • 机器学习分类模型评价指标总结(准确率、精确率、召回率、Fmax、TPR、FPR、ROC曲线、PR曲线,AUC,AUPR)
  • go语言(十一)----面向对象继承
  • 一款自动化提权工具
  • 【Qt】最详细教程,如何从零配置Qt Android安卓环境
  • spring与spring boot的区别
  • http网络编程——在ue5中实现文件传输功能
  • JVM之java内存区域[2](堆、方法区、直接内存)
  • k8s-kubectl常用命令