Kubernetes高级调度方式

简介: 文章介绍了Kubernetes的高级调度方式,包括调度器的工作机制、节点倾向性(Node Affinity)和Pod倾向性(Affinity)。

作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.Kubernetes调度器及调度机制

  Kubernetes有一个程序名称为kube-scheduler的组件,它是负责K8S集群的调度工作,主要工作是完成Pod在哪个Node节点上运行。

  kube-scheduler也是kube-apiserver的客户端,它关注kube-apiserver的Pods资源清单中的nodeName(我们在编写资源清单时可以指定Pods被调度到哪个节点上运行)的值是否为空,若为空,则k8s默认的调度器会在众多的Node节点选择一个最佳的Pod节点来运行此Pod,选定以后,他就把最初的节点名赋值给NameNode字段并提交给kube-apiserver程序(kube-apiserver会将该数据保存到etcd中)。由于kubelet也监听了kube-apiserver的pods资源,当对应的pods信息发生改变时,kube-apisever会将消息发送给对应的kebulet节点,而后kubelet通过调用本地的docker引擎来创建对应的pods资源。

  kube-scheduler默认调度器工作逻辑评估一个节点的步骤分为:预选(predicate),优先(priority)和选定(select)。
    预选(predicate):
      K8S有很多预选器和预选程序来帮忙评估某个节点是否符合Pods的基本运行要求。这些基础要求包括但不限于存储卷过滤器(Volume Filters),CPU,内存等资源过滤器(Resource Filter),拓扑过滤器(Topology Fileters)。
      比如一个20个节点集群过滤掉有污点的节点,仅剩下node102,node108,node109,node113,node117,node119,node120这7个节点。这7个节点可以进行下一步评估,那被排除掉的13个节点则不会参与下一轮评估。
    优先(priority):
       K8S有很多优先级选择函数,每一个节点被带入到每一个优先级选择函数,经由所有优先级选择函数得到的分值的累加结果就是该节点的最终得分。而后,基于最终得分进行虚拟排序,从中选择最高的分数节点来允许Pods。
      通过预选阶段后的节点可能有多个,那么默这多个节点会有一个评分机制,会根据各节点进行评分哪个节点运行Pods的环境最佳进行打分。
      如果能直接得出一个最高分的节点,那么下一步骤基本上就敲定该pods在哪个节点上运行。如果不能直接得出一个最高分,话句话说,有多个节点同时得到最高分,比如从上一步节点过滤出来的node102,node117,node120这3个节点并列第一,那么会进行下一步骤。
    选定(select):
      通过优先阶段后的节点也可能有多个,那么选定阶段就得从多个节点中随机选定一个节点来进行调度。

  K8S的调度器也是插件化实现的,我们可以使用内建的调度器,用户也可以自定义调度器,并且在创建Pods时咱们可以指定使用什么调度器来帮我们创建Pods。如果我们编写Pods的资源清单时没有指定调度器,则K8S会使用默认的内置调度器(default scheduler)。

  如果你有Golang基础,建议查看Kubernetes源码,查看源码可以看到最新发布版本的具体实现逻辑,当然你得有扎实的Go基础,具体可以参考下面给出Kubernetes的GitHub地址.  

  博主推荐阅读:
    https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler

[root@master200.yinzhengjie.org.cn ~]# kubectl explain pods.spec.schedulerName
KIND:     Pod
VERSION:  v1

FIELD:    schedulerName <string>

DESCRIPTION:
     If specified, the pod will be dispatched by specified scheduler. If not
     specified, the pod will be dispatched by default scheduler.
[root@master200.yinzhengjie.org.cn ~]#

[root@master200.yinzhengjie.org.cn ~]# kubectl explain pods.spec.schedulerName                #用于定义Pods调度器的关键字

[root@master200.yinzhengjie.org.cn ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
pod-demo   1/1     Running   0          43s
[root@master200.yinzhengjie.org.cn ~]# 
[root@master200.yinzhengjie.org.cn ~]# 
[root@master200.yinzhengjie.org.cn ~]# kubectl get pods pod-demo -o yaml | grep schedulerName
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"creationTimestamp":null,"name":"pod-demo","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.14-alpine","imagePullPolicy":"IfNotPresent","name":"nginx","resources":{}}],"dnsPolicy":"ClusterF
irst","enableServiceLinks":true,"priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{}}}  schedulerName: default-scheduler
[root@master200.yinzhengjie.org.cn ~]#

[root@master200.yinzhengjie.org.cn ~]# kubectl get pods pod-demo -o yaml | grep schedulerName       #定义Pods时若没有指定调度器名称,则使用默认的调度器

二.节点倾向性(Node Affinity)

  节点倾向性(也可以称为关联性/亲和性)在概念上类似于nodeSelector,它允许您基于节点上的标签约束pod有资格被调度的节点。  

  如下所示,节点倾向性分为硬限制和软限制(我们甚至还可以自定义硬限制和软限制的标准),后缀命中的"IgnoredDuringExecution"意思是调度完成后,即使节点标签发生改变而不再符合调度条件时并不会影响到已经调度完成的结果,这类似于nodeSelector的共组逻辑。  
    硬限制:  
      requiredDuringSchedulingIgnoredDuringExecution  
    软限制:  
      preferredDuringSchedulingIgnoredDuringExecution  
    
  新的节点亲和性(Node Affinity)语法支持以下运算符(其中NotIn和DoseNotExist可实现类似node anti-affinity的效果,即节点反亲和性):  
    In  
    NotIn  
    Exists  
    DoseNotExst  
    Gt  
    Lt  

  Node Affinty规则的生效方式如下所示:  
    同时指定的nodeSelector和nodeAffinity之间存在"与"关系,即符合条件的Node需要同时满足两个条件;  
    为nodeAffinity同时指定多个nodeSelectorTerms时,各条目间取逻辑"或"关系,即满足其中之一即可;  
    同一个nodeSelectTerms中的多个matchExpression存在逻辑"与"关系,即Node需要同时满足多个条件;  
    如果移除或更改pod计划所在节点的标签,pod将被移除。换句话说,关联选择仅在安排pod时有效;  
    preferredDuringSchedulingIgnoredDuringExecution中的权重字段在1-100之间;  
    对于满足所有调度需求的每个节点(资源请求,RequiredDuringScheduling关联表达式等),调度程序将通过迭代此字段的元素计算总和,并在节点对应的MatchExpression匹配时将"权重"添加到总和。

[root@master200.yinzhengjie.org.cn ~]# cat required-nodeAffinity-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: with-required-nodeaffinity
spec:
  affinity:
    nodeAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - {key: zone, operator: In, values: ["foo"]}
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
[root@master200.yinzhengjie.org.cn ~]#

[root@master200.yinzhengjie.org.cn ~]# cat required-nodeAffinity-pod.yaml

[root@master200.yinzhengjie.org.cn ~]# cat required-nodeAffinity-pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: with-required-nodeaffinity-2
spec:
  affinity:
    nodeAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - {key: zone, operator: In, values: ["foo", "bar"]}
          - {key: ssd, operator: Exists, values: []}
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
[root@master200.yinzhengjie.org.cn ~]#

[root@master200.yinzhengjie.org.cn ~]# cat required-nodeAffinity-pod2.yaml

[root@master200.yinzhengjie.org.cn ~]# cat required-nodeAffinity-pod3.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: with-required-nodeaffinity-3
spec:
  affinity:
    nodeAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - {key: zone, operator: In, values: ["foo", "bar"]}
          - {key: ssd, operator: Exists, values: []}
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    resources:
      requests:
        cpu: 6
        memory: 20Gi
[root@master200.yinzhengjie.org.cn ~]#

[root@master200.yinzhengjie.org.cn ~]# cat required-nodeAffinity-pod3.yaml

三.Pod倾向性(Affinity)

  和节点亲相信不同,节点倾向性指的是Pod和Node之间的关系,而Pod的倾向性指的是Pod与Pod之间的关系,比如多个Pods能否运行在同一个节点,能否运行在同一个机柜,能够运行在同一个机房等。
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 边缘计算 Kubernetes
边缘计算问题之YurtControllerManager 接管原生 Kubernetes 的调度如何解决
边缘计算问题之YurtControllerManager 接管原生 Kubernetes 的调度如何解决
100 1
|
6月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 —阿里云ACK One注册集群开启多地域Serverless算力调度
本文介绍了阿里云ACK One注册集群多地域Serverless算力调度解决方案,解决传统数据中心在AI时代面临的算力不足问题。方案通过分钟级接入、100%兼容Kubernetes操作及云上Serverless弹性,实现跨地域弹性算力供给,支持高并发请求与模型快速迭代。文中详细描述了快速接入步骤、指定地域调度及动态调度方法,并提供了相关代码示例。该方案助力企业实现AI推理服务的规模化部署,提升商业落地效率。
|
6月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 -- 阿里云ACK One注册集群开启多地域Serverless算力调度
传统单地域算力难以支撑AI推理场景的高并发实时响应、突发高流量的要求,阿里云容器服务ACK One注册集群推出多地域Serverless算力调度方案完美解决此问题。
|
7月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
Kubernetes 负载均衡 调度
在k8S中,Pod的常见调度方式有哪些?
在k8S中,Pod的常见调度方式有哪些?
|
12月前
|
应用服务中间件 调度 nginx
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
|
机器学习/深度学习 Kubernetes 调度
Kubernetes与GPU的调度:前世今生
本文详细探讨了Kubernetes与GPU的结合使用,阐述了两者在现代高性能计算环境中的重要性。Kubernetes作为容器编排的佼佼者,简化了分布式系统中应用程序的部署与管理;GPU则凭借其强大的并行计算能力,在加速大规模数据处理和深度学习任务中发挥关键作用。文章深入分析了Kubernetes如何支持GPU资源的检测与分配,并介绍了热门工具如NVIDIA GPU Device Plugin和Kubeflow的应用。
|
12月前
|
Kubernetes 应用服务中间件 调度
k8s的Pod常见的几种调度形式
k8s的Pod常见的几种调度形式
179 0
|
Kubernetes 调度 容器
在k8S中,Requests和Limits如何影响Pod的调度?
在k8S中,Requests和Limits如何影响Pod的调度?
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?

热门文章

最新文章