Namespace(命名空间)是kubernetes系统中的一个非常重要的概念,Namespace在很多情况下用于实现多租户的资源隔离。Namespace通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
kubernetes集群在启动后,会默认创建一个名为“default”的Namespace。同一个namespace下面不允许出现两个service叫相同的名字。
1.查看命名空间
[root@kub_master ~]# kubectl get namespaces -o wide NAME STATUS AGE default Active 7d kube-system Active 7d
可以看到有两个个namespace
如果在创建过程中不指名Namespace,则用户创建的pod,RC,Service都将被系统创建到这个默认名为default的Namespace中。
2. 创建命名空间
[root@kub_master ~]# kubectl create namespace test namespace "test" created [root@kub_master ~]# kubectl get namespaces -o wide NAME STATUS AGE default Active 7d kube-system Active 7d test Active 3s
3. 删除命名空间
注:特别危险!会删除namespace下所有的k8s资源
[root@kub_master ~]# kubectl delete namespace test namespace "test" deleted [root@kub_master ~]# kubectl get namespaces -o wide NAME STATUS AGE default Active 7d kube-system Active 7d test Terminating 1m [root@kub_master ~]# kubectl get namespaces -o wide NAME STATUS AGE default Active 7d kube-system Active 7d
4. Namespace的定义很简单,如下所示的yaml定义了名为develop的Namespace
[root@kub_master ~]# mkdir k8s/namespace [root@kub_master ~]# cd k8s/namespace/
[root@kub_master namespace]# vim develop-namespace.yaml [root@kub_master namespace]# cat develop-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: develop
[root@kub_master namespace]# kubectl create -f develop-namespace.yaml namespace "develop" created [root@kub_master namespace]# kubectl get namespaces -o wide NAME STATUS AGE default Active 7d develop Active 15s kube-system Active 7d
5.创建属于develop命名空间的pod资源
一旦创建了Namespace,在创建资源对象时,就可以指定这个资源对象属于哪个Namespace。
[root@kub_master namespace]# vim pod-busybox.yaml [root@kub_master namespace]# cat pod-busybox.yaml apiVersion: v1 kind: Pod metadata: name: busybox namespace: develop spec: containers: - name: busybox image: docker.io/busybox:latest imagePullPolicy: IfNotPresent command: - sleep - "3600" [root@kub_master namespace]# kubectl create -f pod-busybox.yaml pod "busybox" created [root@kub_master namespace]# kubectl get pods --namespace=develop NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 21s
在kubectl命令中加入--namespace参数来查看某个命名空间中的对象。
6. 创建namespace=develop的RC资源
[root@kub_master namespace]# vim nginx-rc.yaml [root@kub_master namespace]# cat nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb namespace: develop spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: 192.168.0.212:5000/nginx:1.13 ports: - containerPort: 80 [root@kub_master namespace]# kubectl create -f nginx-rc.yaml replicationcontroller "myweb" created [root@kub_master namespace]# kubectl get rc --namespace=develop NAME DESIRED CURRENT READY AGE myweb 2 2 2 20s [root@kub_master namespace]# kubectl get pods --namespace=develop NAME READY STATUS RESTARTS AGE busybox 1/1 Running 9 9h myweb-1fd25 1/1 Running 0 34s myweb-z1524 1/1 Running 0 34s
7. 创建namespace=develop的Service资源
[root@kub_master namespace]# vim nginx-svc.yaml [root@kub_master namespace]# cat nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: myweb namespace: develop spec: type: NodePort ports: - port: 80 nodePort: 30008 targetPort: 80 selector: app: myweb [root@kub_master namespace]# kubectl create -f nginx-svc.yaml service "myweb" created [root@kub_master namespace]# kubectl get svc --namespace=develop NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE myweb 192.168.72.198 <nodes> 80:30008/TCP 14s
当给每个租户创建一个Namespace来实现多租户资源隔离时,还能结合Kubernetes的资源配额管理,限定不同租户能占用的资源。