介绍
在 k8s 中使用 namespace 可以将对象分割成完全独立且不重叠的组。
k8s 的 namspace 为对象名称提供了一个作用域,通过将资源组织到不同的命名空间中,可以允许我们多次使用相同的资源名称。
人话就是,如果只有一个 namespace,那么单个 namespace 下是不能出现两个同名的 pod。但是,如果有多个 namespace ,就可以在不同的 namespace 下使用相同名字的 pod。
k8s 中的 namespace 就类似于 windows 中的多个桌面,或者 linux 中的多个终端;namespace 之间的 api 对象是不可见的。只有在同一个 namespace 中的 api 对象,才能互相可见。 (pod 间调用是另一回事。)
命名空间除了上面那个可以使用重名pod的作用外,还有两个方面的作用:
- 资源隔离:可为不同的团队提供虚拟的集群空间,共享同一个 Kubernetes 集群的资源。比如可以为团队A 创建一个 Namespace ns-a,团队A的项目都部署运行在 ns-a 中,团队B创建另一个Namespace ns-b,其项目都部署运行在 ns-b 中,以期望尽量减小它们之间的相互影响。甚至可以使用 ResourceQuota 与 Resource LimitRange 来指定与限制各个 namesapce 的资源分配与使用,具体用法之后在细聊,
- 权限控制:可以指定某个 namespace 哪些用户可以访问,哪些用户不能访问,甚至是 get put delete 等粒度的权限控制。
常用命令
//列出集群中所有的命名空间:
kubectl get ns
//指定命名空间,列出只属于该命名空间的 pod
kubectl get pod --namespace kube-system //一般使用 -n 来代替 --namespace
//使用 yaml 文件创建一个 namespace
cat custom-namespace.yaml
apiVersion: v1
kind: Namespace <-- 表示正在定义一个 命名空间
metadata:
name: custom-namespace <-- 命名空间的名称
kubectl create -f custom-namespace.yaml
//使用命令创建 namespace:
kubectl create namespace custom-namespace
使用 namespace 管理 pod
方法一:
在 yaml 中的 metadata.namespace 中定义所属的 namespace。
方法二:
使用 kubectl create 命令创建资源时,使用 -n 指定 pod 所在的命名空间
kubectl create -f xxx.yaml -n namespace
如果不指定命名空间,kubectl 将在当前上下文中配置的命名空间中执行操作(可以使用 kubectl config 命令更改)。
如果不写namespace,一般默认是在 default 下。