概述
namespace实现了资源的隔离,是kubernetes 集群级别的资源,用于将集群分隔为多个隔离的逻辑分区以配置给不同的用户、租户、环境或项目使用。
kubernetes 的绝大多数资源都隶属于名称空间级别,名称空间资源为这类资源名称提供了隔离的作用域,同一名称空间内的同一类型的资源名必须是唯一的,但跨名称空间时并无此限制。
kubernetes中还有一些资源隶属于集群级别的,如Node,namespace 和persistentVolume等资源,其不属于任何名称空间,因此资源对象的名称必须是全局唯一。
kubernetes 的名称空间资源不能实现Pod之间的通信隔离,仅用于限制资源对象名称的作用域。并不限制资源的通信。
kubernetes 集群默认提供了几个名称空间用于特定的目的,kube-system主要用于运行系统级别的资源,而default则为那些为指定名称空间的资源操作提供默认值
操作空间
查看空间
kubectl get ns #简写
kubectl get namespaces #全写
kubenetes安装完默认有三个名称空间:
- default: 默认的 namespace。如果不指定 -n 参数,默认操作的就是default空间,比如不指定命名空间,默认创建的所有资源对象都在这个命名空间下。
- kube-system:运行着 kubernetes 系统创建的资源对象。系统级别的Pod都运行在此名称空间中
- kube-public命名空间中的资源可以被所有人访问(包括未认证用户)
查看指定名称空间并指定格式输出
kubectl get ns/kube-system -o [yaml|json|wide|name]
查看系统的kube-system的信息,ns 即 namespace 的简写
$ kubectl get ns kube-system -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2020-07-15T17:01:53Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:status:
f:phase: {}
manager: kube-apiserver
operation: Update
time: "2020-07-15T17:01:53Z"
name: kube-system
resourceVersion: "15"
selfLink: /api/v1/namespaces/kube-system
uid: a44ffa7c-6f01-4760-aa32-7a7891d914db
spec:
finalizers:
- kubernetes
status:
phase: Active
查看详细信息
[root@master ~]# kubectl describe namespace default
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No resource limits.
查看其它资源下的pod
[root@master ~]# kubectl get pods -n prom
NAME READY STATUS RESTARTS AGE
custom-metrics-apiserver-746485c45d-kjl9p 1/1 Running 5 5d
kube-state-metrics-68d7c699c6-lghtm 1/1 Running 5 5d
monitoring-grafana-7f99994bc4-kgqrq 1/1 Running 5 5d
prometheus-node-exporter-nxdls 1/1 Running 5 5d
prometheus-server-77c8c48b9-cvf6z 1/1 Running 5 5d
创建空间
kubectl create namespace web1
其仅支持字母、数字、连接线、下划线等字符组成。
文本创建:
# demonamespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: web2
创建
kubectl apply -f demonamespace.yaml
查看
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 12d
ingress-nginx Active 8d
kube-public Active 12d
kube-system Active 12d
prom Active 11d
web Active 2d
web1 Active 19m
web2 Active 6s
使用命令直接创建新的命名空间
$ kubectl create namespace dev [14:52:05]
namespace/dev created
$ kubectl create namespace prod [14:53:42]
namespace/prod created
删除空间
需要注意的是删除 namespace 时会将 namespace 下的资源一并删除
$ kubectl delete namespace dev [15:20:40]
namespace "dev" deleted
或者使用简写的ns 方式删除
$ kubectl delete ns test
namespace "test" deleted
一次删除多个名称空间
##简写
kubectl delete ns/test ns/production
kubectl delete ns test production
##全写
kubectl delete namespace test production
kubectl delete namespace/test namespace/production
运行环境Context
获取运行环境
$ kubectl config get-contexts
新配置一个集群,名为 kubernetes-cluster,并配置 server
$ kubectl config set-cluster kubernetes-cluster --server=http://localhost:32768 [15:04:29]
Cluster "kubernetes-cluster" set.
$ kubectl config set-context ctx-dev --namespace=dev --cluster=kubernetes-cluster --user=dev [15:05:22]
Context "ctx-dev" created.
为 kubernetes-cluster 集群定义通过 prod 用户访问 prod 命名空间的运行环境名为 ctx-prod
kubectl config set-context ctx-prod --namespace=prod --cluster=kubernetes-cluster --user=prod [15:06:54]
Context "ctx-prod" created.
集群 kubernetes-cluster 绑定了不同的命名空间 dev 和 prod,运行环境(上下文)分别命名为 ctx-dev 和 ctx-prod。
$ kubectl config get-contexts [15:07:05]
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
ctx-dev kubernetes-cluster dev dev
ctx-prod kubernetes-cluster prod prod
使用 kubectl config use-context
$ kubectl config use-context ctx-dev [15:07:49]
Switched to context "ctx-dev"
创建nginx
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx_1.18
replicas: 2
template:
metadata:
labels:
app: nginx_1.18
spec:
containers:
- name: nginx
image: nginx:1.18
ports:
- containerPort: 80
$ kubectl get pods -o wide [15:16:36]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-7dbdc5f8fc-2rp2w 0/1 ContainerCreating 0 23s <none> kube-node-1 <none> <none>
nginx-7dbdc5f8fc-zqvfd 0/1 ContainerCreating 0 23s <none> kube-node-2 <none> <none>
$ kubectl config use-context ctx-prod [15:18:17]
Switched to context "ctx-prod".
$ kubectl get deploy [15:18:46]
No resources found.
$ kubectl get pods
No resources found.
结果为空也就证明了两个环境是被隔离的,彼此不会互相影响。
查看当前运行环境
$ kubectl config current-context [15:19:19]
ctx-prod