Kubernetes 的三种租户模型

作者: Ryan Bezdicek(Medtronic)、Jim Bugwadia(Nirmata)、Tasha Drew(VMware)、Fei Guo(阿里巴巴)、Adrian Ludwin(谷歌)

Kubernetes 集群通常由组织中的几个团队使用。在其他情况下,Kubernetes 可能用于向最终用户交付应用程序,这些用户需要对来自不同组织的用户之间的资源进行分割和隔离。在这两种情况下,Kubernetes 控制平面和工作节点资源的安全共享允许最大限度地提高生产率和节约成本。

Kubernetes 多租户工作组负责为 Kubernetes 定义租户模型,并简化与租户相关的用例的操作。这篇来自工作组成员的博文描述了三种常见的租户模型,并介绍了相关的工作组项目。

我们还将在 2021 年欧洲 Kubecon 小组会议上(Multi-tenancy vs. Multi-cluster: When Should you Use What?^[1]^)介绍这方面的内容,并讨论不同的用例。

命名空间即服务

使用命名空间即服务模型,租户共享集群,租户工作负载被限制为分配给租户的一组命名空间。集群控制平面资源(如 API 服务器和调度器),以及工作节点资源(如 CPU、内存等)可供所有租户使用。

为了隔离租户工作负载,每个命名空间还必须控制:

  • 角色绑定^[2]^:用于控制对命名空间的访问

  • 网络策略^[3]^:防止跨租户的网络流量

  • 资源配额^[4]^:限制资源的使用,保证跨租户的公平

使用此模型,租户共享集群范围内的资源,如 ClusterRoles 和 CustomResourceDefinitions(CRDs),因此不能创建或更新这些集群范围内的资源。

层次结构命名空间控制器(HNC)^[5]^项目允许用户在命名空间下创建额外的命名空间,并在命名空间层次结构中传播资源,从而使管理基于命名空间的租户变得更加容易。这允许租户使用自助命名空间,而不需要集群范围的权限。

多租户基准测试(MTB)^[6]^项目提供基准测试和命令行工具,该工具可以执行一些配置和运行时检查,以报告租户命名空间是否适当隔离,以及是否实现了必要的安全控制。

集群即服务

使用集群即服务使用模型,每个租户都有自己的集群。此模型允许租户拥有集群范围内不同版本的资源(如 CRD),并提供对 Kubernetes 控制平面的完全隔离。

租户集群可以使用Cluster API (CAPI)^[7]^等项目来创建,在这些项目中,管理集群(management cluster)用于创建多个工作负载集群。将工作负载集群分配给租户,租户可以完全控制集群资源。注意,在大多数企业中,中央平台团队可能负责管理所需的附加服务(如安全性和监视服务),并提供集群生命周期管理服务(如补丁和升级)。租户管理员可能无法修改集中管理的服务和其他关键集群信息。

控制平面即服务

在集群即服务模型的一种变体中,租户集群可能是一个虚拟集群,其中每个租户拥有自己专用的 Kubernetes 控制平面,但共享工作节点资源。与其他形式的虚拟化一样,虚拟集群的用户认为虚拟集群和其他 Kubernetes 集群之间没有显著差异。这有时被称为控制平面即服务(CPaaS)。

这种类型的虚拟集群共享工作节点资源和独立于工作负载状态的控制平面组件,比如调度器。其他工作负载感知的控制平面组件(如 API server)是在每个租户的基础上创建的,以允许重叠,其他组件用于跨每个租户控制平面和底层共享集群资源同步和管理状态。有了这个模型,用户可以管理他们自己的集群范围的资源。

虚拟集群^[8]^项目实现了这个模型,其中一个超级集群(supercluster)由多个虚拟集群共享。Cluster API Nested^[9]^项目扩展了这项工作,以符合 CAPI 模型,允许使用熟悉的 API 资源来创建和管理虚拟集群。

安全注意事项

云原生安全涉及不同的系统层和生命周期阶段,如 CNCF SIG Security 的云原生安全白皮书^[10]^所述。如果没有跨所有层和阶段实现适当的安全措施,Kubernetes 租户隔离可能会受到破坏,一个租户的安全漏洞可能会威胁到其他租户。

Kubernetes 的任何新用户都必须认识到,新的社区上游 Kubernetes 集群的默认安装是不安全的,你需要投资对其进行加固,以避免安全问题。

至少需要采取下列安全措施:

  • 镜像扫描:容器镜像漏洞可以被利用来执行命令和访问其他资源。

  • RBAC^[11]^:对于命名空间即服务的用户角色和权限必须在每个命名空间级别上正确配置;对于其他模型,可能需要限制租户访问集中管理的附加服务和其他集群范围的资源。

  • 网络策略^[12]^:对于命名空间即服务,建议使用拒绝所有入口和出口流量的默认网络策略,以防止跨租户的网络流量,也可以作为其他租户模型的最佳实践。

  • Kubernetes Pod 安全标准^[13]^:为了实施 Pod 加固最佳实践,建议将 Restricted 策略作为租户工作负载的默认策略,只在需要时配置排除。

  • Kubernetes 的 CIS 基准^[14]^:Kubernetes 的 CIS 基准指南应该用于正确配置 Kubernetes 的控制平面和工作节点组件。

其他建议包括:

  • 策略引擎:用于配置安全性最佳实践,例如只允许受信任的注册中心。

  • 运行时扫描器:用于检测和报告运行时安全事件。

  • 基于虚拟机的容器沙箱:增强数据平面隔离。

虽然需要独立于租户模型的适当安全性,但在共享集群中没有pod 安全性^[15]^等必要的安全控制,这为攻击者提供了破坏租户模型和可能跨租户访问敏感信息的手段,从而增加了总体风险。

总结

CNCF 2020 年的一项调查显示,自 2016 年以来,Kubernetes 的使用量增加了 300%以上。随着越来越多的 Kubernetes 工作负载转移到生产中,组织正在寻找在团队之间共享 Kubernetes 资源的方法,以实现敏捷性和成本节约。

命名空间即服务租户模型允许共享集群,从而提高资源效率。但是,它需要适当的安全配置,并且由于所有租户共享集群范围内的相同资源而存在限制。

集群即服务租户模型解决了这些限制,但具有更高的管理和资源开销。

控制平面即服务模型提供了一种共享单个 Kubernetes 集群资源的方法,还允许租户管理他们自己的集群范围内的资源。共享工作节点资源提高了资源效率,但也暴露了共享集群存在的跨租户安全性和隔离问题。

在许多情况下,组织将使用多租户模型来处理不同的用例,并且不同的产品和开发团队将有不同的需求。遵循安全性和管理最佳实践,例如应用 Pod 安全标准和不使用 default 命名空间,可以更容易地从一种模型切换到另一种模型。

Kubernetes 多租户工作组^[16]^创建了几个项目,如层次命名空间控制器、虚拟集群/CAPI Nested 和多租户基准,以便更容易地创建和管理多租户模型。

如果你对多租户主题感兴趣,或者想要分享你的用例,请加入我们即将举行的社区会议^[17]^,或者通过Kubernetes slack^[18]^上的 wg-multitenancy 频道联系我们。

参考资料

[1]

Multi-tenancy vs. Multi-cluster: When Should you Use What?: https://sched.co/iE66

[2]

角色绑定: https://kubernetes.io/docs/reference/acces...

[3]

网络策略: https://kubernetes.io/docs/concepts/servic...

[4]

资源配额: https://kubernetes.io/docs/concepts/policy...

[5]

层次结构命名空间控制器(HNC): https://kubernetes.io/blog/2020/08/14/intr...

[6]

多租户基准测试(MTB): https://github.com/kubernetes-sigs/multi-t...

[7]

Cluster API (CAPI): https://cluster-api.sigs.k8s.io/

[8]

虚拟集群: https://github.com/kubernetes-sigs/multi-t...

[9]

Cluster API Nested: https://github.com/kubernetes-sigs/cluster...

[10]

云原生安全白皮书: https://www.cncf.io/blog/2020/11/18/announ...

[11]

RBAC: https://kubernetes.io/docs/reference/acces...

[12]

网络策略: https://kubernetes.io/docs/concepts/servic...

[13]

Kubernetes Pod 安全标准: https://kubernetes.io/docs/concepts/securi...

[14]

Kubernetes 的 CIS 基准: https://www.cisecurity.org/benchmark/kuber...

[15]

pod 安全性: https://kubernetes.io/docs/concepts/securi...

[16]

Kubernetes 多租户工作组: https://github.com/kubernetes-sigs/multi-t...

[17]

社区会议: https://github.com/kubernetes/community/bl...

[18]

Kubernetes slack: https://slack.k8s.io/

来源:https://mp.weixin.qq.com/s/OCWOUZrrgpIX-gs...

人因痛苦而改变,人因受益而坚持。

(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!