Kubernetes 分层命名空间
命名空间是构建租户模式的重要部分,但在某些情况下,命名空间的使用并不太灵活,本文就介绍了分层命名空间,其实现了策略继承、创建继承,希望可以帮助大家更好地使用命名空间。在单个 Kubernetes集群上托管大量用户一直是个难题,其中有个难点:不同的组织会以不同的方式使用Kubernetes,这样就没有一种可以适合所有人的租户模式。不过,Kubernetes 提供了创建不同多租户模式的基础模块,例如 RBAC 和 网络策略,我们可以以此构建适合自己的租户解决方案,以适应不同的多租户集群。
命名空间
基础模块中重要的就是命名空间(namespace),它构成了 Kubernetes 控制平面安全性和共享策略的基础。例如,默认情况下,RBAC、网络策略和资源配额(ResourceQuota)都适用于命名空间,另外诸如 Secret、服务账户(ServiceAccount)以及 Ingress 之类的对象都可以在任何一个命名空间中自由使用,并且能与其他命名空间完全隔离。
命名空间有两个关键属性,使其成为了策略执行的理想选择: 首先,它可以用来代表所有权。大多数的 Kubernetes 对象都在命名空间中,因此如果我们使用命名空间来表示所有权,就可以控制命名空间中所有对象。
其次,命名空间的创建和使用需要授权,只有超级管理员才能创建命名空间,其他用户必须要有对应权限才能使用这些命名空间,例如在命名空间中创建、查看或修改对象。这样,我们可以建立合适的安全策略,防止非特权用户创建资源对象。
命名空间的限制
但在实际应用中,这样的命名空间其实不太灵活,常常无法满足一些常见的需求。例如,当一个团队拥有很多个包含不同 secret 和资源配额的微服务时,在理想情况下,我们应该将这些微服务放在不同的命名空间中,以进行相互隔离,但这样会带来了两个问题: 首先,命名空间没有通用的所有权概念,即使它们都属于同一团队,这意味着,当团队控制多个命名空间时,Kubernetes 不仅没有命名空间共同所有者的记录,而且无法统一应用策略到这些命名空间。
其次,创建命名空间需要很高的特权,但我们不太可能允许开发团队的任何成员都可以创建命名空间。这意味着,每当团队需要新的命名空间时,他们都必须向集群管理员提出申请要求。这对于小型团队来说完全没有问题,但随着团队的发展和不断扩大,这有可能会影响团队效率。
分层命名空间
分层命名空间(Hierarchical Namespaces)是 Kubernetes 多租户工作组(Working Group for Multi-Tenancy,wg-multitenancy)提出的一种概念,可以帮助解决上述两个问题。分层命名空间最简单的一种形式是一个常规的 Kubernetes 命名空间,它包含一个小的自定义资源,该资源标识了一个单一可选的父命名空间。这样就建立了跨命名空间的所有权的概念,而不仅局限在命名空间之内。这种所有权概念可带来另外两种类型的行为:
- 策略继承:如果一个命名空间是另一个命名空间的子代,那么 RBAC RoleBindings 等策略可以从父代命名空间空间复制到子代命名空间。
- 创建继承:通常情况下,我们需要管理员特权才能创建命名空间,但是分层命名空间里有一种新选择:subnamespaces,我们可以使用父代命名空间中的部分权限来对子代命名空间进行操作。
这就为我们的开发团队解决了上面两个问题。集群管理员可以创建一个“根”命名空间以及所有相关的必要策略,然后将创建子命名空间的权限委派给团队的成员,这样团队成员就可以在不违反策略的情况下创建供自己使用的子命名空间。
分层命名空间的使用
分层命名空间由 Kubernetes 分层命名空间控制器(Hierarchical Namespace Controller,HNC)控制。HNC包含两个组件:
- 控制器:该控制器在集群上运行,以管理子命名空间、传播策略对象、确保层级结构合法并管理扩展点。
- kubectl 插件:该插件叫 kubectl-hns,可以使用户与控制器进行交互。 下面让我们来看看 HNC 如何使用。
假设我们没有命名空间创建特权,但可以查看命名空间 team-a 并能在其中创建子命名空间。我们可以使用 kuberctl 插件:
$ kubectl hns create svc1-team-a -n team-a
这将创建一个名为 svc1-team-a 的子命名空间。这里要注意,由于子命名空间也只是常规的 Kubernetes 命名空间,因此所有子命名空间的名称也必须是唯一的。 我们可以通过树视图来查看这些命名空间的结构:
$ kubectl hns tree team-a
#### Output:
team-a
└── svc1-team-a
另外,如果父命名空间中有任何策略,这些策略也会继承到子命名空间中。例如,假设 team-a 有一个名为 sres 的 RBAC RoleBinding,那么它也会出现在子命名空间中:
$ kubectl describe rolebinding sres -n svc1-team-a
# Output:
Name: sres
Labels: hnc.x-k8s.io/inheritedFrom=team-a # inserted by HNC
Annotations: <none>
Role:Kind: ClusterRoleName: admin
Subjects: ...
最后,HNC 还会为这些命名空间添加标签,这些标签包含了层级结构的相关信息,我们可以使用这些信息来设置其他策略。例如,我们可以创建以下网络策略:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: allow-team-anamespace: team-a
spec:ingress:- from:- namespaceSelector:matchExpressions:- key: 'team-a.tree.hnc.x-k8s.io/depth' # Label created by HNCoperator: Exists
该策略将被继承到 team-a 的所有子命名空间,另外还会允许所有这些子命名空间之间的 ingerss 流量。不过,这些“tree”标签只能由 HNC 创建,这样可以保证能反映最新的层级结构。
HNC v0.5.1 地址:https://github.com/kubernetes-sigs/multi-tenancy/releases/tag/hnc-v0.5.1
Kubernetes 分层命名空间相关推荐
- kubernetes不同的命名空间下的容器能通信吗_超长干货 | Kubernetes命名空间详解
本文中,我们将探索Kubernetes命名空间,它是集群中组织和管理对象的一种方式. 介 绍 Kubernetes集群可以同时管理大量互不相关的工作负载,而组织通常会选择将不同团队创建的项目部署到共享 ...
- 超长干货 | Kubernetes命名空间详解
K8s使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题.在本文中,会讨论命名空间的工作原理,介绍常用实例,并分享如何使用命名空间来管理K8s对象.最后,介绍名为projects的Rancher ...
- Kubernetes 必备工具:2021
文档翻译自 Kubernetes Essential Tools: 2021[1],篇幅较长,做了部分增删. 介绍 在本文中,我将尝试总结我最喜欢的 Kubernetes[2] 工具,并特别强调最新的 ...
- Kubernetes 多租户简介
什么是多租户? 在不同租户之间共享应用程序或软件的单个实例的想法称为多租户.自云环境兴起以来,这种方法非常流行.现在,随着 Kubernetes 的引入,开发人员和管理员需要在 Kubernetes ...
- Kubernetes 应用部署实战
简介 伙计们,请搬好小板凳坐好,下面将是一段漫长的旅程,期望你能够乐在其中. 我将基于 Kubernetes[1] 部署一个分布式应用.我曾试图编写一个尽可能真实的应用,但由于时间和精力有限,最终砍掉 ...
- 如何发现 Kubernetes 中服务和工作负载的异常
大家好,我是来自阿里云的李煌东,今天由我为大家分享 Kubernetes 监控公开课的第二节内容:如何发现 Kubernetes 中服务和工作负载的异常. 本次分享由三个部分组成: 一.Kuberne ...
- 基于 Kubernetes 的 CICD 基础设施即代码
在上一篇基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊 使用的基础设施是如何使用代码描述的, ...
- Kubernetes 也有局限性吗?
作者 | Draveness 来源 | 真没什么逻辑 头图 | 下载于视觉中国 2014 年发布的 Kubernetes 在今天俨然已成为容器编排领域的事实标准,相信谈到 Kubernetes 的开发 ...
- 容器、Docker与Kubernetes——Kubernetes的配置入门
本文讲的是容器.Docker与Kubernetes--Kubernetes的配置入门[编者的话]这是介绍Kubernetes的第三篇,主要集中讲述如何配置Kubernetes集群以及作者在配置过程中遇 ...
最新文章
- libxml/xmlversion.h: No such file or directory
- 从零开始学python网络爬虫-教你从零开始学会写爬虫(Python)
- IT培训分享:学什么语言不愁找工作?
- 电子商务基础课件(10.25更新)
- ora-01591:锁被未分布式事物处理/Distrib tran
- excel中自动填充到最后一行
- 阿里十年DBA经验产品经理:真的不要再有一起删库跑路事件了
- polycom安卓手机客户端_安卓 emoji 表情:全变了
- 【Elasticsearch】了解Elasticsearch写入磁盘的数据
- java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
- c mysql导入数据_MySQL 数据导入
- Linux开发_快速定位关键字与变量
- 计算机精品在线开放课程申报书,精品在线开放课程申报书.doc
- 基于JSP和SQL的CD销售管理系统
- ROS海龟跟随(坐标变换)
- (73)C#里怎么样调用WIN API的函数时传送结构或指针对象
- 前端证券项目_富途证券WEB前端团队招募令
- 二叉树:输出根节点到叶子的路径
- 分享一个SlideShare:《做卓有成效的程序员》
- 基于TCP/IP协议 区别 GET和POST