概述

namespace实现了资源的隔离,是kubernetes 集群级别的资源,用于将集群分隔为多个隔离的逻辑分区以配置给不同的用户、租户、环境或项目使用。
kubernetes 的绝大多数资源都隶属于名称空间级别,名称空间资源为这类资源名称提供了隔离的作用域,同一名称空间内的同一类型的资源名必须是唯一的,但跨名称空间时并无此限制。
kubernetes中还有一些资源隶属于集群级别的,如Node,namespace 和persistentVolume等资源,其不属于任何名称空间,因此资源对象的名称必须是全局唯一。
kubernetes 的名称空间资源不能实现Pod之间的通信隔离,仅用于限制资源对象名称的作用域。并不限制资源的通信。
kubernetes 集群默认提供了几个名称空间用于特定的目的,kube-system主要用于运行系统级别的资源,而default则为那些为指定名称空间的资源操作提供默认值

操作空间

查看空间

  1. kubectl get ns #简写
  2. kubectl get namespaces #全写

kubenetes安装完默认有三个名称空间:

  1. default: 默认的 namespace。如果不指定 -n 参数,默认操作的就是default空间,比如不指定命名空间,默认创建的所有资源对象都在这个命名空间下。
  2. kube-system:运行着 kubernetes 系统创建的资源对象。系统级别的Pod都运行在此名称空间中
  3. kube-public命名空间中的资源可以被所有人访问(包括未认证用户)

查看指定名称空间并指定格式输出

  1. kubectl get ns/kube-system -o [yaml|json|wide|name]

查看系统的kube-system的信息,ns 即 namespace 的简写

  1. $ kubectl get ns kube-system -o yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. creationTimestamp: "2020-07-15T17:01:53Z"
  6. managedFields:
  7. - apiVersion: v1
  8. fieldsType: FieldsV1
  9. fieldsV1:
  10. f:status:
  11. f:phase: {}
  12. manager: kube-apiserver
  13. operation: Update
  14. time: "2020-07-15T17:01:53Z"
  15. name: kube-system
  16. resourceVersion: "15"
  17. selfLink: /api/v1/namespaces/kube-system
  18. uid: a44ffa7c-6f01-4760-aa32-7a7891d914db
  19. spec:
  20. finalizers:
  21. - kubernetes
  22. status:
  23. phase: Active

查看详细信息

  1. [root@master ~]# kubectl describe namespace default
  2. Name: default
  3. Labels: <none>
  4. Annotations: <none>
  5. Status: Active
  6. No resource quota.
  7. No resource limits.

查看其它资源下的pod

  1. [root@master ~]# kubectl get pods -n prom
  2. NAME READY STATUS RESTARTS AGE
  3. custom-metrics-apiserver-746485c45d-kjl9p 1/1 Running 5 5d
  4. kube-state-metrics-68d7c699c6-lghtm 1/1 Running 5 5d
  5. monitoring-grafana-7f99994bc4-kgqrq 1/1 Running 5 5d
  6. prometheus-node-exporter-nxdls 1/1 Running 5 5d
  7. prometheus-server-77c8c48b9-cvf6z 1/1 Running 5 5d


创建空间

kubectl create namespace web1
其仅支持字母、数字、连接线、下划线等字符组成。
文本创建:

  1. # demonamespace.yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: web2

创建

  1. kubectl apply -f demonamespace.yaml

查看

  1. [root@master ~]# kubectl get namespace
  2. NAME STATUS AGE
  3. default Active 12d
  4. ingress-nginx Active 8d
  5. kube-public Active 12d
  6. kube-system Active 12d
  7. prom Active 11d
  8. web Active 2d
  9. web1 Active 19m
  10. web2 Active 6s

使用命令直接创建新的命名空间

  1. $ kubectl create namespace dev [14:52:05]
  2. namespace/dev created
  3. $ kubectl create namespace prod [14:53:42]
  4. namespace/prod created

删除空间

需要注意的是删除 namespace 时会将 namespace 下的资源一并删除

  1. $ kubectl delete namespace dev [15:20:40]
  2. namespace "dev" deleted

或者使用简写的ns 方式删除

  1. $ kubectl delete ns test
  2. namespace "test" deleted

一次删除多个名称空间

  1. ##简写
  2. kubectl delete ns/test ns/production
  3. kubectl delete ns test production
  4. ##全写
  5. kubectl delete namespace test production
  6. kubectl delete namespace/test namespace/production

运行环境Context

获取运行环境

  1. $ kubectl config get-contexts

新配置一个集群,名为 kubernetes-cluster,并配置 server

  1. $ kubectl config set-cluster kubernetes-cluster --server=http://localhost:32768 [15:04:29]
  2. Cluster "kubernetes-cluster" set.
  1. $ kubectl config set-context ctx-dev --namespace=dev --cluster=kubernetes-cluster --user=dev [15:05:22]
  2. Context "ctx-dev" created.

为 kubernetes-cluster 集群定义通过 prod 用户访问 prod 命名空间的运行环境名为 ctx-prod

  1. kubectl config set-context ctx-prod --namespace=prod --cluster=kubernetes-cluster --user=prod [15:06:54]
  2. Context "ctx-prod" created.

集群 kubernetes-cluster 绑定了不同的命名空间 dev 和 prod,运行环境(上下文)分别命名为 ctx-dev 和 ctx-prod。

  1. $ kubectl config get-contexts [15:07:05]
  2. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
  3. ctx-dev kubernetes-cluster dev dev
  4. ctx-prod kubernetes-cluster prod prod

使用 kubectl config use-context 来设置当前的运行环境。

  1. $ kubectl config use-context ctx-dev [15:07:49]
  2. Switched to context "ctx-dev"

创建nginx

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx_1.18
  9. replicas: 2
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx_1.18
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.18
  18. ports:
  19. - containerPort: 80
  1. $ kubectl get pods -o wide [15:16:36]
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. nginx-7dbdc5f8fc-2rp2w 0/1 ContainerCreating 0 23s <none> kube-node-1 <none> <none>
  4. nginx-7dbdc5f8fc-zqvfd 0/1 ContainerCreating 0 23s <none> kube-node-2 <none> <none>
  1. $ kubectl config use-context ctx-prod [15:18:17]
  2. Switched to context "ctx-prod".
  3. $ kubectl get deploy [15:18:46]
  4. No resources found.
  5. $ kubectl get pods
  6. No resources found.

结果为空也就证明了两个环境是被隔离的,彼此不会互相影响。

查看当前运行环境

  1. $ kubectl config current-context [15:19:19]
  2. ctx-prod