(2):Pod的基本操作及策略

一、Pod镜像拉取策略

在这里插入图片描述

这里的imagePullPolicy就代表了镜像的拉取策略:

1.Always:每次创建pod都会重新拉取一次镜像;

2.IfNotPresent:默认值,镜像不在宿主机上时才进行拉取;

3.Never:Pod永远不会主动拉取这个镜像。


二、Pod资源限制

request:

调度时用于计算所有pod请求的资源,不能超过node提供的总资源,request代表容器的最小资源

spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory


requests.cpu最终转化为docker的参数–cpu-shares,requests.memory在docker中无与之相对应的参数


limit:

限制容器占用的最大资源,如果超过就会终止容器:

spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory


limits.cpu最终转化为docker的参数–cpu-quota,limits.memory会被转换成docker的参数–memory

转化为yaml语言如下:


在这里插入图片描述


三、Pod重启策略

在这里插入图片描述

Always: 当容器终止并退出后,总是重启容器,默认策略;应用在一直提供服务的容器

OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器;

Never: 当容器终止退出,从不重启容器;应用在处理批量任务时


四、Pod健康检查

有些时候容器running,但是已经有异常了,比如java的内存溢出,就不能单单将容器的running作为健康状态的依据。

1.livenessProbe(存活检查)

如果检查失败,将杀死容器,根据Pod的restartPolicy来进行重启操作。

2.readlinessProbe(就绪检查)

如果检测失败,K8s会把Pod从service endpoints中删除,使用其他容器提供服务。

在这里插入图片描述


3.Probe(探针)支持的检测方法如下3种:

http Get

发送HTTP请求,返回200-400之间的状态码,表示成功

exec

执行shell命令返回状态码为0,表示成功

tcpSocket

发起TCP Socket建立,表示成功


五、Pod的创建流程(调度策略)

第1步:

创建Pod的命令发送给API Server,API Server收到请求后,将创建信息的属性信息(metadata)写入etcd,并返回结果

在这里插入图片描述


第2步:

(1)API Server通过触发watch机制准备创建pod,把创建信息转发给Scheduler;

(2)Scheduler使用调度算法选择合适的node,并将node信息返回给API Server;

(3)API Server将绑定的node信息写入etcd

(4)返回写入状态

在这里插入图片描述


第3步:

API Server再次通过watch机制,调用kubelet,指定pod信息,触发docker run命令创建容器,
创建完成之后反馈给kubelet, kubelet又将pod的状态信息返回给API Server,API Server又将pod的状态信息写入etcd。

在这里插入图片描述


kubectl get pods得到的结果就是从etcd中返回的信息。


影响Pod调度的属性

1.Pod资源限制:

request(参考第二点)


2.节点选择器标签(nodeSelector/nodeName)

spec:
  nodeSelector:
    env_role: dev #将Pod调度到不同的环境中去

开始之前,需要先给同一环境中的节点打上同一个标签:

设置标签:kubectl label node node1 env_role=env

查看标签:kubectl get node node1 --show-labels

查看所有节点的标签:kubectl get node --show-labels

删除标签:kubectl label node node1 env_role-

这个env_role叫做label-key,还可以自定义其他参数作为label-key,用法类似。

除在yaml中通过设置nodeSelector属性指定节点以外,用户也可以在命令行中通过参数-l或者–labels=指定节点的标签:

kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=3 --labels=‘mem=large’


另外一个选择器nodeName:通过指定节点名来确定将Pod部署到哪个node上。

spec:
  nodeName: 192.168.1.145

3.节点的亲和性

在这里插入图片描述

节点亲和性nodeAffinity和nodeSelector,根据节点上的标签约束来决定Pod被调度到哪些节点上。

硬亲和性:表示必须满足约束条件,否则会一直等待;

软亲和性:表示可以尝试满足这些约束条件,没有符合约束的节点,就去找其他节点调度,不会一直等待;

常用的操作符(operator):

In :values列出的值中

NotIn :不在里面

Exists:存在

Gt:大于

Lt:小于

DoesNotExists:不存在


六、污点(Taint)和污点容忍(Toterot)

nodeSelector和nodeAffinity:属于Pod属性,将Pod调度到某些节点上;
Taint:属于节点属性,节点不做普通的分配调度。

污点的使用场景:

1.指定专用节点去分配Pod

2.根据特定的硬件属性分配到指定节点

3.基于Taint做Pod的驱逐


查看节点的污点情况:
在这里插入图片描述

这里污点的值有三个:

NoSchedule:表示一定不会被调度

PreferNoSche:尽量不被调度,也有被调度的可能性

NoExecute:不但不会被调度,还会把已经调度到该节点的Pod给驱逐到其他节点去


为节点添加污点的命令:

kubectl taint node worker-145 key=value:污点值

测试:

kubectl create deployment web --image=nginx #创建一个Pod

在这里插入图片描述


kubectl scale deployment web --replicas=5 #扩容到5个副本

在这里插入图片描述
在这里插入图片描述


kubectl taint node worker-144 a1=a:NoExecute #设置污点

在这里插入图片描述
可以发现,原来144上的Pod全部被驱逐到145上去了。


污点的删除(和label的删除有点类似):

kubectl taint node worker-144 a1:NoExecute-

在这里插入图片描述


污点容忍:

即使节点被设置为NoSchedule(一定不会被调度),但是设置了污点容忍,就有被调度的可能。

在这里插入图片描述


这里面的key和value是添加污点时设置的参数。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一生要强的Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值