HNC 核心功能解析:从命名空间继承到资源配额的终极实践

HNC 核心功能解析:从命名空间继承到资源配额的终极实践

HNC 核心功能解析:从命名空间继承到资源配额的终极实践

【免费下载链接】hierarchical-namespacesHome of the Hierarchical Namespace Controller (HNC). Adds hierarchical policies and delegated creation to Kubernetes namespaces for improved in-cluster multitenancy.项目地址: https://gitcode.com/gh_mirrors/hi/hierarchical-namespaces

Hierarchical Namespace Controller (HNC) 是一款强大的 Kubernetes 工具,它通过添加命名空间层次结构和委托创建功能,显著提升了集群内的多租户管理能力。本文将深入解析 HNC 的核心功能,从命名空间继承到资源配额管理,帮助您全面掌握这一工具的使用方法和最佳实践。

命名空间层次结构:构建有序的集群环境 📊

HNC 的核心功能之一是允许您将 Kubernetes 命名空间组织成层次结构。这种结构使得策略和资源能够从父命名空间自动继承到子命名空间,极大地简化了多团队协作和资源管理。

父-child 关系:简化资源共享

在 HNC 中,每个命名空间可以有零个或一个父命名空间,形成一个树状结构。这种结构允许子命名空间继承父命名空间的策略和资源。例如,如果将team-a设置为acme-org的子命名空间,那么team-a将自动继承acme-org中的角色和角色绑定。

创建父子关系非常简单,只需使用kubectl-hns插件:

kubectl hns set team-a --parent acme-org

这个命令会创建一个HierarchyConfiguration对象,告诉 HNC 如何管理这个命名空间的层次关系。您可以通过以下命令查看命名空间的层次结构:

kubectl hns tree acme-org

子命名空间:细粒度的权限控制

HNC 引入了子命名空间(subnamespace)的概念,这是一种特殊类型的命名空间,其生命周期与父命名空间紧密相连。子命名空间由 HNC 通过SubnamespaceAnchor资源创建和管理,这使得没有集群管理员权限的用户也能创建受限的子命名空间。

创建子命名空间的命令如下:

kubectl hns create service-1 -n team-a

这条命令会在team-a命名空间中创建一个名为service-1的子命名空间锚点,HNC 随后会自动创建对应的子命名空间。子命名空间在层次结构中显示时会带有[s]标记:

acme-org └── team-a [s] └── service-1 [s]

子命名空间与普通命名空间(称为"完整命名空间")的主要区别在于:

  • 子命名空间的父级关系由 HNC 控制,不能手动修改
  • 删除父命名空间时,子命名空间也会被自动删除
  • 子命名空间的创建权限可以通过 RBAC 细粒度控制

资源传播:自动化的策略分发 🚀

HNC 不仅提供了命名空间的层次结构,还能自动将资源从父命名空间传播到子命名空间。这一功能极大地减少了重复配置的工作量,确保了策略的一致性。

默认传播:RBAC 资源的自动继承

默认情况下,HNC 会自动传播 RBAC 角色(Role)和角色绑定(RoleBinding)。这意味着在父命名空间中定义的访问控制策略会自动应用到所有子命名空间中。

例如,在acme-org中创建一个允许查看 Pod 的角色:

apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]

以及相应的角色绑定:

apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods subjects: - kind: User name: alice@example.com roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io

HNC 会自动将这些资源传播到acme-org的所有子命名空间(如team-aservice-1),确保 Alice 在这些命名空间中也能查看 Pod。

自定义传播:灵活配置资源分发

除了默认的 RBAC 资源,HNC 还允许管理员配置其他类型资源的传播。这通过修改集群范围的HNCConfiguration对象实现:

apiVersion: hnc.x-k8s.io/v1alpha2 kind: HNCConfiguration metadata: name: config spec: resources: - group: "" resource: secrets mode: Propagate - group: "" resource: configmaps mode: Propagate

这个配置告诉 HNC 传播所有命名空间中的 Secrets 和 ConfigMaps。修改配置后,HNC 会自动开始传播这些资源。

传播例外:精细控制资源流向

有时您可能不希望某些资源被传播到所有子命名空间。HNC 提供了多种注解(annotations)来控制资源的传播行为:

  • propagate.hnc.x-k8s.io/treeSelect: 只传播到指定的子命名空间

    kubectl annotate secret my-secret -n acme-org propagate.hnc.x-k8s.io/treeSelect=team-a
  • propagate.hnc.x-k8s.io/select: 使用树标签选择要传播的命名空间

    kubectl annotate secret my-secret -n acme-org propagate.hnc.x-k8s.io/select=team-a.tree.hnc.x-k8s.io/depth
  • propagate.hnc.x-k8s.io/none: 不传播到任何子命名空间

    kubectl annotate secret my-secret -n acme-org propagate.hnc.x-k8s.io/none=true
  • propagate.hnc.x-k8s.io/all: 传播到所有子命名空间(默认行为)

    kubectl annotate secret my-secret -n acme-org propagate.hnc.x-k8s.io/all=true

这些注解提供了灵活的方式来控制资源的传播范围,满足不同场景的需求。

层次化资源配额:高效管理集群资源 📈

HNC 引入了HierarchicalResourceQuota(HRQ),这是一种特殊的资源配额,允许在命名空间层次结构中共享资源。HRQ 确保父命名空间及其所有子命名空间的资源使用总和不超过设定的限制。

创建层次化资源配额

创建 HRQ 与创建普通的资源配额类似,但具有层次化的效果。例如,在acme-org命名空间中创建一个 HRQ:

apiVersion: hnc.x-k8s.io/v1alpha2 kind: HierarchicalResourceQuota metadata: name: acme-org-quota spec: hard: requests.cpu: "10" requests.memory: 10Gi limits.cpu: "20" limits.memory: 20Gi

HNC 会在acme-org及其所有子命名空间中创建相应的ResourceQuota对象(命名为hrq.hnc.x-k8s.io),确保资源使用总和不超过 HRQ 中定义的限制。

子配额:灵活分配资源

HRQ 还支持在子命名空间中创建子配额,允许进一步细分资源。例如,在team-a中创建一个子配额:

apiVersion: hnc.x-k8s.io/v1alpha2 kind: HierarchicalResourceQuota metadata: name: team-a-quota spec: hard: requests.cpu: "5" requests.memory: 5Gi limits.cpu: "10" limits.memory: 10Gi

这个子配额会从acme-org的总配额中分配一部分资源给team-a及其子命名空间,实现资源的精细化管理。

实用工具:kubectl-hns 插件 🛠️

HNC 提供了一个方便的kubectl插件kubectl-hns,简化了 HNC 相关资源的管理。以下是一些常用命令:

查看命名空间层次结构

kubectl hns tree <namespace>

创建子命名空间

kubectl hns create <subnamespace-name> -n <parent-namespace>

删除子命名空间

kubectl hns delete <subnamespace-name> -n <parent-namespace>

设置命名空间的父级

kubectl hns set <namespace> --parent <parent-namespace>

查看 HNC 配置

kubectl hns config describe

修改资源传播配置

kubectl hns config set-resource <resource> --group <group> --mode <mode>

最佳实践与注意事项 ⚠️

保持 HNC 健康运行

  • 监控 HNC 控制器的状态,确保其正常运行
  • 定期检查 HNC 的日志和指标,及时发现问题
  • 为 HNC 控制器设置适当的资源限制(推荐至少 150Mi 内存)

命名空间管理建议

  • 对需要严格控制的环境,使用子命名空间而非完整命名空间
  • 避免过深的命名空间层次结构,建议不超过 3-4 层
  • 删除包含子命名空间的命名空间时,使用--allowCascadingDeletion标志

资源传播最佳实践

  • 谨慎选择要传播的资源类型,避免传播过多资源影响性能
  • 使用传播例外注解精细控制资源流向
  • 定期审查传播的资源,确保没有不必要的资源被传播

资源配额管理

  • 为重要的父命名空间设置 HRQ,确保资源合理分配
  • 监控资源使用情况,及时调整配额设置
  • 避免在同一层次结构中设置过多重叠的 HRQ

总结

HNC 通过引入命名空间层次结构、资源传播和层次化资源配额,为 Kubernetes 集群提供了强大的多租户管理能力。它简化了资源和策略的管理,提高了团队协作效率,同时保持了必要的隔离性和安全性。

无论是小型团队还是大型企业,HNC 都能帮助您更好地组织和管理 Kubernetes 资源,实现更高效、更安全的集群运维。通过本文介绍的核心功能和最佳实践,您可以开始在自己的集群中充分利用 HNC 的强大功能。

要开始使用 HNC,请访问项目仓库获取安装指南和更多文档:

git clone https://gitcode.com/gh_mirrors/hi/hierarchical-namespaces

祝您在 Kubernetes 多租户管理的旅程中取得成功!

【免费下载链接】hierarchical-namespacesHome of the Hierarchical Namespace Controller (HNC). Adds hierarchical policies and delegated creation to Kubernetes namespaces for improved in-cluster multitenancy.项目地址: https://gitcode.com/gh_mirrors/hi/hierarchical-namespaces

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考