云原生之kubernetes调度约束(scheduler调度器)

本文深入探讨了Kubernetes的调度机制,包括调度过程、预选策略、优选策略,以及如何通过指定节点、标签选择、亲和性和污点容忍来控制Pod的调度。详细讲解了亲和性调度的硬策略和软策略测试,以及污点和容忍的设置,以实现更精细的资源分配和负载均衡。
摘要由CSDN通过智能技术生成

目录

前言:

一、K8s调度约束

1、调度过程

2、调度的阶段

二、“重启”策略

三、建立POD的详细过程

四、调度方式

1、指定调度节点

2、通过label-selector机制选择节点,由调度器调度策略匹配 label,然后调度 Pod 到目标节点

3、节点标签、及删除

五、 亲和性(pod.spec.nodeAffinity)

1、为什么需要亲和性

2、节点的亲和性

3、Pod的亲和性

4、键值运算关系

5、硬亲和策略测试

6、软亲和测试

六、污点和容忍

1、概括

2、每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用

3、设置污点(NoSchedule)

4、删除污点

5、配置污点(NoExecute) 

6、配置容忍

七、Pod启动阶段


前言:

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,这需要根据调度方式进行选择。

调度方式分为四大类:

①、自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出

②、定向调度:NodeName、NodeSelector

③、亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity

④、污点(容忍)调度:Taints、Toleration

一、K8s调度约束

kubernetes是通过list-watch的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现解耦。

1、调度过程

Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。调度考虑方向如下:

①、公平:如何保证每个节点都能被分配资源

②、资源高效利用:集群所有资源最大化被使用

③、效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作

④、灵活:允许用户根据自己的需求控制调度的逻辑

2、调度的阶段

①、首先是过滤掉不满足条件的节点,这个过程称为预选策略(predicate)

②、然后对通过的节点按照优先级排序,这个是优选策略(priorities)

③、最后从中选择优先级最高的节点。

ps:预选策略的算法

①、PodFitsResources(pod匹配资源):节点上剩余的资源是否大于 pod 请求的资源

②、PodFitsHost(pod匹配主机名):如果 pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配

③、PodFitsHostPorts(pod匹配端口):节点上已经使用的 port 是否和 pod 申请的 port 冲突

④、PodSelectorMatches:过滤掉和 pod 指定的 label 不匹配的节点

⑤、NoDiskConflict:已经 mount 的 volume 和 pod 指定的 volume 不冲突,除非它们都是只读

二、“重启”策略

重启策略(restartPolicy):当Pod 中的容器退出时通过节点上的 kubelet 重启容器(默认策略),适应与pod中的所有容器

重启得到方式:

1、Always:当容器终止退出后,总是重启容器,默认策略

2、onFailure:当容器异常退出(退出状态码非0)时,重启容器;正常退出则不重启容器

3、Never:当容器终止退出后,从不重启容器

查看重启策略的方法及以yaml文件的方式修改:可进行直接修改。

[root@master ~]# kubectl edit pods nginx-ceshi-789db4b458-7dhlv

例如:修改nginx的版本号

[root@master ~]# kubectl describe pods nginx-ceshi-789db4b458-7dhlv   ###查看pod的详细信息

  
三、建立POD的详细过程

创建过程:

①、 pod在启动后,Controller Manager(运行在 Master),Scheduler(运行在 Master),kubelet(运行在 Node),他们都会监听(Watch)ApiServer发生的事件;

②、 用户通过 kubectl 或其他 API 客户端提交请求给 APIServer 来建立一个 Pod 对象副本;

③、APIServer 尝试着将 Pod 对象的相关元信息存入 etcd 中,待写入操作执行完成,APIServer 即会返回确认信息至客户端;

④、当 etcd 接受创建 Pod 信息以后,会发送一个 Create 事件给 APIServer;

⑤、此时处于监听状态的scheduler(调度器),会向api-server请求后端资源信息,然后根据预选、优选策略,选定创建POD的节点,并将信息返回至api-server;

⑥、由于 Controller Manager 一直在监听(Watch,通过https的6443端口)APIServer 中的事件
。此时 APIServer 接受到了 Create 事件,又会发送给 Controller Manager;

⑦、Controller Manager 在接到 Create 事件以后,调用其中的 Replication Controller 
来保证 Node 上面需要创建的副本数量。一旦副本数量少于 RC 中定义的数量,RC 会自动创建
副本。总之它是保证副本数量的 Controller;

⑧、在 Controller Manager 创建 Pod 副本以后,APIServer 会在 etcd 中记录这个 Pod 的详细
信息

四、调度方式

1、指定调度节点

ps:当指定调度节点后,在创建POD的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值