层次结构控制器概览

层次结构控制器向 Kubernetes 命名空间添加分层功能,可让您编写更具表现力的政策、提高可观测性以及委派集群管理。

层次结构控制器基于开源项目分层命名空间控制器 (HNC)。 它使用在集群中运行的 Kubernetes 控制器动态准入控制器实现。

分层命名空间

在 Kubernetes 中,命名空间是大多数对象的基本组织单元。它们还构成了 Kubernetes 中隔离和安全性的基本单元。大多数政策和隔离对象都在命名空间级别运行,例如 RBAC 角色、Secret、服务账号、资源配额和网络政策。

通常,通过将每个命名空间的范围限定为包含最少数量的资源(例如单个微服务)及其资源和政策,您可以提高集群的安全性和隔离。但是,这可能会导致集群中有大量难以管理的命名空间。

为解决此问题,层次结构控制器引入了分层命名空间的概念,可让您根据其所有者对 Kubernetes 命名空间进行分组并将这些组作为一个整体单元进行控制。它们在由多个“团队”共享的集群中尤其有用,但所有者不必是人。例如,您可能希望将自动化工具设为一组命名空间的所有者,尤其是在需要非常广泛的权限但只需要访问一小部分相关命名空间时。

为了支持多租户用例,除了常规的 Kubernetes 命名空间之外,分层命名空间还支持多项功能:

  • 强制执行政策。分层命名空间可以使用传播功能从其祖先实体继承某些政策。例如,您可以在“根”命名空间中授予 RBAC 权限,并且层次结构控制器通过将 RBAC 对象复制(传播)到这些后代,可确保这些权限也在所有后代命名空间中。还可以使用异常在精细级别控制传播。
  • 政策应用。所有分层命名空间都包含反映其祖先实体的广受信任的知名标签。这些标签可在政策(例如验证网络钩子配置或网络政策)的标签选择器中使用。
  • 分层配额。您可以在祖先实体命名空间中定义单个分层配额,系统会自动对该命名空间及其所有后代的总体用量实施限制。
  • 分层可观测性。用于政策应用的可信标签也可用于观察分层工作负载,例如过滤日志或使用情况。
  • 委托命名空间创建。层次结构控制器引入了子命名空间的概念,即使用户没有集群级命名空间权限,该用户也可以在现有命名空间下创建子命名空间。

分层命名空间还支持广泛的管理功能,包括委托功能。

分层命名空间与抽象命名空间

层次结构控制器提供的分层命名空间类似于您在使用 Config Sync 分层代码库时可以使用的抽象命名空间。不过,它们在概念上存在一些差异:

  • 抽象命名空间只能在分层代码库中定义,该代码库会对配置实施特定结构。分层命名空间可用于非结构化代码库,可让您根据需要排列配置文件。
  • 抽象命名空间仅存在于 Git 代码库中,而分层命名空间也是常规 Kubernetes 命名空间,并且存在于集群中。因此,分层命名空间可以在代码库中定义,也可以直接在集群上定义。
  • 分层命名空间不需要集群级权限即可创建。您可以改为使用子命名空间创建删除的命名空间。
  • 分层资源配额仅在分层命名空间中受支持,在抽象命名空间中不受支持。
  • 抽象命名空间仅适用于 Config Sync,而分层命名空间基于开源概念。

抽象命名空间和分层命名空间还具有一些不同的默认行为。默认情况下,在抽象命名空间中创建的所有对象都会传播到其后代。相反,仅当层次结构控制器已配置为传播该对象类型时,分层命名空间中的对象才会传播。

默认情况下,只有 RBAC 角色和角色绑定会传播,但任何命名空间对象都可以传播。我们建议您仅传播政策对象(如角色)和资源对象(如配置映射)。层次结构控制器并非用于传播 pod、部署或作业等工作负载对象,如果以这种方式使用,可能会产生意外后果。我们建议将工作负载放入叶命名空间中。

将层次结构控制器与 Config Sync 搭配使用

借助层次结构控制器,您可以使用分层概念来定义和应用政策,这些概念适用于许多应用,包括由多个团队使用的集群。借助 Config Sync,您可以将这些政策存储在 Git 代码库中,并将其应用于集群组。虽然这两个功能不同,但都是免费的,并为您提供了在多团队、多集群环境中应用 GitOps 的强大方法。

将层次结构控制器与 Config Sync 结合使用时,我们建议您使用非结构化代码库来停用 Config Sync 抽象命名空间,并使用层次结构控制器来定义层次结构并传播政策。对于要签入代码库的命名空间,我们建议您仅签入完整命名空间(而不是子命名空间)的配置,因为您可以通过修改 HierarchicalConfiguration 对象更新其层次关系。

可以在层次结构代码库中将层次结构控制器与 Config Sync 抽象命名空间结合使用,但仅限于有限的方式。例如,层次结构控制器不允许您在分层代码库中定义的两个命名空间之间建立层次关系,因为这可能会与该代码库中的抽象命名空间发生冲突。但是,您可以通过以下方式将分层命名空间与分层代码库搭配使用

  • 您可以在从层次结构代码库创建的命名空间下在集群上创建自助式子命名空间。但是,我们不建议您签入这些子命名空间的配置中。
  • 如果您使用的是多个代码库,则可以在命名空间代码库中创建子命名空间锚标记,这将指示层次结构控制器在指定命名空间下创建子命名空间。这些子命名空间将继承其祖先实体的所有已配置的资源,并且将受到所有分层资源配额的限制。但是,您无法定义只应存在于这些子命名空间中的任何资源; Config Sync 会将命名空间代码库中的所有对象同步到指定的命名空间。

后续步骤