--- title: 名字空间 content_type: concept weight: 30 --- Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为名字空间。 ## 何时使用多个名字空间 名字空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名称空间提供的功能时,请开始使用它们。 名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 名字空间不能相互嵌套,每个 Kubernetes 资源只能在一个名字空间中。 名字空间是在多个用户之间划分集群资源的一种方法(通过[资源配额](/zh/docs/concepts/policy/resource-quotas/))。 在 Kubernetes 未来版本中,相同名字空间中的对象默认将具有相同的访问控制策略。 不需要使用多个名字空间来分隔轻微不同的资源,例如同一软件的不同版本: 使用[标签](/zh/docs/concepts/overview/working-with-objects/labels)来区分同一名字空间中的不同资源。 ## 使用名字空间 名字空间的创建和删除在[名字空间的管理指南文档](/zh/docs/tasks/administer-cluster/namespaces/)描述。 {{< note >}} 避免使用前缀 `kube-` 创建名字空间,因为它是为 Kubernetes 系统名字空间保留的。 {{< /note >}} ### 查看名字空间 你可以使用以下命令列出集群中现存的名字空间: ```shell kubectl get namespace ``` ``` NAME STATUS AGE default Active 1d kube-node-lease Active 1d kube-system Active 1d kube-public Active 1d ``` Kubernetes 会创建三个初始名字空间: * `default` 没有指明使用其它名字空间的对象所使用的默认名字空间 * `kube-system` Kubernetes 系统创建对象所使用的名字空间 * `kube-public` 这个名字空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。 这个名字空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。 这个名字空间的公共方面只是一种约定,而不是要求。 * `kube-node-lease` 此名字空间用于与各个节点相关的租期(Lease)对象; 此对象的设计使得集群规模很大时节点心跳检测性能得到提升。 ### 为请求设置名字空间 要为当前请求设置名字空间,请使用 `--namespace` 参数。 例如: ```shell kubectl run nginx --image=nginx --namespace=<名字空间名称> kubectl get pods --namespace=<名字空间名称> ``` ### 设置名字空间偏好 你可以永久保存名字空间,以用于对应上下文中所有后续 kubectl 命令。 ```shell kubectl config set-context --current --namespace=<名字空间名称> # 验证之 kubectl config view | grep namespace: ``` ## 名字空间和 DNS 当你创建一个[服务](/zh/docs/concepts/services-networking/service/) 时, Kubernetes 会创建一个相应的 [DNS 条目](/zh/docs/concepts/services-networking/dns-pod-service/)。 该条目的形式是 `<服务名称>.<名字空间名称>.svc.cluster.local`,这意味着如果容器只使用 `<服务名称>`,它将被解析到本地名字空间的服务。这对于跨多个名字空间(如开发、分级和生产) 使用相同的配置非常有用。如果你希望跨名字空间访问,则需要使用完全限定域名(FQDN)。 ## 并非所有对象都在名字空间中 大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些名字空间中。 但是名字空间资源本身并不在名字空间中。而且底层资源,例如 [节点](/zh/docs/concepts/architecture/nodes/) 和持久化卷不属于任何名字空间。 查看哪些 Kubernetes 资源在名字空间中,哪些不在名字空间中: ```shell # 位于名字空间中的资源 kubectl api-resources --namespaced=true # 不在名字空间中的资源 kubectl api-resources --namespaced=false ``` ## {{% heading "whatsnext" %}} * 进一步了解[建立新的名字空间](/zh/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace)。 * 进一步了解[删除名字空间](/zh/docs/tasks/administer-cluster/namespaces/#deleting-a-namespace)。