k8s 调度

本文详细介绍了k8s的调度过程,包括Pod调度、调度策略,如nodeSelector、podAffinity、podAntiAffinity、taints与tolerations,以及自定义调度和调度失败分析。内容涵盖k8s架构、Node与Pod定义,强调了调度器资源分配机制,如request与limit的影响,并探讨了公平性、高效性和性能优化。
摘要由CSDN通过智能技术生成

k8s 调度

1、 k8s 架构



k8s的架构如图:

我们都知道k8s分为master、node,其中:

master 主要有如下几个组件:

  • Kubernetes Controller Manager(kube-controller-manager):Kubernetes资源对象的”大总管”,是所有资源对象的自动化控制中心,比如Deployment中的pod副本数

  • Kubernetes API Server (kube-apiserver):Kubernetes的“心脏”,是集群控制的入口进程,也是所有资源增、删、查、改等操作的唯一入口

  • Kubernetes Scheduler(kube-scheduler):Kubernetes的”调度室“,负责资源调度(Pod调度)

  • etcd:是用于共享配置和服务发现的分布式,一致性的KV存储系统,被用作Kubernetes集群后端数据的持久化存储


  node 主要包含以下组件:

  • kubelet:负责Pod对应容器的创建、启停和销毁等任务

  • kube-proxy:与Kubernetes Service通信与负载均衡机制

  • Container Runtime:Docker Engine,负责本机容器的创建、启停与销毁等工作

2、k8s 调度


2.1  Pod 调度

这个过程看起来似乎比较简单,但实际生产环境的调度过程中,有很多问题需要考虑:

  • 首先,如何保证全部计算节点调度的公平性?如何保证每个节点都能被分配资源?

  • 其次,计算资源如何能够被高效利用?集群所有计算资源如何才能被最大化的使用?

  • 再次,如何保证Pod调度的性能和效率?如何能够快速的对大批量的Pod完成调度到较优的计算节点之上?

  • 最后,用户最了解自己的业务,用户是否可以根据实际需求定制自己的调度逻辑和策略?


2.2  Pod 调度过程

调度过程分为2个阶段:

  • 第一阶段:预选过程,过滤节点,调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。

  • 第二阶段:优选过程,节点优先级打分,对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。


代码位置(1.10 ):

https://github.com/kubernetes/kubernetes/tree/release-1.10/pkg/scheduler/algorithm

优选(Priorities)

经过预选策略(Predicates)对节点过滤,获取节点列表,再对符合需求节点列表进行打分,最终选择Pod调度到一个分值最高节点。

最终主机的得分用以下公式计算得出:

finalScoreNode = (weight1 * priorityFunc1) + (weight2 * priorityFunc2) + … + (weightn * priorityFuncn)

2.3  Node 定义

查看一个node的资源信息:

apiVersion: v1
kind: Node
metadata:
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/os: linux
    kubernetes.io/hostname: node-n1
  name: node-n1
spec:
  externalID: node-n1
status:
  addresses:
  - address: 10.162.197.135
    type: InternalIP
  allocatable:
    cpu: "8"
    memory: 16309412Ki
    pods: "110"
  capacity:
    cpu: "8"
    memory: 16411812Ki
    pods: "110"
  conditions: {...}
  daemonEndpoints:
    kubeletEndpoint:
      Port: 10250
  images: {...}
  nodeInfo: {...}

2.4  Pod 定义

查看一个pod的资源信息:

kubectl explain pod.spec

我们看这个pod:

  • requests:申请范围是0到node节点的最大配置

  • limits:申请范围是requests到无限大,即0 <= requests <=Node Allocatable, requests <= limits <= Infinity。

    说明:resoureces.limits影响pod的运行资源上限,不影响调度。

注释:

  • 红色部分表示资源分配

  • 浅蓝色表示采用的调度器

  • 灰色表示普通调度策略

  • 荧光色表示高级调度策略

2.5  k8s 调度器资源分配机制

  1. 基于Pod 中容器 request 资源“总和”调度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值