在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. 简单谈谈 TCP/IP

    1.前言 IP 或 ICMP.TCP 或 UDP.TELNET 或 FTP.以及 HTTP 等都属于 TCP/IP 协议. 他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分.TCP/I ...

  2. LG1290 欧几里德的游戏

    https://www.luogu.com.cn/problem/P1290 博弈论游戏,用到mod. 辗转相除法的过程,会构成n种状态. 到达最后一个状态就赢了. 对于一次过程如果div>1那 ...

  3. 阿里云服务器ECS Ubuntu16.04 初次使用配置教程(图形界面安装)

    原文链接:? 传送门 前一阵子购买了阿里云的云服务器ECS(学生优惠),折腾了一阵子后对有些东西不太满意,所以就重新初始化了磁盘,刚好要重新安装图形界面,于是就顺手写了这么一篇文章. 第一次登陆服务器 ...

  4. 龙芯 3A4000 安装 Debian stable

    2022-01-17 版权声明:原创文章,未经博主允许不得转载 3A5000 开始,龙芯转向 loongarch ,新的架构虽然甩掉了历史包袱,但也需要一段时间来积累生态.在这半年多的时间里, loo ...

  5. vue2如何根据不同的环境配置不同的baseUrl

    在正常的开发中,通常我们需要在线上的测试环境中运行代码来检查是否有些线上才会出现的bug或者是问题.每次去特意的修改我们的baseUrl显然是不现实的,而且说不定哪天忘记了估计会被大佬喷死 首先,这是 ...

  6. 「Python实用秘技04」为pdf文件批量添加文字水印

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...

  7. 分布式一致性协议Raft,以及难搞的Paxos

    https://blog.csdn.net/colorant/article/details/73887706

  8. 总是记不住但又总是要用的css

    有没有经常遇到一些样式每次写都要用百度呢?我收集了一些我平时经常要用到的但又总是记不住的样式.有错误的地方欢迎指正.转载请注明出处. 一.设置input 的placeholder的字体样式 input ...

  9. 阿里巴巴基于应用和变更的交付模式|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  10. 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...