在Kubernetes中,调度是指将Pod放置到合适的Node上,然后对应的Node上的Kubelet才能够运行这些pod。调度器通过Kubernetes的监测机制来发现集群中新创建且尚未被调度的Node上的Pod。K8s中默认的调度器是kube-scheduler, 当然,也可以自行实现一个自定义的调度器。

配合之前针对Node的静态超卖与动态超卖,需要更符合项目实际的调度器。在开始之前,先来看几个相关的概念:

驱逐:

kubelet监控集群节点的CPU, 内存,磁盘空间和文件系统的inode等资源。当这些资源中的一个或多个达到特定的消耗水平,kubelet可以通过主动地使节点上一个或多个Pod失效,以回收资源防止资源不足。(当然,kubelet在终止最终用户Pod之前会尝试回收节点级资源。例如,它会在磁盘资源不足时删除未使用的容器镜像。当然这不在我们的考虑范围内。) 驱逐实质上是kubelet主动终止Pod以回收节点上资源的过程。

由kubelet发起的驱逐称为节点压力驱逐,这种方式下,如果使用了 软驱逐条件 kubelet会考虑配置的 eviction-max-pod-grace-period (驱逐宽限期), 如果使用了 硬驱逐条件 它会立即驱逐pod。

当然也可以通过API发起驱逐,API发起的驱逐通过Eviction API创建驱逐对象,由它来体面地中止Pod。API发起的驱逐将尊村你的PodDisruptionBudgets (干扰预算,即PDB) 和 terminationGracePeriodSeconds (pod生命周期)配置。

重调度:

将pod调度到指定的Node上运行是一个比较复杂的过程,有几个概念需要介绍一下:

  • nodeSelector 通过在PodSpec中定义它,选择node标签中包含每个键值对的对应的节点
  • 亲和性与反亲和性(affinity/antiaffinity) 相比之下,这个规则更想是 软需求 或是 偏好,因此如果调度器无法满足该要求,仍然调度该pod
    • 可以使用node里的pod的标签来约束,而不是使用node本身的标签。这可以实现允许哪些pod应当放到一起,或者不应当放到一起。
  • 污点和容忍度(taints/tolerations) 上面的亲和性与反亲和性,nodeSelector都是Pod的一种属性。而污点则是Node上属性,它能使节点排斥一类特定的Pod
    • 想像一下pod都是有洁癖的,一旦node上有污点并且pod不能容忍这个污点,那么这个pod就不会被分配在这个node上
    • 同样,pod如果可以容忍污点,还是可以正常的分配。
    • 一个node上可以有0个或多个污点
  • PDB: PodDisruptionBudget能够针对自发的驱逐(即上面提到的通过API发起驱逐)提供保护
    • 例如将minAvailable设置为10,那么即使是在干扰期间,也必须保证始终有10个Pod可用
    • PDB不能完全保证指定数量/指定百分比的Pod一直处于运行状态,如当Pod集合的规模处于预算指定的最小值时,恰好某个pod又发生了故障,就会导致pod数量低于预期值。

污点的effect值NoExecute会影响已经在节点上运行的Pod,此时

    • 如果pod不能忍受effect值为NoExecute的污点,那么Pod将被马上驱逐
    • 如果Pod能忍受这个污点,但在容忍度tolerationSeconds上没有定义,则Pod还会一直在节点上运行
    • 如果Pod能够忍受这个污点,并且指定了tolerationSeconds,那么pod还会在这个节点上运行指定的时间长度

------------------------------------------------分割线-------------------------------------------------------------------------------------------------

下面是笔者关于descheduler的一次实验

先简单介绍一下,descheduler是由社区提供,用于支持多种策略的调度器,可以根据不同策略对pod进行二次调度,使得node的使用率更加均衡一些。descheduler本身也支持许多不同的调度策略。

准备工作:

deschueduler部署:

社区提供了基于Helm, Kustomize等多种部署方式,这次实验采用的是手动部署的方式

  1. git clone 源代码
  2. make image 生成镜像文件
  3. docker tag / docker push 准备好镜像文件
  4. 修改descheduler/kubernetes/base下的configMap文件,禁用其他策略,仅保留RemoveDuplicates,用于驱逐在同一个node上部署的多个相同pod的副本
  5. kubectl create -f kubernetes/base/rbac.yaml 为descheduler授权
  6. kubectl create -f kubernetes/base/configmap.yaml 初始化配置相关文件

其他准备:

针对要测试用的pod

    1. 修改pod spec, 添加nodeSelector
    2. 为集群下105,106,108node添加对应的labels
    3. 部署pod有一定概率在108机器上同时部署两个相同的pod (此处基于kube-scheduler的默认调度策略,未查看具体原因)

实验记录:

1. 通过kubectl get pods -n 你的namespace -o wide 查看pod,确认确实有两个相同的pod都部署到了108节点上

2. 通过kubectl apply -f descheduler/kubernetes/cronjob/cronjob.yaml 开启descheduler的cronjob (cronjob 根据cron表达式指定的周期定期执行job,具体针对k8s来说,cronjob controller会定期创建对应的job pod)

此时的descheduler的配置为:

仅开启了RemoveDuplicates策略

3. 一段时间后再次通过kubectl get pods -n cloudadvisor-qa -o wide 查看pod,显示结果如下,发现原有pod已被驱逐并在105节点上重建

4. 通过 kubectl get jobs -n kube-system 找到当前cronjob创建的descheduler job,  然后再通过kubectl get pods -n kube-system -l job-name='jobname' 查看当前job所在的pod  注意-l 根据label选择的使用

5. 查看这个pod对应的日志,并搜索与我们要观察的oversold相关的部分(这里为了后续查看,已经导出为文件了)

这里可以看到descheduler先是发现了 duplicate的node节点,然后进行Adjusting feasible调整,并且可以看到驱逐的节点hkcl8正是刚刚我们在108创建的重复pod之一

k8s笔记--驱逐与重调度,以及deschueduler的一次实验的更多相关文章

  1. 读书笔记:《重来REWORK》

    读书笔记:<重来REWORK> <重来Rework--更为简单有效的商业思维>这本书是看了别人的书单而购买的,初 拿到这本书翻看时,感觉有两点与平常的书不同,一是每个小节非常短 ...

  2. k8s 笔记

    一. 解决pod间依赖性 1.手动的采用不同顺序启动不同pod 2.定义restart policy(默认为alway,我们可以定义当某条件不满足时就一直重启,当满足条件是才启动容器) 3.如果对于强 ...

  3. 【Kubernetes】K8s笔记(十一):Ingress 集群进出流量总管

    目录 0. Ingress 解决了什么问题 1. Ingress Controller 2. 指定 Ingress Class 使用多个 Ingress Controller 3. 使用 YAML 描 ...

  4. K8S笔记

    K8S 集群结构图 一些名词: etcd etcd保存了整个集群的状态:用于持久化存储集群中所有的资源对象,如Node.Service.Pod.RC.Namespace等:API Server提供了操 ...

  5. 【学习笔记】Kruskal 重构树

    1. 例题引入:BZOJ3551 用一道例题引入:BZOJ3551 题目大意:有 \(N\) 座山峰,每座山峰有他的高度 \(h_i\).有些山峰之间有双向道路相连,共 \(M\) 条路径,每条路径有 ...

  6. [Quartz笔记]玩转定时调度

    简介 Quartz是什么? Quartz是一个特性丰富的.开源的作业调度框架.它可以集成到任何Java应用. 使用它,你可以非常轻松的实现定时任务的调度执行. Quartz的应用场景 场景1:提醒和告 ...

  7. go lang学习笔记——channel机理及调度理解

    <Go语言编程>一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现. libtask库的channel的数据结构如下: struct Alt { Channe ...

  8. RHCA学习笔记:RH442-Unit8进程与调度

      UNIT 8  Processes and the Scheduler 进程与调度 学习目标 A. CPU cache 与Service time之间的关系 B. 分析应用程序使用CPU cach ...

  9. ReactiveX 学习笔记(12)调度器

    Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...

随机推荐

  1. Linux安装Collabora Online让NextCloud支持Office在线编辑

    https://www.xiaoz.me/archives/10865 NextCloud可通过插件实现在线编辑Office文档,不过前提是需要依赖于Collabora Online服务,记录一下操作 ...

  2. xshell 所选的用户密钥未在远程主机上注册;无法加载密钥

    他山之石 https://zhuanlan.zhihu.com/p/92528287 安全起见,服务器最近的安全策略准备进行更改,逐渐由原来的密码登录更换为密钥登录认证. 于是今天把服务器上的id_r ...

  3. SSM简单实现文件上传和下载

    一.配置spring-mvc <!-- 配置多媒体文件解析器 --> <bean id="multipartResolver" class="org.s ...

  4. 攻防世界-进阶-[re1-100]

    一.收集程序信息 64位的ELF文件,没有壳 二.放入IDA 使用64位IDA打开文件,先进行静态分析查看伪代码,进入main函数 通过这段可以得知输入的内容存储到了input中(这里我将bufwri ...

  5. Git 的配置 config

    Git 的配置 config Git 的配置 config config 文件简述 config 文件位置 信息查询 修改 config 文件 编辑配置文件 增加指定配置项 删除指定配置项 自助餐   ...

  6. 计算机视觉--CV技术指南文章汇总

    前言  本文汇总了过去本公众号原创的.国外博客翻译的.从其它公众号转载的.从知乎转载的等一些比较重要的文章,并按照论文分享.技术总结三个方面进行了一个简单分类.点击每篇文章标题可阅读详细内容 欢迎关注 ...

  7. Mysql group by之 Error 1055

    统计每个班级有多少人 我按照班级名称进行分组,返回  班级id和班级name出现了如下错误 报错的查询语句如下 -- 统计每个班级有多少人select c.id,c.name,count(*) fro ...

  8. SSM框架——thymeleaf学习总结

    本人关于thymeleaf的学习源自: https://www.bilibili.com/video/BV1qy4y117qi 1.thymeleaf的项目搭建 首先创建springboot项目,相关 ...

  9. 【刷题-LeetCode】150 Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  10. 【笔记】thanos receiver的router模式