Kubernetes 支持由同一物理集群支持的多个虚拟集群。这些虚拟集群称为命名空间。
- 何时使用多个命名空间
- 使用命名空间
- 命名空间和 DNS
- 并非所有对象都在命名空间中
- 下一步怎么做
何时使用多个命名空间
命名空间旨在用于具有多个用户的环境,这些用户分布在多个团队或项目中。对于很自由几到几十个用户的集群,我们根本不需要创建或考虑命名空间。当需要命名空间提供的功能时,请开始使用它们。
命名空间提供了名称范围。资源名称在命名空间内必须唯一,但在各个命名空间之间则可以有相同的名称。命名空间不能彼此嵌套,并且每个 Kubernetes 资源只能位于一个命名空间中。
命名空间是一种在多个用户之间(通过资源配额(敬请期待~~))划分集群资源的方法。
在将来的 Kubernetes 版本中,默认情况下,相同命名空间中的对象将具有相同的访问控制策略。
不必用多个命名空间来分隔稍有不同的资源,例如同一软件的不同版本:使用标签(敬请期待~~)来区分同一命名空间中的资源。
使用命名空间
命名空间的管理指南文档(敬请期待~~)中描述了命名空间的创建及删除。
查看命名空间
我们可以使用以下命令列出集群中的当前命名空间:
kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-system Active 1d
kube-public Active 1d
kube-node-lease Active 1d
Kubernetes 从三个初始命名空间开始:
default
:没有其他命名空间的对象的默认命名空间;kube-system
:Kubernetes 系统创建的对象的命名空间;kube-public
:该命名空间是自动创建的,并且对所有用户(包括未经身份验证的用户)可读。该命名空间主要保留给集群使用,以防某些资源在整个集群中公开可见。该命名空间的公共方面只是约定俗成,而不是要求。
为请求设置命名空间
要为当前请求设置命名空间,请使用 --namespace
标志。
例如:
kubectl run nginx --image=nginx --namespace=<命名空间名称>
kubectl get pods --namespace=<命名空间名称>
设置命名空间首选项
我们可以为该上下文中的所有后续 kubectl 命令永久保存命名空间。
kubectl config set-context --current --namespace=<命名空间名称>
# 验证一下
kubectl config view --minify | grep namespace:
命名空间和 DNS
创建服务(敬请期待~~)时,它会创建一个相应的 DNS 条目(敬请期待~~)。该项的格式为 <服务名称>.<命名空间名称>.svc.cluster.local
,这意味着如果容器仅使用 <服务名称>,它将解析为命名空间本地的服务。这对于在多个命名空间(例如开发、待发及生产)中使用相同的配置很有用。如果要跨命名空间访问,则需要使用完全限定的域名(FQDN)。
并非所有对象都在命名空间中
大多数 Kubernetes 资源(例如 Pod、服务、复制控制器及其他资源)都位于某些命名空间中。但是,命名空间资源本身并不在命名空间中。并且不在任何命名空间中低级资源,例如节点(敬请期待~~)及持久卷。
要查看命名空间中存在及不存在哪些 Kubernetes 资源,请执行以下操作:
# 在命名空间中
kubectl api-resources --namespaced=true
# 不在命名空间中
kubectl api-resources --namespaced=false