译文 | Kubernetes 1.26:PodDisruptionBudget 守护不健康 Pod 时所用的驱逐策略

news2024/11/29 0:56:01

对于 Kubernetes 集群而言,想要确保日常干扰不影响应用的可用性,不是一个简单的任务。上月发布的 Kubernetes v1.26 增加了一个新的特性:允许针对 PodDisruptionBudget (PDB) 指定不健康 Pod 驱逐策略,这有助于在节点执行管理操作期间,保证应用的可用性。

PodDisruptionBudget (PDB):https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets

01

解决什么问题?

API 发起的 Pod 驱逐需遵循 PodDisruptionBudget (PDB) 约束。这意味着因驱逐 Pod 而请求的自愿干扰,不应干扰守护的应用,且 PDB 的 .status.currentHealthy 不应低于 .status.desiredHealthy。如果正在运行的 Pod 状态为 Unhealthy,则该 Pod 不计入 PDB 状态,只有在应用不受干扰时,才可以驱逐这些 Pod。这有助于尽可能确保受干扰或还未启动的应用的可用性,确保不会因驱逐造成额外的停机时间。

但对于想要清空节点,而又不进行任何手动干预的集群管理员而言,这种机制很有问题。若一些应用因 Pod 处于 CrashLoopBackOff 状态(由于漏洞或配置错误)或 Pod 无法进入就绪状态而行为异常,会使这项任务变得更加复杂。这是因为当某应用的所有 Pod 均不健康时,所有驱逐请求都会因违反 PDB 而失败。这种情况下清空节点不会有任何作用。

另一方面,某些用户经常依赖现有行为来:

  • 防止因删除守护基础资源或存储的 Pod 而造成数据丢失;

  • 让应用达到最佳可用性。

Kubernetes 1.26 为 PodDisruptionBudget API 引入了新的实验性字段:.spec.unhealthyPodEvictionPolicy。启用此字段后,将允许你达成这两种目的。

02

工作原理

API 发起的驱逐,是触发 Pod 优雅终止的一个过程。这个过程可以通过直接调用 API 发起,也能使用 kubectl drain 或集群中的其他主体来发起。在这个过程中,移除每个 Pod 时将与对应的 PDB 协商,确保始终有足够数量的 Pod 在集群中运行。

而驱逐策略允许 PDB 创建者,进一步控制如何处理不健康的 Pod。有两个驱逐策略可供选择:IfHealthyBudget 和 AlwaysAllow。

前者 IfHealthyBudget 采用现有行为以达到你默认可获得的最佳可用性。不健康的 Pod 只有在其应用中可用的 Pod 个数达到 .status.desiredHealthy 即最小可用个数时才会被干扰。

通过将 PDB 的 spec.unhealthyPodEvictionPolicy 字段设置为 AlwaysAllow,可以表示为应用选择尽可能最佳的可用性。采用此策略时,始终能够驱逐不健康的 Pod。这可以简化集群的维护和升级。

我们认为 AlwaysAllow 通常是一个更好的选择,但是对于某些关键负载,你可能仍然倾向于防止不健康的 Pod 被从节点上清空,或其他形式的 API 发起的驱逐。

03

具体用法

这是一个 Alpha 特性,意味着你必须使用命令行参数 --feature-gates=PDBUnhealthyPodEvictionPolicy=true 为 kube-apiserver 启用 PDBUnhealthyPodEvictionPolicy 特性门控。

特性门控:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/

这里举一个例子。假设:

  • 已在集群中启用了此特性门控且已定义了运行普通 Web 服务器的 Deployment;

  • 已为 Deployment 的 Pod 打了标签 app: nginx;

  • 想要限制可避免的干扰,你知道对于此应用而言,尽力而为的可用性也是足够的;

  • 你决定即使这些 Web 服务器 Pod 不健康也允许驱逐;

  • 你创建 PDB 守护此应用,使用 AlwaysAllow 策略驱逐不健康的 Pod。

具体 YAML 如下:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: nginx-pdb
spec:
  selector:
    matchLabels:
      app: nginx
  maxUnavailable: 1
  unhealthyPodEvictionPolicy: AlwaysAllow

参考资料

[1] 阅读 KEP:Unhealthy Pod Eviction Policy for PDBs

https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3017-pod-healthy-policy-for-pdb

[2] 阅读针对 PodDisruptionBudget 的不健康 Pod 驱逐策略文档

https://kubernetes.io/zh-cn/docs/tasks/run-application/configure-pdb/#unhealthy-pod-eviction-policy

[3] 参阅 Kubernetes 文档--PodDisruptionBudget

https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets

[4] 参阅 Kubernetes 文档--清空节点

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/safely-drain-node/

[5] 参阅 Kubernetes 文档--驱逐

https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/api-eviction/

[4] 原英文博客:Kubernetes 1.26: Eviction policy for unhealthy pods guarded by PodDisruptionBudgets

https://kubernetes.io/blog/2023/01/06/unhealthy-pod-eviction-policy-for-pdbs/


本文译者

要海峰

现任「DaoCloud 道客」高级文档工程师

K8s reviewer,Istio maintainer,otel 等 member

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商云仓是如何包装发货的?

包装不时是为了维护产品,而它从工厂地板移动到大型仓库,并最终经过批发或批发店抵达消费者。但是,自21世纪初以来,消费者希望与那些不时吸收着某种情感的品牌联络在一同,同时央求他们在心理上对品牌中止投资&#xff0…

【Java AWT 图形界面编程】Canvas 组件中使用 Graphics 绘图 ④ ( AWT 绘图窗口闪烁问题 )

文章目录一、AWT 绘图窗口闪烁问题二、完整代码示例一、AWT 绘图窗口闪烁问题 使用 Graphics 第一次绘图 完成后 , 如果在循环中 持续调用 Canvas#repaint() 函数刷新界面 , 代码如下 : import java.awt.*;public class HelloAWT {public static void main(String[] args) thr…

MySQL进阶——存储引擎

MySQL有9种存储引擎,不同的引擎,适合不同的场景,我们最常用的,可能就是InnoDB,应该是从5.5开始,就成为了MySQL的默认存储引擎。 show engines可以查询MySQL支持的这几种存储引擎,从表头能看出来…

SVN工程转Git工程Github托管

SVN工程转Git工程&Github托管1. 介绍2. autoAudioTest之SVN转Github步骤Step 1 工作环境(ubuntu)Step 2 安装升级必要软件Step 3 转换脚本Step 4 检查软件运行环境Step 5 生成authors.txtStep 6 SVN转换Git格式Step 7 Github新建空工程Step 8 Git提交已有工程Step 9 Git提交…

Dubbo快速入门看这一篇文章就够了

网站用户少,流量小,抗压力差(eg: ssm)网站用户量进一步增长,流量增多,服务器不能平滑扩容(eg: 多个ssm)网站用户和流量随时间稳步升高,需要随时进行服务器扩容(eg: rpc/http) 第2节 分布式框架解决的问题 1 2 3 4 5 6随着互联网架构的越来越复杂,由原来的单一架构 ...到... 流动…

M320、M601、HD1(RTU)功能对比

M320、M601、HD1_RTU硬件 / 软件功能对比一、硬件1.HD1-RTU2.Haas506-M3203.Haas506-M6014.对比区别二、软件1.对比区别一、硬件 1.HD1-RTU 详情参考HaaS506-HD1 (RTU) - 硬件介绍 2.Haas506-M320 详情参考HaaS506-M320 - 开发板介绍 3.Haas506-M601 详情参考HaaS506…

(二十二)简单算法和Lambda表达式

目录 前言: 1.选择排序 2.二分查找 3.Lambda表达式 前言: 算法是一个程序和软件的灵魂,要成为一名优秀的程序员,只有对基础算法全面掌握,才能在设计程序和编写代码的过程中显得得心应手。常用的基础算法有快速排序算法、堆排序算法、归并排…

每日一问-ChapGPT-20230115-关于断舍离

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230115-关于断舍离人类脑是适合专心做一件事,还是适合并行做多件事做事情的优先顺序怎样安排chapGPT你是怎么学到这么多知识的chapGPT你拥有智慧吗chapGPT你是实时更新自己的模型吗chapGPT你有情感吗chapGPT你有…

C++程序卡死、UI界面卡顿问题的原因分析与总结

目录 1、概述 2、软件卡死问题 2.1、死循环 2.2、死锁 3、客户端软件的UI界面卡顿问题 3.1、UI线程在频繁地写日志到文件中,导致UI线程时不时的卡顿 3.2、从网上拷贝的代码中调用Sleep函数,导致UI界面有明显的卡顿 4、总结 VC常用功能开发汇总&a…

COCO_03 制作COCO格式数据集 dataset 与 dataloader

文章目录1 引言2 pycocotools介绍3 Dataset 构建4 Dataloader 构建4.1 解决batch中tensor维度不一致的打包问题4.2 collate_fn()函数分析AppendixA. convert_coco_poly_maskB. COCO_Transform参考1 引言 在之前的文章中,我们认识了COCO数据集的基本格式https://blo…

【设计模式】创建型模式·工厂模式

设计模式学习之旅(四) 查看更多可关注后查看主页设计模式DayToDay专栏 一.引子 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&…

NoSQLBooster for MongoDB 8.0.1 Crack

最智能的 MongoDB IDE NoSQLBooster 是 MongoDB Server 3.6-6.0 的跨平台 GUI 工具,它提供内置的 MongoDB 脚本调试器、全面的服务器监控工具、链接流畅查询、SQL 查询、查询代码生成器、任务调度、ES2020 支持和高级 IntelliSense经验。新版本 8.0 现已推出&#x…

Laravel文档阅读笔记-How to Build a Rest API with Laravel: A Beginners Guide①

随着移动端和JavaScript框架的发展,比如React和Vue,Restful风格的API越来越流行。使用Restful风格的好处就是一个后端程序可以与多个版本的前端用户界面关联。 Laravel提供了创建Rest API的环境和生态。 首先得导入依赖包比如Laravel Passport和Larave…

MySQL中给字符串字段加索引

文章目录前言一、前缀索引和普通索引二、前缀索引对覆盖索引的影响三、优化前缀索引前言 学完了MySQL索引部分,我们清楚的认识到给子段添加索引可以快速的进行查询,节约时间。但是索引有很多。那么对于字段怎么加索引,加什么索引。加到索引不…

linux基本功系列之useradd命令实战

文章目录一. useradd 命令介绍二. 语法格式及常用选项三. 参考案例3.1 不加任何参数创建用户3.2 创建不能登录系统且没有家目录的用户3.3 创建一个用户,ID为23333.4 创建一个用户并指定其附加组3.5 创建用户并账户过期时间3.6 与useradd相关的目录文件总结前言&…

InfluxDB的查询优化

首先,在学习influxDB的查询优化之前,我们要先学习下InfluxDB的解释器profiler(类似于mysql的Explain语句,不一样的是,sql,hivesql是提前查看执行计划等,Influx是在当前查询的最后一页两张表&…

力扣(LeetCode)382. 链表随机节点(2023.01.15)

给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。 实现 Solution 类: Solution(ListNode head) 使用整数数组初始化对象。 int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有…

WhatsApp居然有3个版本?深度详解区别!外贸圈获客神器用起来!

近两年,外贸圈用WhatsApp来营销获客,越来越火。不少走在前头的外贸人,已经尝到了甜头。但也有不少后来者,站在门外张望的时候,整个人都是蒙圈的。❓听说动不动要整几十个账号,还要花老长时间养号&#xff1…

《Linux Shell脚本攻略》学习笔记-第六章

6.1 简介 你开发应用程序的时间越长,就越能体会到有一个能够跟踪程序修订历史的软件是多重要。 大多数Linux发行版中都包含了Git。如果你的系统中还没有安装,可以通过yum或者apt-get获取。 6.2 创建新的git仓库 git中的所有项目都需要有一个用于保存项目…

MyBatis-Plus字段加密解密

项目创建POM依赖 <dependency><!--MyBatis-Plus 企业级模块--><groupId>com.baomidou</groupId><artifactId>mybatis-mate-starter</artifactId><version>1.2.8</version> </dependency> <!-- https://mvnrepository…