写点什么

实战:通过 Pod Priority 保障 Kubernetes 中的关键组件

  • 2020-03-04
  • 本文字数:2339 字

    阅读完需:约 8 分钟

实战:通过 Pod Priority 保障 Kubernetes 中的关键组件

关键组件

集群内部运行的组件,某些组件会相比其他组件来说更为重要,缺少了这些组件,集群的核心功能或者用户业务将无法得到保障:比如 DNS 组件,当 DNS 组件运行异常,集群内部的 DNS 服务将不可用;又比如网络组件,当网络组件异常,某个节点甚至集群的网络将不可用。


Kubernetes 提供了不少机制来保证组件的正常运行,比如:


  • 通过配置 pod 的 restartPolicy,我们可以保证这个 pod 异常退出后,能重新运行起来;

  • 通过配置 deployment 的 replicas,我们可以保证这个 pod 有指定个存活的副本,防止单点故障;

  • 通过配置 pod 的 liveness 和 readiness 检测,我们可以及时发现 pod 的异常状态;

  • 通过配置 pod 资源的 requests 和 limits,我们可以保证这个 pod 有适当的资源来运行。


通常情况下,这些机制保障了组件的正常运行。


下面我们假想一种情况:集群内的一个节点出现异常,控制器检测到这个节点异常后,开始重新调度异常节点上的 pod;假设这个时候,集群的其它节点可用的资源已经不多了,异常节点上有 10 个 pod 等待重新调度,调度完一半后,其它 5 个 pod 因为没有可用资源无法调度,而在这 5 个等待调度的 pod 里,恰好有一个核心应用。这个时候,集群的运行因为核心应用缺失而得不到保障。


如何应对这两种情况呢,我们可以从下面两个角度来解决:


  • 调度优先级:如果调度器能够识别出这是一个核心应用,优先调度这个应用,那么只要在决定调度前,资源还满足这个应用调度的情况下,就可以优先确保关键应用被调度出去;

  • 抢占:当资源不满足核心应用的调度时,通过驱逐出其它低优先级的应用,挪出资源来给核心应用运行。

Critical Add-On Pods

Critical pods 是 Kubernetes 里面标记关键组件的一种方式。除开 api-server, scheduler, controller-manager 这些系统核心组件,诸如 Heapster, DNS 等组件对于集群完整功能起到关键作用。这些关键组件因为某些原因被驱逐,处于等待调度时,配置 Critical pods 标记的组件可以确保被重新调度。


配置 Critical pods


开启 feature-gates


打开 kubelet, controller-manager 的 feature-gates,具体参数如下:



部署 Rescheduler


Rescheduler 可以通过 static pod 的方式运行,默认把 manifest 文件:


https://github.com/kubernetes/kubernetes/blob/release-1.8/cluster/saltbase/salt/rescheduler/rescheduler.manifest


放到 master 节点的 /etc/kubernetes/manifests/ 目录下即可。


Rescheduler 在 Kubernetes 1.10 版本标记为 deprecated,我们可以通过配置 Pod Priority 来达到类似的功能。


配置 Critical pods


默认情况下,Critical pods 运行在 kube-system 分区下,我们需要给这个 pod 如下额外配置:


  • 配置 annotations:

  • 配置 tolerations:



使用 Critical pods


下面我们来通过 Critical pods 来解决上述的问题:


首先,我们配置好 feature-gates,这里我们不使用 Rescheduler。


获取当前的可用资源信息,包括可用容量,当前使用量:



运行一个 pod ,并占用掉大部分的可用资源:



确认当前资源使用情况:



再跑一个 pod,并申请大量资源,pod 会因为资源不足而处于 pending 状态:



将 resource-big 配置成 Critical pods ,观察事件和运行情况:



DIY


在上面的例子中,我们没有使用 Rescheduler,在资源不足的情况下,Critical pod 仍然可以通过抢占的模式,来保证运行。感兴趣的可以自己动手做些改变,思考下 Critical pod 实现的原理:


  • namespace: 把 namespace 从 kube-system 改为其它分区;

  • qos: 创建多个 pod 来占用节点资源,并使用不同 qos 类型来申请资源,观察哪个 pod 会被驱逐;

  • 尝试把 DaemonSet 切换为 Deployment 看是否还能达到预期效果;如果不行,可以尝试部署 Rescheduler。


关于 Preemption 的实现,看兴趣的可以查看这个 PR:


https://github.com/kubernetes/kubernetes/pull/40952

Pod Priority and Preemption

Critical pods 是 Kubernetes 中较早实现的保证关键应用运行的一种手段和尝试,包括与之相关的 Rescheduler。但 Critical pods 及 Rescheduler 在使用时不是非常地灵活,而且只能区分关键应用和非关键应用两种类型,后面(Kubernetes 1.8 开始)引入了 Pod Priority。下面我们来看看 Pod Priority 的使用。


Priority


Priority 表明了 pod 相对于其它 pod 的重要程度,开启 pod priority 特性后,Kubernetes 会保证高优先级的 pod 被成功调度和运行。当 pod 调度不成功时,低优先级的 pod 会被驱逐出去,腾出空间给高优先级的 pod 使用。在 1.9 及以后的版本,Priority 同时会影响调度的顺序以及资源不足时 pod 被驱逐的顺序。


PriorityClass


PriorityClass 是一种 Kubernetes 资源,定义了集群内置的 Priority ,主要属性有 name 和 value,分别代表了这个 PriorityClass 的名字及优先级。通过指定 priorityClassName,可以把 pod 于现存的同名 PriorityClass 关联。value 越高,表示 pod 优先级越高。


配置 Pod Priority


开启 feature-gates


打开 kubelet, scheduler, apiserver 的 feature-gates,具体参数如下:



开启 API 及 admission controller


配置 apiserver 的 runtime-config 及 admission-control 参数:



使用 Pod Priority


我们现在尝试通过 Pod Priority 来解决上述的问题:


首先,我们配置好 feature-gates,runtime-config 及 admission-control。


获取当前的可用资源信息,包括可用容量,当前使用量:



创建两个不同优先级的 PriorityClass:



运行一个 pod ,配置普通优先级,并占用掉大部分的可用资源:



确认当前资源使用情况:



再跑一个 pod,并申请大量资源,pod 会因为资源不足而处于 pending 状态:



将 resource-big 的 priorityClassName 配置成 high-priority ,观察事件和运行情况:



本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/AqfwOiUogN2-bimzBI0ocw


2020-03-04 16:06908

评论

发布
暂无评论
发现更多内容

软件交付周期缩短!且看精益思想如何加速全局价值流动

嘉为蓝鲸

DevOps 敏捷 精益

京东承办“创客北京2022” 京东科技参与并推出三大服务举措

京东科技开发者

数字化转型 供应链 企业服务 中小企业

Java面向对象之继承

楠羽

兆骑科创创新人才引进,高端人才引进,项目落地引进

兆骑科创凤阁

机器学习/评分卡常用指标及计算

Joshua

机器学习 AI 信息熵 评分卡

Canvas 低代码拖拽建模,支持离线任务|ModelWhale 版本更新

ModelWhale

数据分析 Jupyter Notebook 课程 离线部署 低代码报告

历时4个月,4大板块,328页52188字,SpringMVC源码解析文档

冉然学Java

Java spring Spring MVC 构架 Spring Web MVC、

语音直播app——满足不同行业的业务需求

开源直播系统源码

软件开发 直播系统源码 语音直播系统 语音直播app

快速实现 CDN 直播

ZEGO即构

CDN 直播 音视频开发

不要让CMDB沦为数据孤岛!运维高质量CMDB“修炼”之道

嘉为蓝鲸

运维 数据 配置 CMDB 配置管理

一文读懂工业设备预测性维护的概念与实现

PreMaint

企业设备管理 预测性维护 设备健康管理 状态检测 振动监测

秒杀架构分析与实践

Bruce Duan

签约计划第三季

【LeetCode】用户分组Java题解

Albert

LeetCode 8月月更

【8.5-8.12】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

你要的 Helm Chart 应用金丝雀发布终于来了!

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

什么是网络即服务 (NaaS)?

wljslmz

网络技术 8月月更 NaaS 网络即服务

兆骑科创双创服务平台,招商引资、招企引税、招才引智

兆骑科创凤阁

MySQL 原理与优化:原数据锁的应用

老崔说架构

一块GPU训练TB级推荐模型不是梦,OneEmbedding性能一骑绝尘

OneFlow

深度学习 gpu 模型

室内led大屏幕可以用在室外吗?​

Dylan

LED显示屏 户外LED显示屏 户内led显示屏

Spring Cache设计之美,你品,你细品...

华为云开发者联盟

后端 开发

分布式系统大势所趋,银行运维如何与时俱进?

嘉为蓝鲸

架构 分布式 运维 金融 银行

一文了解如何托管SVN储存库,以及版本控制的更佳选择

龙智—DevSecOps解决方案

svn 版本控制 版本管理 版本控制系统

涛思数据加入龙蜥社区,携手共建时序数据库生态

OpenAnolis小助手

数据库 涛思数据 开源 龙蜥社区 CLA

CI与开源代码安全篇 | 龙智邀您共赴GOPS全球运维大会,探索大规模、敏捷、安全、开放式的软件研发与运营之路

龙智—DevSecOps解决方案

GOPS大会 运维‘

CI/CD | 使用静态代码分析工具,有效补充持续集成

龙智—DevSecOps解决方案

cicd 持续集成 CI/CD

【分布式集群】微服务电商应用系统的集群构建

嚯嚯嚯www

Linux

2022不容错过的50个“低代码”发展现状、趋势与数据统计

优秀

低代码 无代码

熬夜肝了这一份C++开发详细学习路线

C++后台开发

后台开发 C/C++ 后端开发 C++后台开发 C++开发

Neo4j导入思知OwnThink开源的知识图谱

Joshua

nlp neo4j 知识图谱

干货合集 | 关于制品库,你了解多少?

嘉为蓝鲸

DevOps 研发 制品库

实战:通过 Pod Priority 保障 Kubernetes 中的关键组件_文化 & 方法_才云科技_InfoQ精选文章