命名空间
在 Kubernetes 中,命名空间提供了一种机制,可以在单个集群中隔离资源组。资源的名称在命名空间内必须唯一,但在命名空间之间不必唯一。基于命名空间的范围仅适用于命名空间 对象 (例如部署、服务等),不适用于集群范围的对象 (例如 StorageClass、节点、持久卷等)。
何时使用多个命名空间
命名空间旨在用于在跨多个团队或项目拥有众多用户的环境中使用。对于只有几个到几十个用户的集群,您根本不需要创建或考虑命名空间。当您需要命名空间提供的功能时,才开始使用命名空间。
命名空间为名称提供了一个范围。资源的名称在命名空间内必须唯一,但在命名空间之间不必唯一。命名空间不能互相嵌套,并且每个 Kubernetes 资源只能在一个命名空间中。
命名空间是一种将集群资源在多个用户之间划分的方法(通过 资源配额)。
不必使用多个命名空间来分离略微不同的资源,例如同一软件的不同版本:使用 标签 来区分同一命名空间内的资源。
注意
对于生产集群,请考虑不要使用default
命名空间。相反,请创建其他命名空间并使用它们。初始命名空间
Kubernetes 从四个初始命名空间开始
default
- Kubernetes 包含此命名空间,以便您可以在不先创建命名空间的情况下开始使用新的集群。
kube-node-lease
- 此命名空间包含与每个节点关联的 租约 对象。节点租约允许 kubelet 发送 心跳,以便控制平面可以检测到节点故障。
kube-public
- 此命名空间可供所有客户端(包括未经身份验证的客户端)读取。此命名空间主要保留供集群使用,以防某些资源应该在整个集群中公开可见和可读。此命名空间的公共方面只是一个约定,而不是要求。
kube-system
- Kubernetes 系统创建的对象所在的命名空间。
使用命名空间
命名空间的创建和删除在 命名空间的管理指南文档 中进行了描述。
注意
Avoid creating namespaces with the prefix `kube-`, since it is reserved for Kubernetes system namespaces.
查看命名空间
您可以使用以下命令列出集群中的当前命名空间
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
创建 服务 时,它会创建一个相应的 DNS 条目。此条目采用 <service-name>.<namespace-name>.svc.cluster.local
的形式,这意味着如果容器只使用 <service-name>
,它将解析为本地于命名空间的服务。这对于在多个命名空间(如开发、登台和生产)中使用相同的配置很有用。如果您想跨命名空间访问,则需要使用完全限定域名 (FQDN)。
因此,所有命名空间名称都必须是有效的 RFC 1123 DNS 标签。
警告
通过创建与 公共顶级域名 同名的命名空间,这些命名空间中的服务可以具有与公共 DNS 记录重叠的短 DNS 名称。来自任何执行 DNS 查找但没有 尾随点 的命名空间的工作负载将被重定向到这些服务,优先于公共 DNS。
为了缓解这种情况,请限制为受信任用户创建命名空间的权限。如果需要,您还可以额外配置第三方安全控制,例如 准入 Webhook,来阻止创建任何与 公共 TLD 同名的命名空间。
并非所有对象都在命名空间中
大多数 Kubernetes 资源(例如 pod、服务、复制控制器等)都在某些命名空间中。但是,命名空间资源本身不在任何命名空间中。并且低级资源,例如 节点 和 持久卷,不在任何命名空间中。
要查看哪些 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
。标签的值是命名空间名称。