命名空间

在 Kubernetes 中,命名空间 提供了一种在单个集群内隔离资源组的机制。资源名称需要在命名空间内是唯一的,但跨命名空间不需要。基于命名空间的范围仅适用于命名空间内的 对象 (例如,Deployments、Services 等),而不适用于集群范围内的对象 (例如,StorageClass、Nodes、PersistentVolumes 等)

何时使用多个命名空间

命名空间旨在用于具有许多用户分布在多个团队或项目中的环境。对于只有几个到几十个用户的集群,您根本不需要创建或考虑命名空间。当您需要它们提供的功能时,开始使用命名空间。

命名空间提供名称的作用域。资源名称需要在命名空间内是唯一的,但跨命名空间不需要。命名空间不能相互嵌套,并且每个 Kubernetes 资源只能位于一个命名空间中。

命名空间是一种在多个用户之间划分集群资源的方式(通过 资源配额)。

不必使用多个命名空间来分隔略有不同的资源,例如同一软件的不同版本:使用 标签 在同一命名空间内区分资源。

初始命名空间

Kubernetes 从四个初始命名空间开始

default
Kubernetes 包含此命名空间,以便您可以开始使用新集群,而无需先创建命名空间。
kube-node-lease
此命名空间包含与每个节点关联的 Lease 对象。节点租约允许 kubelet 发送 心跳,以便控制平面可以检测节点故障。
kube-public
此命名空间可供所有客户端读取(包括未经身份验证的客户端)。此命名空间主要保留用于集群用途,以防某些资源应在整个集群中公开可见和可读。此命名空间的公共方面仅是一种约定,而不是要求。
kube-system
Kubernetes 系统创建的对象所在的命名空间。

使用命名空间

命名空间的创建和删除在 命名空间的管理员指南文档 中描述。

查看命名空间

您可以使用以下命令列出集群中的当前命名空间

kubectl get namespace
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d

设置请求的命名空间

要为当前请求设置命名空间,请使用 --namespace 标志。

例如

kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>

设置命名空间偏好

您可以永久保存该命名空间,以便在后续所有 kubectl 命令中使用该命名空间。

kubectl config set-context --current --namespace=<insert-namespace-name-here>
# Validate it
kubectl config view --minify | grep namespace:

命名空间和 DNS

当您创建 Service 时,它会创建一个相应的 DNS 条目。此条目的格式为 <service-name>.<namespace-name>.svc.cluster.local,这意味着如果容器仅使用 <service-name>,它将解析到特定于命名空间的 Service。这对于在多个命名空间(例如开发、暂存和生产)中使用相同的配置非常有用。如果您想跨命名空间访问,则需要使用完全限定域名 (FQDN)。

因此,所有命名空间名称必须是有效的 RFC 1123 DNS 标签

并非所有对象都在命名空间中

大多数 Kubernetes 资源(例如 Pod、Service、复制控制器等)都在某个命名空间中。但是,命名空间资源本身不在命名空间中。并且低级资源,例如 节点持久卷,不在任何命名空间中。

要查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中

# In a namespace
kubectl api-resources --namespaced=true

# Not in a namespace
kubectl api-resources --namespaced=false

自动标记

功能状态: Kubernetes 1.22 [稳定]

Kubernetes 控制平面在所有命名空间上设置一个不可变的 标签 kubernetes.io/metadata.name。标签的值是命名空间名称。

接下来

上次修改时间为 2024 年 9 月 3 日下午 8:30 PST:更新 namespaces.md 以删除 Note 块中的等宽格式 (f6ddca16f9)