默认情况下,kubernetes 集群中的所有的 Pod 都是可以相互访问的。但是在实际中,可能不想让两个 Pod 之间进行互相的访问,那此时就可以将两个 Pod 划分到不同的 namespace 下。kubernetes 通过将集群内部的资源分配到不同的 Namespace 中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理
可以通过 kubernetes 的授权机制,将不同的 namespace 交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合 kubernetes 的资源配额机制,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等等,来实现租户可用资源的管理
默认的创建的 Namespace
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 45h # 所有未指定 Namespace 的对象都会被分配在 default 命名空间
kube-node-lease Active 45h # 集群节点之间的心跳维护,v1.13 开始引入
kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system Active 45h # 所有由 Kubernetes 系统创建的资源都处于这个命名空间
Namespace 具体操作
查看
# 1 查看所有的ns 命令:kubectl get ns[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 7d3h
dev Active 51m
kube-node-lease Active 7d3h
kube-public Active 7d3h
kube-system Active 7d3h
# 2 查看指定的 ns 命令:kubectl get ns ns名称 [root@master ~]# kubectl get ns default
NAME STATUS AGE
default Active 45h
# 3 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数# kubernetes支持的格式有很多,比较常见的是 wide、json、yaml[root@master ~]# kubectl get ns default -o yaml# 4 查看ns详情 命令:kubectl describe ns ns名称[root@master ~]# kubectl describe ns default
Name: default
Labels: <none>
Annotations: <none>
Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间# ResourceQuota 针对 namespace 做的资源限制# LimitRange 针对 namespace 中的每个组件做的资源限制
No resource quota.
No LimitRange resource.
创建
# 创建namespace[root@master ~]# kubectl create ns dev
namespace/dev created
删除
# 删除namespace[root@master ~]# kubectl delete ns dev
namespace "dev" deleted
配置方式
首先准备一个 yaml 文件:ns-dev.yml
apiVersion: v1
kind: Namespace
metadata:
name: dev
# 命令格式: kubectl run (pod 控制器名称) [参数] # --image 指定 Pod 的镜像# --port 指定端口# --namespace 指定 namespace[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev
deployment.apps/nginx created
查看 pod 信息
# 查看Pod基本信息[root@master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 43s
# 查看 Pod 的详细信息[root@master ~]# kubectl describe pod nginx -n dev
注意:如果这里出现了 network: open /run/flannel/subnet.env: no such file or directory 的问题,可以在每个节点执行下面命令来操作
vim /run/flannel/subnet.env
# 填入下面内容FLANNEL_NETWORK=10.10.0.0/16
FLANNEL_SUBNET=10.10.0.1/24
FLANNEL_MTU=1450FLANNEL_IPMASQ=true
访问 Pod
[root@k8s-master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-dd6b5d745-bzvlj 1/1 Running 0 10m 10.10.0.2 k8s-node2 <none><none># 访问 POD(去对应节点访问)[root@k8s-node2 ~]# curl http://10.10.0.2:80
删除指定 Pod
# 删除指定Pod[root@master ~]# kubectl delete pod nginx-dd6b5d745-bzvlj -n dev
pod "nginx" deleted
[root@k8s-master ~]# kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
nginx-dd6b5d745-68vpg 1/1 Running 0 52s
# 这是因为当前 Pod 是由 Pod 控制器创建的,控制器会监控 Pod 状况,一旦发现 Pod 死亡,会立即重建# 此时要想删除 Pod,必须删除 Pod 控制器# 先来查询一下当前 namespace 下的 Pod 控制器[root@k8s-master ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 11 9m7s
# 接下来,删除此PodPod控制器[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted
# 稍等片刻,再查询 Pod,发现 Pod 被删除了[root@k8s-master ~]# kubectl get pods -n dev
No resources found in dev namespace.
配置操作
创建一个 pod-nginx.yml,内容如下:
apiVersion: v1
kind: Pod
metadata:name: nginx
namespace: dev
spec:containers:-image: nginx:latest
name: pod
ports:-name: nginx-port
containerPort:80protocol: TCP