命名空间(Namespace)
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
在 Kubernetes 中,命名空间(Namespace)提供一种机制,将同一集群中的资源划分为相互隔离的组。同一命名空间内的资源名称必须唯一,但跨命名空间时没有这个要求。命名空间的作用域仅针对带有命名空间的对象,例如 Deployment、Service 等,这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume等。
命名空间适用于存在很多跨多个团队或项目的用户的场景。
命名空间为名称提供了一个范围。资源的名称在命名空间内需要是唯一,不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能存在于一个命名空间中。
命名空间是在多个用户之间划分集群资源的一种方法(通过 )。
不必使用多个命名空间来划分仅仅轻微不同的资源,比如,同一软件不同版本;应该使用标签来区分同一命名空间的不同资源。
Kubernetes 启动时全创建四个初始命名空间:
default
Kubernetes 默认命名空间,无需创建新的命名空间也可以使用新集群。
kube-node-lease
该命名空间包含用于与各个节点关联的 Lease(租约)对象。节点租约允许 kubelet 发送心跳,由此控制平台能够检测到节点故障。
kube-public
所有的客户端(包括未经身份认证的客户端)都可以读取该命名空间。该命名空间主要预留为集群使用。以便某些资源需要在整个集群中可见可读。该命名空间的公共属性只是一种约定而非要求。
kube-system
该命名空间用于 Kubernetes 系统创建的对象。
使用以下命令列出集群中所有的命名空间:
输出:
为当前请求设置命名空间,请使用 --namespace
或 -n
参数。例如:
在指定上下文中持久性保存命名空间,供所有后续 kubectl
命令使用。
当创建一个 Service 时,Kubernetes 会创建一个相应的 DNS 条目,格式为:<Service>.<Namespace>.svc.cluster.local
。
如果容器使用 <Service>
,则将解析到容器所在命名空间中的 Service;
如果容器使用 <Service>.<Namespace>.svc.cluster.local
,则允许跨命名空间(如:开发、测试和生产),将解析到 <Namespace>
下的 Service。如果希望跨命名空间访问,则需要使用完全限定域名(FQDN)。
警告:
大多数 Kubernetes 资源(如:Pod、Service、Deployment等)都位于某个命名空间中,但是命名空间资源自身并不在命名空间中。而且底层资源,例如 节点(Node) 和 持久卷(PersistentVolume) 不属于任何命名空间。
查看 Kubernetes 资源对应的命名空间情况:
特性状态:Kubernetes 1.21 [beta]
Kubernetes 控制平面会为所有命名空间设置一个不可变更的标签:kubernetes.io/metadata.name
,只要 NamespaceDefaultLabelName
特性被启用,标签的值就是命名空间的名称。
因此,所有的命名空间名称都必须是合法的 。
通过创建与同名的命名空间,这些命名中的服务可以拥有与公共 DNS 记录重叠的、较短的 DNS 名称。所有命名空间中的负载在执行 DNS 查找时,如果查找的名称没有,就会被重定向到这些服务上,因此呈现出比公共 DNS 更高的优先序列。
为了缓解这类问题,需要将创建命名空间的权限授予可信的用户。如果需要,可以额外部署第三方的安全控制机制,例如以准入 Webhook 的形式,阻止用户创建与 同名的命名空间。