概述
官方文档地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/namespaces/
namespace是K8s系统中的一种非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

对于资源隔离,有的资源支持名称空间的,我们称之为局部资源。比如: po,svc,rc,...
而对于不支持名称空间的,我们称之为全局(集群)资源。比如: cs,no,ns...
查看K8s中哪些资源是否支持namespace
通过kubectl api-resources字段来查看。如下图:
可以查看NAMESPACED字段,当NAMESPACED为true时,则对应的该资源支持名称空间,称为局部资源;为false时则不支持名称空间,称为全局资源。

查看namespace
# 查看所有的namespace [root@master01 ~]# kubectl get namespace NAME STATUS AGE calico-apiserver Active 6d6h calico-system Active 6d6h default Active 6d6h kube-node-lease Active 6d6h kube-public Active 6d6h kube-system Active 6d6h tigera-operator Active 6d6h
初始状态下,Kubernetes 具有四个namespace:
- default:默认的namespace,创建的资源未指定namespace时就在default空间下
- kube-node-lease 此namespace保存与每个节点关联的租约(Lease)对象。 节点租约允许 kubelet 发送心跳, 以便控制平面可以检测节点故障。
- kube-public 自动创建且被所有用户可读的namespace(包括未经身份认证的)。 此namespace通常在某些资源在整个集群中可见且可公开读取时被集群使用。 此namespace的公共方面只是一个约定,而不是一个必要条件。
- kube-system 由 Kubernetes 系统创建的对象的namespace
创建namespace
避免使用前缀 kube- 创建namespace,因为它是为 Kubernetes 系统namespace保留的。
通过资源清单创建namespace
# 创建资源清单 [root@master01 ~/namespace]# cat dev.yaml apiVersion: v1 kind: Namespace metadata: name: dev # 创建namespace [root@master01 ~/namespace]# kubectl apply -f dev.yaml namespace/dev created # 查看namespace [root@master01 ~/namespace]# kubectl get namespace dev NAME STATUS AGE dev Active 11s
通过命令创建namespace
语法:
kubectl create namespace <namespace-name>
示例:
# 创建名称为sit的namespace [root@master01 ~/namespace]# kubectl create namespace sit namespace/sit created # 验证是否创建成功 [root@master01 ~/namespace]# kubectl get namespace sit NAME STATUS AGE sit Active 13s
删除namespace
删除namespace时会删除namespace下的所有内容!一般不建议删除namespace。
删除namespace是异步的,所以有一段时间你会看到namespace处于 Terminating 状态。
语法:
kubectl delete namespaces <namespace-name>
示例:
# 删除sit的namespace [root@master01 ~/namespace]# kubectl delete namespace sit namespace "sit" deleted # 验证是否删除成功 [root@master01 ~/namespace]# kubectl get namespace sit Error from server (NotFound): namespaces "sit" not found
创建K8s资源在指定的namespace
创建局部资源时(例如Pod、ConfigMap...)可以在metadata.namespace指定该资源属于哪一个namespace。
示例:
# 定义资源清单 [root@master01 ~/namespace]# cat namespace-pod.yaml # 创建namespace apiVersion: v1 kind: Namespace metadata: name: sit-pod --- # 创建Pod apiVersion: v1 kind: Pod metadata: name: namespace-pod # 指定所属的名称空间 namespace: sit-pod spec: containers: - name: container-nginx image: nginx:latest # 创建namespace和对应的Pod [root@master01 ~/namespace]# kubectl apply -f namespace-pod.yaml namespace/sit-pod created pod/namespace-pod created # 查看namespace [root@master01 ~/namespace]# kubectl get namespace sit-pod NAME STATUS AGE sit-pod Active 49s # 查看sit-pod下的Pod [root@master01 ~/namespace]# kubectl get po -n sit-pod NAME READY STATUS RESTARTS AGE namespace-pod 1/1 Running 0 65s
查看指定namespace下的K8s资源
如果不指定namespace时,默认查看的是default空间下对应的资源
查看指定namespace下所有的资源
语法:
kubectl get all -n <namespace-name>
查看所有namespace下指定的资源
语法:
kubectl get <resource-type> --all-namepsace # 或者 kubectl get <resource-type> -A
查看指定namespace下指定的资源
语法:
kubectl get <resource-type> -n <namespace-name>
总结
整体来说,在生产环境中查看资源的相关信息时,可以通过-n选项指定对应的namespace