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

目录

前言:

一、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

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

例如:修改nginx的版本号

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

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

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

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

创建过程:

①、 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的时候会跳过scheduler,该匹配规则则属于强匹配,即使该节点配置了污点,污点也发挥不了作用。

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

[root@master scheduler]# kubectl get pods -o wide

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

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

①给节点打上标签:

节点node01打标签:
[root@master scheduler]# kubectl label nodes node01 ceshi=a
node/node01 labeled
节点node02打标签:
[root@master scheduler]# kubectl label nodes node02 ceshi=b
node/node02 labeled

yaml文件内容:

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

查看创建POD的节点

[root@master scheduler]# kubectl get pods -o wide

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

3、节点标签、及删除

①、查询标签

[root@master scheduler]# kubectl describe nodes node02 | grep -i ceshi=b

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

②、修改标签

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

③、 删除标签

[root@master scheduler]# kubectl label nodes node02 ceshi- ###在创建的命令,去掉标 签值加上”-“号

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

④、通过指定标签来查找节点

[root@master scheduler]# kubectl get nodes -l ceshi=a ### -l代表label的意思,指定标签名

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

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

1、为什么需要亲和性

在k8s的默认调度规则中,节点总会偏向于把所属于一个项目的所有Pod调度在同一节点上。若是服务器配置较低的情况下,较多的Pod调度于同一节点会在眨眼之间充分占用服务器硬件资源,而导致系统负载压力过大,访问不了Pod应用的情况。

2、节点的亲和性

节点亲和性(nodescheduler):基于节点的标签来限定Pod可以被调度到哪些节点上,让k8s集群自动进行负载均衡,提高性能。

①、节点亲和的两种类型:(pod.spec.nodeAffinity)

preferredDuringSchedulingIgnoredDuringExecution:软策略(记忆软屁,p打头即为软策略)

软策略:目标节点最好能满足此条件

requiredDuringSchedulingIgnoredDuringExecution:硬策略

硬策略:目标节点必须满足此条件

3、Pod的亲和性

①、pod点亲和的两种类型:(pod.spec.affinity.podAffinity/podAntiAffinity)

preferredDuringSchedulingIgnoredDuringExecution:软策略

requiredDuringSchedulingIgnoredDuringExecution:硬策略

4、键值运算关系

①、In:label 的值在某个列表中

②、NotIn:label 的值不在某个列表中

③、Gt:label 的值大于某个值

④、Lt:label 的值小于某个值

⑤、Exists:某个 label 存在

⑥、DoesNotExist:某个 label 不存在

5、硬亲和策略测试

①、查看每个节点的标签

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

②、 创建Yaml文件,创建POD

设置了一个标签,设置的键值关系为notin

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

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

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

查看调度过程,查看event事件:
[root@master scheduler]# kubectl describe pods affinity

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

6、软亲和测试

①、查看节点的所有标签

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

②、编写yaml文件

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

[root@master scheduler]# kubectl apply -f pod2.yaml
pod/affinity created

③、创建结果

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

④、查看pod的详细信息

[root@master scheduler]# kubectl get pods -o wide

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

六、污点和容忍

1、概括

污点,它使节点能够排斥一类特定的 Pod。Taint 和 Toleration 相互配合,可以用来避免 Pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 Pod,是不会被该节点接受的。如果将 toleration 应用于 Pod 上,则表示这些 Pod 可以(但不一定)被调度到具有匹配 taint 的节点上。

使用 kubectl taint 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去。

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

当前 taint effect 支持如下三个选项:

①、NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上

②、PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上

③、NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去

3、设置污点(NoSchedule)

[root@master scheduler]# kubectl taint node node01 ceshi=abc:NoSchedule ## 在node01上设置污点

[root@master scheduler]# kubectl create deployment nginx-noschedule –image=nginx –port=80 –replicas=3

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

节点node01上有污点,新建pod都不在node01上建立

4、删除污点

[root@master scheduler]# kubectl taint node node01 ceshi- ### 标签不带标签值后面加”-” 即可删除

删除一个副本,实验是否会在node01上创建

[root@master scheduler]# kubectl delete pod nginx-noschedule-545d5b4b4b-49cj4

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

5、配置污点(NoExecute)

[root@master scheduler]# kubectl taint node node02 ceshi-noexecute=a:NoExecute

配置了污点且具有驱逐,配置成功之后,把节点上所有的pod都驱逐出去

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

6、配置容忍

设置了污点的 Node 将根据 taint 的三种模式:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。但我们可以在 Pod 上设置容忍(Tolerations),意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上。

node01打污点(驱逐)

[root@master scheduler]# kubectl taint node node01 check=mycheck:NoExecute
node/node01 tainted

node02打污点(驱逐)

编辑创建pod的yaml文件

[root@master scheduler]# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp01
labels:
app: myapp01
spec:
containers:
– name: with-node-affinity
image: soscscs/myapp:v1

建立pod

[root@master scheduler]# kubectl apply -f pod3.yaml
pod/myapp01 created

持续观测新建pod状态

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

修该yaml文件,添加容忍

[root@master scheduler]# vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp01
labels:
app: myapp01
spec:
containers:
– name: with-node-affinity
image: soscscs/myapp:v1
tolerations:
– key: “check”
operator: “Equal”
value: “mycheck”
effect: “NoExecute”
tolerationSeconds: 3600

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

配置容忍后,含有污点的节点也能创建成功

七、Pod启动阶段

Pod 创建完之后,一直到持久运行起来,中间有很多步骤,也就有很多出错的可能,因此会有很多不同的状态

pod的创建过程中的几大步骤

(1)调度到某台 node 上。kubernetes 根据一定的优先级算法选择一台 node 节点将其作为 Pod 运行的 node
(2)拉取镜像
(3)挂载存储配置等
(4)运行起来。如果有健康检查,会根据检查的结果来设置其状态。

可能会出现的状态:

①、Pending:表示APIServer创建了Pod资源对象并已经存入了etcd中,但是它并未被调度完成(比如还没有调度到某台node上),或者仍然处于从仓库下载镜像的过程中

②、unning:Pod已经被调度到某节点之上,并且Pod中所有容器都已经被kubelet创建。至
少有一个容器正在运行,或者正处于启动或者重启状态(也就是说Running状态下的Pod不一
定能被正常访问)

③、Succeeded:有些pod不是长久运行的,比如job、cronjob,一段时间后Pod中的所有容器
都被成功终止,并且不会再重启。需要反馈任务执行的结果

④、Failed:Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容
器以非0状态退出或者被系统终止,比如 command 写的有问题

⑤、Unknown:表示无法读取 Pod 状态,通常是 kube-controller-manager 无法与 Pod 通信

Original: https://blog.csdn.net/m0_62948770/article/details/127776314
Author: 忙碌滴比特流
Title: 云原生之kubernetes调度约束(scheduler调度器)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/653301/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球