命名空间
在 Kubernetes 中,命名空间 提供了一种在单个集群内隔离资源组的机制。资源名称需要在命名空间内是唯一的,但跨命名空间不需要。基于命名空间的范围仅适用于命名空间内的 对象 (例如,Deployments、Services 等),而不适用于集群范围内的对象 (例如,StorageClass、Nodes、PersistentVolumes 等)。
何时使用多个命名空间
命名空间旨在用于具有许多用户分布在多个团队或项目中的环境。对于只有几个到几十个用户的集群,您根本不需要创建或考虑命名空间。当您需要它们提供的功能时,开始使用命名空间。
命名空间提供名称的作用域。资源名称需要在命名空间内是唯一的,但跨命名空间不需要。命名空间不能相互嵌套,并且每个 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>,它将解析到特定于命名空间的 Service。这对于在多个命名空间(例如开发、暂存和生产)中使用相同的配置非常有用。如果您想跨命名空间访问,则需要使用完全限定域名 (FQDN)。
因此,所有命名空间名称必须是有效的 RFC 1123 DNS 标签。
警告
通过创建与 公共顶级域名 具有相同名称的命名空间,这些命名空间中的 Service 可以拥有与公共 DNS 记录重叠的短 DNS 名称。来自任何命名空间执行 DNS 查找而不使用 尾随点 的工作负载将被重定向到这些服务,优先于公共 DNS。
为了缓解此问题,请限制允许受信任用户创建命名空间的权限。如果需要,您可以另外配置第三方安全控制,例如 准入 Webhook,以阻止创建任何与 公共 TLD 具有相同名称的命名空间。
并非所有对象都在命名空间中
大多数 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。标签的值是命名空间名称。