Kubernetes中Pod的调度

Pod的调度

1,调度器分类

  • 单体调度器(k8s 默认调度器)
    优点:易于管理,逻辑简单。
    缺点:但是集群规模大的时候,每来一个请求调度一次,效率不高。

  • 两层调度器-Mesos
    上层是应用(各种不同分应用hardoop )调度,底层资源调度。

  • 状态共享调度器(Omwega、k8s 多调度器)、

2,调度器需要考虑的因数

  • 公平性
  • 资源高效利用
  • QoS:(两个应用再一个节点上用抢CPU,怎么保证业务不受影响)调度系统的QoS,3s完成调度。
  • 亲和性(affinity)与反亲和性(anti-affinity):两个实例尽量不部署在一起,尽量把两个服务部署在两个不同的故障域。
  • 数据本地化(哪里有数据就部署在哪,减少数据的传输):
    运行一个容器镜像,知道某个节点上有这个镜像,就优先调度在这个节点上,不用在重新拉取。
  • 内部负载干扰(QoS):
    错峰:确保不同的负载落在同一个节点上,干扰最小,有些应用3点高峰,有些应用0点高峰,相互的干扰比较小。
    相反似:有的应用是CPU密集型,有的应用是网络密集型。

3,调度插件

  • PreFilter
:计算Pod资源需求的总和。
  • Filter:计算节点剩余资源是否满足 Pod 需求
  • Score:依据用户配置的资源分配策略为节点算分:
    LeastAllocated: 选着节点的时候,谁的剩余资源多,优先调度pod。
    MostAllocated:哪个分配的pod多,资源少,平分就比较高,就分配pod在那个。(好处是没有业务的节点,可退回去,节省资源)
    RequestedToCapacityRatio

4,kubernetes中默认调度器kube-scheduler

监听集集群中api-server,查询未被分配Node的pod,根据调度策略为这些pod分配节点(更新pod的NodeName 字段)
1》调度阶段
1,预选策略(predicate):先排除那些完全不符合此pod运行法则的节点,有两个维度来排除,一个是最低资源需求,即节点必须满足此Pod的最低资源;第二个是资源限额,即当前节点最多能给pod提供的资源。
2,优选(priority):在符合节点找到最佳匹配的节点,资源 越富裕、负载越小的 Node 优先级越高。
2》绑定阶段:
1,绑定(select):把pod绑定到优选的节点上。
在这里插入图片描述



面试重点
影响调度的属性

在这里插入图片描述
资源限制对Pod调度的影响

容器资源限制:

  • resources.limits.cpu
  • resources.limits.memory

容器使用的最小资源需求,作为容器调度时资源分配的依据:

  • resources.requests.cpu
  • resources.requests.memory

在这里插入图片描述
K8s会根据Request的值去查找有足够资源的Node来调度此Pod。
可分配资源-已经存在(调度的)Pod对应的资源 > Request 说是个可调度的资源

面试常问的Kubernetes资源管理题

1.Pod资源需求中的request和limit分别代表什么?Kubernetes是如何利用这两个属性的?
request:需要的最少资源,如果一个节点不满足request,这个节点就不适合节点。
limit:最要的最多资源。
思考:kubelet 驱逐pod的时候会参考 request ,limit是什么样的一个策略?

2.如何提升Kubernetes集群中的资源利用率

  • 降配,把request 贴近真实使用率。
  • 弹性能力(纵向和横向)
  • 错峰混合部署
    3.Kubernetes中常见的弹性能力有哪些,适用场景分别是什么?

HPA 横向弹性:基于业务指标做弹性(加实例减实例)
适用于无状态的应用,内存无法回收的,例如是java应用,内存资源申请了不会还回去,因为波峰变成波谷的时候减少实例java占用的内存会少。
VPA(纵向弹性):使用于有状态应用(statefulset),不能随便加减实例,
CA:集群层面的弹性


5,pod常见的调度方式

1》Pod和Node之间亲和性调度
NodeSelect(定向调度):手动指定将pod调度到特定的Node上,可以通过Node的标签(label)和pod的nodeSelect 属性匹配。
Nodeaffinity(亲和性调度):表示pod对这个节点有一定的倾向性,通过nodeselector来完成这类调度;

  • requiredDuringSchedulingIgnoredDuringExecution(硬亲和):必须满足 指定的规则,调度器才可以调度 Pod 至 Node 上(类似 nodeSelector,语法 不同)
  • preferredDuringSchedulingIgnoredDuringExecution(软亲和):优先调度 至满足的 Node 的节点,但不强求,多个优先级规则还可以设置权重值。

2》Pod和Pod之间的亲和性调度
有时我们期望某些Pod运行在同一个节点上或者是相邻的节点上,或者我们期望某些Pod不能运行在某些节点上。
podaffinity:基于pod的标签来选择Node,仅调度满足条件的pod到所在的Node上,
podunaffinity:确保多个实例跑在不同的故障域。

3》污点和污点容忍
taints和tolerations(污点和污点容忍调度)
假设一个节点出现异常或者这个节点只给某个团队用,kubernetes会给这个节点打一个污点,打污点可以加不同的策略。
目前支持的Taint类型:

  • NoSchedule :新的pod不调度到改Node上,不影响正在运行的pod;
  • PreferNodeScheduler:soft版的NoScheduler,尽量不调度到该Node上;
  • NoExecute:新的Pod不调度到该Node上,并且删除(evict)已经运行的Pod。Pod可以增加一个时间几秒(tolerationSeconds),在几秒后删除。

多调度器

重度调度器

扩展调度器
本省的调度器没办法满足需求。

  • Extender
    Scheduler Extender通过注册外部webhook来扩展默认调度器以调整不同阶段的调度决策。

优势:
- 根据自己的需要实现的Filter方法、Prioritize 方法、Bind方法。
- 可以扩展现有调度器的功能,而无需重新编译二进制文件。
- 扩展器可以用任何语言编写。
- 实现后,可用于扩展不同版本的 kube-scheduler。
缺陷:
- Extender扩展点的数量是有限的。
- 性能问题(核心缺陷)。

动态调度器

  • Scheduler-Controller周期性地从Prometheus拉取各个节点的真实负载数据,再以Annotation 的形式标记在各个节点上;

  • Scheduler则直接在从候选节点的Annotation读取负载信息,并基于这些负载信息在Filter阶段对节点进行过滤以及在Score 阶段对节点进行打分。
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值