命名空间 (Namespace)

命名空间 (NS, Namespace) 为 Kubernetes 集群提供虚拟的隔离作用,Kubernetes 集群初始有两个命名空间,分别是默认命名空间 default 和系统命名空间 kube-system,除此以外,管理员可以可以创建新的命名空间满足需要。

在一个 Kubernetes 集群中可以使用 namespace 创建多个“虚拟集群”,这些 namespace 之间可以完全隔离,也可以通过某种方式,让一个 namespace 中的 service 可以访问到其他的 namespace 中的服务,这需要通过 RBAC 定义集群级别的角色来实现。

Kubernetes 集群在启动后,如果不特别指明 Namespace,则用户创建的 Pod、RC、Service 都被系统创建到 default 的 Namespace 中。

哪些情况下适合使用多个 namespace

因为 namespace 可以提供独立的命名空间,因此可以实现部分的环境隔离。当你的项目和人员众多的时候可以考虑根据项目属性,例如生产、测试、开发划分不同的 namespace。

获取集群中的所有 Namespace

kubectl get namespaces
kubectl get ns

集群中默认会有defaultkube-system这两个 namespace。

在执行kubectl命令时可以使用-n指定操作的 namespace。

用户的普通应用默认是在default下,与集群管理相关的为整个集群提供服务的应用一般部署在kube-system的 namespace 下,例如我们在安装 kubernetes 集群时部署的kubednsheapseterEFK等都是在这个 namespace 下面。

另外,并不是所有的资源对象都会对应 namespace,nodepersistentVolume就不属于任何 namespace。

创建命名空间

比如创建一个 development 的命名空间, 首先撰写 yaml 文件, 如下:

test.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: test
  labels:
    name: test
$ kubectl create -f ./test.yaml
namespace/test created

也可直接使用命令创建:

$ kubectl create ns traefik # or `kubectl create namespace traefik`
namespace/traefik created

指定命名空间

在创建资源(Pod/RC/Service 等)时使用 namespace 字段指定命名空间, 若不指定默认使用 default 命名空间

nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
  labels:
    name: nginx-test-qzy
  namespace: test
spec:
  containers:
    - name: nginx-test
      image: nginx
      ports:
        - containerPort: 8081
          hostPort: 8081
$ kubectl create -f ./nginx.yaml
pod/nginx-test created

查询命名空间中的资源

直接使用 kubectl get pods 时,默认使用的是查询 namespace=default 的,加上 -n 参数可查询指定命名空间中的资源。同理创建 RC/Service 也是一样的。

kubectl get pods -n test
kubectl get pods --all-namespaces  # 查询所有命名空间的pod

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress