原文标题:Avoiding Outages in your Kubernetes Cluster using PodDisruptionBudgets

发布时间:Jan 26, 2019

原文链接:https://blog.gruntwork.io/avoiding-outages-in-your-kubernetes-cluster-using-poddisruptionbudgets-ef6a4baa5085

文章作者:yorinasub17

这是我们实现 Kubernetes 集群零停机时间更新的系列文章的第四部分也是最后一部分。在前两篇文章 「 如何优雅地关闭Kubernetes集群中的Pod 」和「 借助 Pod 删除事件的传播实现 Pod 摘流」中,我们重点介绍了如何正常关闭集群中现有的Pod。我们介绍了如何使用 preStop 钩子正确关闭Pod,以及为什么在 Pod 关闭序列中增加延迟以等待删除事件在群集中传播很重要。这些可以处理一个Pod的终止,但不能保证我们在需要关闭多个 Pod时还能让服务正常运行。在本文中,我们将使用 Kubernetes 提供PodDisruptionBudgets 或者简称PDB来减轻这种风险。

译注:PDB是Kubernetes中用来保证集群中始终有指定的Pod副本数处于可用状态,它与Deployment中指定的maxUnavailable的区别是,后者是用来使用 Deployment 对应用进行滚动更新时保障最少可服务副本数的!而 ReplicaSet Controller,也并不能给保证集群中始终有几个可服务副本,它是负责尽快的让实际副本数跟期望副本数相同的,不会保证中间某些时刻的实际副本数。Kubernetes 的 PDB 是用来保证应用在每个时刻最少可用Pod副本数的,对那些Voluntary(自愿的)Disruption做好Budgets(预算方案)

PDB是针对Voluntary Disruption场景设计的,属于Kubernetes可控的范畴之一,而不是为Involuntary Disruption(非自愿中断设计)设计的,自愿中断主要是一些系统维护和升级更新的操作,而非自愿中断一般都是些硬件和网络故障导致的中断。一些集群会对Node进行自动管理,因此需要使用PDB来保障应用的HA。

PDB:预算可容忍的故障数

Pod 中断预算(PDB)是一种在给定时间可容忍的中断数量(故障预算)的指标。每当计算出服务中的 Pod 中断会导致服务降至PDB以下时,操作就会暂停,直到可以维持PDB为止。这意味着在等待更多 Pod 可用之前,可以暂时停止逐出Pod,以免驱逐 Pod 而超出预算。

要配置一个PDB,我们需要在 Kubernetes 里创建一个PodDisruptionBudgets资源对象(后面简称PDB对象)用来匹配服务中的Pod。举个例子来说,我们想要创建一个PDB对象让我们之前使用Deployment创建的Nginx应用始终保持至少一个Pod可用,那么我们可以应用下面的配置:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:name: nginx-pdb
spec:minAvailable: 1selector:matchLabels:app: nginx

这会告诉 Kubernetes 我们想要在任意时间点都有至少一个匹配标签app: niginx的Pod在集群中可用。使用此方法,我们可以促使Kubernetes 保证在自愿中断(更新/ 维护)进行时服务至少有一个Pod是可用的,避免服务停机。

PDB的工作原理

为了说明 PDB 是如何工作的,让我们回到我们的一直以来使用的示例。为了简单起见,在示例中,我们将忽略任何 preStop 钩子,就绪性探针和服务请求。我们还将假设我们要对集群节点进行一对一替换。这意味着我们将通过使节点数量加倍,在新节点上运行重建的 Pod。

在图示中我们从两个节点的原始群集开始:

我们提供了两个额外的节点来运行新的虚拟机镜像。最终将会在新节点上创建 Pod 替换运行在旧节点上的Pod。

要替换服务Pod所在的节点,我们首先需要清空旧节点。在此示例中,让我们看看如果同时向运行Nginx Pod的两个节点发出kubectl drain命令时会发生什么。排空Node上Pod的请求将在两个线程中发出(实践时,可以使用两个终端分别运行kubectl drain命令),每个线程管理一个节点的排空执行序列。

注意,在这里我们,假设 kubectl drain 命令会立即发出驱逐请求。实际上,drain 操作首先会涉及对节点进行标记(给节点打上 NoSchedule的 标记),以便不会把 Pod 重新调度到旧节点上去。

标记节点不可调用

节点标记完成后,负责排空节点的线程开始逐出节点上的Pod。这个过程中线程首先会去控制中心查询,看驱逐 Pod 是否会导致服务可用Pod数下降到配置的 PDB 以下。

这里需要注意的是,控制台会将并发请求串行化,一次处理一个PDB查询。这样,在这种情况下,控制平面将成功响应其中一个请求,而使另一个请求失败。这是因为第一个请求基于两个可用Pod的。允许此请求会将可用的 Pod 数量减少到1,PDB 得以维持。当控制中心允许请求继续进行时,便会将其中一个容器逐出,从而变得不可用。之后,当处理第二个请求时,控制平面将拒绝它,因为允许该请求会将可用Pod的数量降至0,低于我们配置的PDB。

鉴于此,在示例中,我们假定节点1是获得成功响应的节点。在这种情况下,节点1负责排空操作的线程将继续逐出 Pod,而节点2的排空线程将会等待并在稍后重试:

串行化逐出请求,允许线程1的请求,因为不满足PDB拒绝线程2的请求

驱逐Node1上的Nginx Pod

当节点1上的Nginx Pod被驱逐后,Pod 会立即被 Deployment 重建出来并调度到集群的节点上。因为我们集群的旧节点都已经被打上了NoSchedule的标记,所以调度器会选择一个新节点进行调度。

重建Pod被调度到了Node3这个新节点上

至此,成功在新节点上完成了Pod更换,并且排空了原始节点Node1,用于排空Node1的线程就完成任务了。

从现在开始,当 Node2 的排空线程再次去控制中心查询 PDB 时,将会得到成功响应。这是因为有一个正在运行的Pod (刚才在Node3上新建的 Pod)不在考虑驱逐的序列中,因此,让 Node2 的排空线程继续前进不会将可用Pod的数量降到 PDB 以下。所以线程2会继续前进逐出 Node2 上的 Pod,完成驱逐过程:

线程2再次查询,可以满足PDB后开始驱逐Node2上的Pod

驱逐Node2上的Nginx Pod

在Node4上新建Pod,完成整个集群Node升级过程

至此,我们就成功地将两个 Pod 都迁移到了新节点上,而没有遇到无可用 Pod 可以为应用程序提供服务的情况。而且,我们不需要在两个负责排空节点的线程之间有任何协调逻辑,Kubernetes 会根据我们提供的配置为我们处理所有工作!

总结

将我们在本博客系列中的内容都联系起来,我们介绍了:

  • 如何使用生命周期钩子来实现平滑关闭我们的应用程序的能力,从而不会导致服务硬重启。 Part II:如何优雅地关闭Kubernetes集群中的Pod

  • Pod是怎么从Kubernetes系统中被移除的,以及为什么必须在Pod关闭序列中引入延迟。Part III: 借助 Pod 删除事件的传播实现 Pod 摘流

  • 如何指定Pod中断预算(PDB),以确保我们始终有一定数量的Pod可用,以便在需要中断的情况下为运行的应用程序提供连续不中断的服务。

当所有这些功能一起使用时,我们可以实现集群维护时服务零停机时间的目标!不过不要只听我在这里说,要继续下去把这里介绍的功能应用在练习和实践中。

使用 PDB 避免 Kubernetes 集群中断相关推荐

  1. 4、kubernetes 集群管理工具 kubectl

    文章目录 kubectl概述 K8s kubectl 命令自动补全 kubectl的常用子命令(command) kubernetes资源对象类型(type) kubectl 常用命令总结 kubec ...

  2. Kubernetes 集群的零停机服务器更新 | 文末有料!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://vflong.github.i ...

  3. 如何在零停机的情况下迁移 Kubernetes 集群

    作者:顾静(子白)|阿里云高级研发工程师:谢瑶瑶(初扬)|阿里云技术专家 导语: 随着云原生理念在企业中的深入和践行,应用容器化的比例大幅提升.是否可以保证应用容器化迁移过程中的平稳切换,保证应用不停 ...

  4. 托管节点池助力用户构建稳定自愈的 Kubernetes 集群

    作者 | 谢瑶瑶(初扬) 来源|阿里巴巴云原生公众号 随着容器技术的不断发展迭代,Kubernetes 已成为云原生时代的标准操作系统,那么如何构建一个稳定自愈的云原生操作系统事关重大.尤其是分布式环 ...

  5. Kubernetes 集群升级指南:从理论到实践

    作者 | 高相林(禅鸣) **导读:**集群升级是 Kubernetes 集群生命周期中最为重要的一环,也是众多使用者最为谨慎对待的操作之一.为了更好地理解集群升级这件事情的内涵外延,我们首先会对集群 ...

  6. 如何让Kubernetes集群生产可用?

    图片来源:veer 本文作者 Steven Wong (VMware) Michael Gasch (VMware) 文章翻译 Karen Lee 文章来源 K8S技术社区 原文链接 https:// ...

  7. 如何调试Kubernetes集群中的网络延迟问题

    本文深入研究和解决了 Kubernetes 平台上的服务零星延迟问题,就在不久前我也遇到了类似的问题,看似是玄学事件,刚开始归结于网络链路抖动,一段时间后依然存在,虽然影响都是 P99.99 以后的数 ...

  8. 【Druid】(四)Apache Druid 部署和配置(单机版 / Docker 容器版 / Kubernetes 集群版)

    文章目录 一.Apache Druid 部署 1.1 单机版 1.1.1 Jar 包下载 1.1.2 Druid 的安装部署 1.2 Docker 容器版 1.2.1 下载 1.2.2 配置 Dock ...

  9. 调试Kubernetes集群中的网络停顿问题

    调试Kubernetes集群中的网络停顿问题 在过去几年,Kubernetes在GitHub已经成为标准的部署模式.目前在GitHub,我们在Kubernetes上运行着海量的面向内部团队以及面向C端 ...

最新文章

  1. Spring 中的Scheduler
  2. js调试console.log使用总结图解
  3. Thread中,join()方法
  4. SQL内存优化-最大化使用内存
  5. PageHelper概述与基本使用步骤介绍
  6. Steeltoe之Config客户端篇
  7. Linux 进程学习(四)------ sigaction 函数
  8. MySQL 数据库 like 语句通配符模糊查询小结
  9. H5炫酷特效系列3——瀑布流水特效
  10. Hazelcast发布开源流处理引擎Jet
  11. mysql命令 show_mysql show 相关命令
  12. 2304558-25-4,DBCO-PEG2-acid分子量是464.5的小分子PEG试剂带有PEG连接物和DBCO基团
  13. 触摸精灵3.9.5版本运行已停止解决方法
  14. JAVA + 百度地图API 应用
  15. 荆棘鸟(The Thorn bird)
  16. 支线任务1 opencv学习(最后一次更新于2022.10.2,已完结)
  17. 25个技巧和诀窍可以用来提高你的app性能
  18. Fine-Grained Visual Classification via Progressive Multi-Granularity Training of Jigsaw Patches
  19. 昨天介入600571,信雅达,喜欢的朋友可以跟进!
  20. 今年职高计算机数学高考试题,2018-2019高职高考数学试题

热门文章

  1. JavaSE——MD5、16位流
  2. 从零开始搭建口袋妖怪管理系统(3)-实现一个简单的SPA管理系统
  3. window.btoa()方法;使字符编码成base64的形式
  4. 迪米特法则(设计模式5)
  5. 基于8086CPU微处理器的汇编学习之JMP指令
  6. U盘PE安装windows7 方法
  7. 理解 CI 和 CD 之间的区别(翻译)
  8. -bash-4.1问题
  9. HDU 4548 美素数(打表)
  10. [转]Oracle中字符集的类型决定varchar2的字符长度