共计 1148 个字符,预计需要花费 3 分钟才能阅读完成。
Kubernetes 使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题。命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制。无论是应用自定义的访问控制策略,还是为了测试环境而分离所有组件,命名空间都是一个按照组来处理对象、强大且灵活的概念。
一、什么是命名空间,为什么它很重要
命名空间(namespace)是 Kubernetes 提供的组织机制,用于给集群中的任何对象组进行分类、筛选和管理, 每一个添加到 Kubernetes 集群的工作负载必须放在一个命名空间中。
命名空间为集群中的对象名称赋予作用域
虽然在命名空间中名称必须是唯一的,但是相同的名称可以在不同的命名空间中使用。这对于某些场景来说可能帮助很大。例如,如果使用命名空间来划分应用程序生命周期环境(如开发、staging、生产),则可以在每个环境中维护利用同样的名称维护相同对象的副本。
命名空间还可以让用户轻松地将策略应用到集群的具体部分
你可以通过定义 ResourceQuota 对象来控制资源的使用,该对象在每个命名空间的基础上设置了使用资源的限制。类似地,当在集群上使用支持网络策略的 CNI(容器网络接口)时,比如 Calico 或 Canal(calico 用于策略,flannel 用于网络)。你可以将 NetworkPolicy 应用到命名空间,其中的规则定义了 pod 之间如何彼此通信。不同的命名空间可以有不同的策略。
使用命名空间最大的好处之一是能够利用 Kubernetes RBAC(基于角色的访问控制)
RBAC 允许您在单个名称下开发角色,这样将权限或功能列表分组。ClusterRole 对象用于定义集群规模的使用模式,而角色对象类型(Role object type)应用于具体的命名空间,从而提供更好的控制和粒度。在角色创建后,RoleBinding 可以将定义的功能授予单个命名空间上下文中的具体具体用户或用户组。通过这种方式,命名空间可以使得集群操作者能够将相同的策略映射到组织好的资源集合。
二、常见的命名空间使用模式
将命名空间映射到团队或项目上:
在设置命名空间时有一个惯例是,为每个单独的项目或者团队创建一个命名空间,通过给团队提供专门的命名空间,你可以用 RBAC 策略委托某些功能来实现自我管理和自动化。
使用命名空间对生命周期环境进行分区:
命名空间非常适合在集群中划分开发、staging 以及生产环境。通常情况下我们会被建议将生产工作负载部署到一个完全独立的集群中,来确保最大程度的隔离。不过对于较小的团队和项目来说,命名空间会是一个可行的解决方案。
使用命名空间隔离不同的使用者:
根据使用者对工作负载进行分段。比如,如果你的集群为多个客户提供基础设施,那么按命名空间进行分段就能够实现管理每个客户,同时跟踪账单的去向。