命名空间是什么?
K8s支持由同一个物理集群支持多个虚拟集群,这些虚拟集群称为命名空间。
为什么需要命名空间?
当同一个物理集群支持多个用户分布在多个团队或者项目的环境中时,如果不做划分会十分混乱,通过命名空间划分集群的资源进行分割。
命名空间为名称提供了一个范围,资源名称在一个命名空间内必须是唯一的,但跨空间没有这个限制。
注意:
- 命名空间不能互相嵌套,每个K8s资源只能唯一位于一个命名空间内。
- 避免使用前缀
kube-
创建命名空间,它是K8s系统命名空间保留前缀
K8s初始命名空间
-
default
没有其他命名空间的对象的默认命名空间 -
kube-system
Kubernetes 系统创建的对象的命名空间 -
kube-public
此命名空间是自动创建的,所有用户(包括未通过身份验证的用户)均可读取。这个命名空间主要是为集群使用保留的,以防某些资源在整个集群中公开可见和可读。这个命名空间的公共方面只是一个约定,而不是一个要求。 -
kube-node-lease
该命名空间包含 与每个节点关联的Lease对象。节点租用Lease
允许 kubelet 发送 心跳,以便控制平面可以检测节点故障。
为请求设置命名空间
使用--namespace
标志,例:
kubectl run nginx --image=nginx --namespace=kube-public
kubectl get pods --namespace=default
设置命名空间首选项
即设置后续kubectl命令默认命名空间
kubectl config set-context --current --namespace=kube-public
# Validate it
kubectl config view --minify | grep namespace:
命名空间和DNS
创建一个服务时,相应会创建一个DNS条目。
条目的形式为:
<service-name>.<namespace-name>.svc.cluster.local
所以如果只使用<service-name>
,不指定命名空间会解析为本地命名空间的服务。
如果要跨命名空间访问,则需要使用完全限定域名FQDN
所有对象都在命名空间中吗?
并非所有的K8s对象都在命名空间中,首先命名空间资源本身不在命名空间中,另外底层的资源比如节点node
和持久卷persistentVolumes
并不在命名空间中
查看K8s在或不在命名空间的资源:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
自动贴标
启用了NamespaceDefaultLabelName
功能门后,Kubernetes控制平面在所有命名空间上设置一个不可变的标签kubernetes.io/metadata.name
。标签的值是命名空间的名称。