在学习本节内容前,希望你已经对Kubernetes对象的Names有了基本的了解,具体请参考这篇文章:
Namespace类似于Linux系统中用户的概念,通过将系统内部的对象分配到不同的Namespace中,形成逻辑上的分,便于不同的分组在共享集群资源的同时还能被分别管理。同一Namespace下的Kubenetes对象的Name必须唯一。
常见的 pod, service, replication controller 和 deployment 等都是属于某一个 namespace 的(默认是 default),而 node, persistent volume,namespace 等资源则不属于任何 namespace。
1. Namespace操作
1.1 查看
$ kubectl get namespaces
NAME STATUS AGE
default Active 1d
kube-system Active 1d
kube-public Active 1d
通过上述命令,可以查看到Kubernetes为我们初始化的三个Namespace:
- default:所有未指定Namespace的对象都会被分配在default命名空间。
- kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间。
- kube-public:此命名空间下的资源可以被所有人访问(包括未认证用户)。
1.2 设置Namespace
通过--namespace
参数可以在一条命令中指定Namespace,只对单条命令有效。
$ kubectl --namespace=<insert-namespace-name-here> run nginx --image=nginx
$ kubectl --namespace=<insert-namespace-name-here> get pods
还可以绑定一个Namespace到特定的上下文,这样在此上下文中执行的kubectl命令都处于绑定的Namespace下。
$ kubectl config set-context $(kubectl config current-context) --namespace=<insert-namespace-name-here>
# Validate it
$ kubectl config view | grep namespace:
1.3 Namespace和DNS
当你创建一个Service时,Kubernetes会自动创建一个形如<service-name>.<namespace-name>.svc.cluster.local
的DNS项。如果集群中另一个服务调用这个服务时,仅仅指定了<service-name>
,那么Kubernetes会使用调用方所在的Namespace将<service-name>
补全。因此如果调用方和被调用方不处于同一个Namespace,你必须使用包含Namespace的service name(fully qualified domain name (FQDN))。
参考文章
https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/