# Namespace：资源分组
#### 介绍视频
<video controls="controls" preload="none" id="object470114173816" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/video/cce/namespace.mp4" title="Namespace" poster="https://support.huaweicloud.com/basics-cce/zh-cn_image_0000002358296689.jpg" height="340.0000" width="600.0000"></video>
#### 为什么需要Namespace
Label虽然好，但只用Label的话，那Label会非常多，有时候会有重叠，而且每次查询之类的动作都带一堆Label非常不方便。Kubernetes提供了Namespace来做资源组织和划分，使用多Namespace可以将包含很多组件的系统分成不同的组。Namespace也可以用来做多租户划分，这样多个团队可以共用一个集群，使用的资源用Namespace划分开。
不同的Namespace下的资源名称可以相同，Kubernetes中大部分资源可以用Namespace划分，不过有些资源不行，例如Node、PV等，它们属于全局资源，不属于某一个Namespace，后面会逐步接触到。
通过如下命令可以查询到当前集群下的Namespace。
```
$ kubectl get ns
NAME               STATUS   AGE
default            Active   36m
kube-node-lease Active   36m
kube-public        Active   36m
kube-system        Active   36m
```
到目前为止，我们都是在default Namespace下操作，当使用kubectl get而不指定Namespace时，默认为default Namespace。
看下kube-system下面有些什么东西。
```
$ kubectl get po --namespace=kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
coredns-7689f8bdf-295rk                   1/1     Running   0          9m11s
coredns-7689f8bdf-h7n68                   1/1     Running   0          11m
everest-csi-controller-6d796fb9c5-v22df   2/2     Running   0          9m11s
everest-csi-driver-snzrr                  1/1     Running   0          12m
everest-csi-driver-ttj28                  1/1     Running   0          12m
everest-csi-driver-wtrk6                  1/1     Running   0          12m
icagent-2kz8g                             1/1     Running   0          12m
icagent-hjz4h                             1/1     Running   0          12m
icagent-m4bbl                             1/1     Running   0          12m
```
可以看到kube-system有很多Pod，其中coredns是用于做服务发现、everest-csi是用于对接存储服务、icagent是用于对接监控系统。
这些通用的、必须的应用放在kube-system这个命名空间中，能够做到与其他Pod之间隔离，在其他命名空间中不会看到kube-system这个命名空间中的东西，不会造成影响。
#### 创建Namespace
使用如下方式定义Namespace。
```
apiVersion: v1 
kind: Namespace 
metadata: 
  name: custom-namespace
```
使用kubectl命令创建。
```
$ kubectl create -f custom-namespace.yaml
namespace/custom-namespace created
```
您还可以使用kubectl create namespace命令创建。
```
$ kubectl create namespace custom-namespace 
namespace/custom-namespace created
```
在指定Namespace下创建资源。
```
$ kubectl create -f nginx.yaml -n custom-namespace 
pod/nginx created
```
这样在custom-namespace下，就创建了一个名为nginx的Pod。
#### Namespace的隔离说明
Namespace只能做到组织上划分，对运行的对象来说，它不能做到真正的隔离。举例来说，如果两个Namespace下的Pod知道对方的IP，而Kubernetes依赖的底层网络没有提供Namespace之间的网络隔离的话，那这两个Pod就可以互相访问。
