Pod
1、Pod基本概念
(1)最小部署的单元
(2)包含多个容器(一组容器的集合)
(3)一个pod中容器共享网络命名空间
(4)pod是短暂的
2、Pod存在意义
(1)创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序。
(2)Pod是多进程设计,运行多个应用程序
一个Pod有多个容器,一个容器里面运行一个应用程序
(3)Pod存在为了亲密性应用
- 两个应用之间可以进行交互
- 网络之间调用
- 两个应用需要频繁调用
3、Pod实现机制
- 共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,可以实现网络共享。
容器本身之间相互隔离的(namespace、group)
前提条件:容器在同一个ns里面
每一个Pod都有一个特殊的被称为“根容器”的pause容器。
- 共享存储:引入数据卷概念volum,使用数据卷进行持久化存储
4、镜像拉取策略
apiVersion: v1
kind: Pod
metadata:
name:mypod
spec:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: Always
#ifNotPresent:默认值,镜像在宿主机上不存在时才拉取
#Always:每次创建Pod都会重新拉取一次镜像
#Never:Pod永远都不会主动拉取这个镜像
5、Pod资源限制
本身是由docker进行限制的
6、Pod重启机制
apiVersion: v1
kind: Pod
metadata:
name:mypod
spec:
containers:
- name: nginx
image: nginx:1.14
restartPolicy: Nerver
#Always:当容器终止退出后,总是重启容器,默认策略。
#OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
#Never:当容器终止退出,从不重启容器。
7、Pod健康检查
(1)通过容器进行检查
(2)应用层健康检查
Pod的调度
创建Pod的流程
1、影响调度的属性
(1)Pod资源限制对Pod调度产生影响
根据request找到足够node节点进行调度
(2)节点选择器标签影响Pod调度
-
首先对节点创建标签
kubectl label node node1 env_role=prod
[root@k8smaster ~]# kubectl label nodes k8snode1 env_role=dev node/k8snode1 labeled [root@k8smaster ~]# kubectl get nodes k8snode1 --show-labels NAME STATUS ROLES AGE VERSION LABELS k8snode1 Ready <none> 29h v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env_role=dev,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8snode1,kubernetes.io/os=linux [root@k8smaster ~]# kubectl get nodes k8snode1 --show-labels NAME STATUS ROLES AGE VERSION LABELS k8snode1 Ready <none> 29h v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env_role=dev,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8snode1,kubernetes.io/os=linux
-
节点选择器
(3)节点亲和性,nodeAffinity和之前nodeSelector基本一样的,根据节点上标签的约束来决定Pod调度到哪些节点上,比节点选择器强大
-
硬亲和性
约束条件必须满足
-
软亲和性
尝试满足,不保证
支持常用操作符:In 、NotIn 、 Exists、Gt、Lt、DoesNotExits
(4)污点和污点容忍
- 基本介绍
nodeAffinity和nodeSelector:Pod调度到某些节点上,Pod属性,调度时候实现
Taint污点:节点不做普通分配调度,是节点属性
-
应用场景
- 专用节点
- 配置特定硬件节点
- 基于Taint驱逐
查看当前节点污点情况:
[root@k8smaster ~]# kubectl describe node k8smaster | grep Taint Taints: node-role.kubernetes.io/master:NoSchedule
污点值有三个:
(1)NoSchedule:一定不被调度
(2)PreferNoSchedule:尽量不被调度
(3)NoExcute:不会调度,并且还会驱逐Node已有Pod
为节点添加污点:
kubectl taint node [node] key=value:污点三个值 kubectl scale deployment nginx --replicas=5 [root@k8smaster ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-f89759699-fzv6b 1/1 Running 0 27s 10.244.1.4 k8snode1 <none> <none> nginx-f89759699-nzzfj 1/1 Running 0 27s 10.244.2.3 k8snode2 <none> <none> nginx-f89759699-rp7kn 1/1 Running 0 2d4h 10.244.2.2 k8snode2 <none> <none> nginx-f89759699-rtrvn 1/1 Running 0 27s 10.244.1.3 k8snode1 <none> <none> nginx-f89759699-x7zcr 1/1 Running 0 27s 10.244.2.4 k8snode2 <none> <none> #通过命令删除pod [root@k8smaster ~]# kubectl delete deployment nginx deployment.apps "nginx" deleted #获取pod命令 [root@k8smaster ~]# kubectl get pod No resources found in default namespace. #给节点1(k8snode1)添加污点 [root@k8smaster ~]# kubectl taint node k8snode1 env_role=yes:NoSchedule node/k8snode1 tainted #查看节点1上面的污点 [root@k8smaster ~]# kubectl describe node k8snode1 | grep Taint Taints: env_role=yes:NoSchedule #创建镜像 [root@k8smaster ~]# kubectl create deployment web --image=nginx deployment.apps/web created #创建5个副本 [root@k8smaster ~]# kubectl scale deployment web --replicas=5 deployment.apps/web scaled #查看节点运行情况 [root@k8smaster ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-5dcb957ccc-5d7sq 1/1 Running 0 10s 10.244.2.6 k8snode2 <none> <none> web-5dcb957ccc-9t5bt 1/1 Running 0 93s 10.244.2.5 k8snode2 <none> <none> web-5dcb957ccc-b5wrt 1/1 Running 0 10s 10.244.2.8 k8snode2 <none> <none> web-5dcb957ccc-jm5hf 1/1 Running 0 10s 10.244.2.7 k8snode2 <none> <none> web-5dcb957ccc-tlmlf 1/1 Running 0 10s 10.244.2.9 k8snode2 <none> <none>
为节点删除污点:
[root@k8smaster ~]# kubectl describe node k8snode1 | grep Taint Taints: env_role=yes:NoSchedule #删除污点方式 [root@k8smaster ~]# kubectl taint node k8snode1 env_role:NoSchedule- node/k8snode1 untainted [root@k8smaster ~]# kubectl describe node k8snode1 | grep Taint Taints: <none>
污点容忍
就算值被设定为NoSchedule,也可能被调度到
key和value是设置节点污点的时候的key和value。