命名空间
在 Kubernetes 中,**命名空间(Namespaces)**提供了一种机制,用于在单个集群内隔离资源组。资源的名称在命名空间内必须是唯一的,但在不同命名空间之间则不必。基于命名空间的范围划分仅适用于命名空间内的对象(例如 Deployment、Service 等),而不适用于集群范围内的对象(例如 StorageClass、Node、PersistentVolume 等)。
何时使用多个命名空间
命名空间旨在用于拥有多个团队或项目、用户众多的环境。对于只有少量到数十个用户的集群,你完全不需要创建或考虑命名空间。当你需要命名空间提供的功能时,才开始使用它们。
命名空间为名称提供了作用域。资源的名称在命名空间内必须是唯一的,但在不同命名空间之间则不必。命名空间不能相互嵌套,每个 Kubernetes 资源只能存在于一个命名空间中。
命名空间是一种在多个用户之间划分集群资源的方式(通过资源配额)。
没有必要使用多个命名空间来分离略有不同的资源,例如同一软件的不同版本:可以使用标签来区分同一命名空间内的资源。
注意
对于生产集群,请考虑**不**使用 `default` 命名空间。相反,创建其他命名空间并使用它们。初始命名空间
Kubernetes 启动时带有四个初始命名空间:
default
- Kubernetes 包含此命名空间,以便你可以在不首先创建命名空间的情况下开始使用新集群。
kube-node-lease
- 此命名空间包含与每个节点关联的 租约(Lease) 对象。节点租约允许 kubelet 发送心跳,以便控制平面可以检测节点故障。
kube-public
- 此命名空间对**所有**客户端(包括未认证的客户端)都可读。此命名空间主要保留用于集群使用,以防某些资源需要在整个集群中公开可见和可读。此命名空间的“公共”方面只是一种约定,并非强制要求。
kube-system
- 此命名空间用于 Kubernetes 系统创建的对象。
使用命名空间
命名空间的创建和删除在命名空间管理指南文档中描述。
注意
避免创建以 `kube-` 为前缀的命名空间,因为该前缀保留用于 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>`,它将解析为命名空间本地的服务。这对于在多个命名空间(如开发、预发布和生产)之间使用相同的配置非常有用。如果你想跨命名空间访问,则需要使用完全限定域名(FQDN)。
因此,所有命名空间名称都必须是有效的RFC 1123 DNS 标签。
警告
通过创建与公共顶级域名同名的命名空间,这些命名空间中的 Service 可以拥有与公共 DNS 记录重叠的短 DNS 名称。任何命名空间中的工作负载执行不带尾随点的 DNS 查找时,都会被重定向到这些 Service,优先于公共 DNS。
为了缓解此问题,请限制创建命名空间的权限,仅限受信任的用户。如果需要,你还可以配置第三方安全控制措施,例如准入 Webhook,以阻止创建与公共顶级域名同名的任何命名空间。
并非所有对象都位于命名空间中
大多数 Kubernetes 资源(例如 Pod、Service、Replication Controller 等)都位于某个命名空间中。然而,命名空间资源本身并不位于命名空间中。低级资源,例如节点和PersistentVolume,也不位于任何命名空间中。
要查看哪些 Kubernetes 资源位于命名空间中,哪些不位于命名空间中:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
自动标签
Kubernetes 1.22 [stable]
Kubernetes 控制平面在所有命名空间上设置一个不可变的标签 `kubernetes.io/metadata.name`。该标签的值是命名空间名称。