容器组(pod)_配置PodDisruptionBudget

容器组(pod)_配置PodDisruptionBudget

使用PodDisruptionBudget保护应用程序

  1. 确定哪个应用程序需要使用 PodDisruptionBudget(PDB)保护
  2. 思考应用程序如何处理毁坏(disruption)
  3. 创建 PDB yaml 文件
  4. 从 yaml 文件创建 PDB 对象

确认需要POD保护的应用

通常如下几种 Kubernetes 控制器创建的应用程序可以使用 PDB:

  • Deployment
  • ReplicationController
  • ReplicaSet
  • StatefulSet

PDB 中 .spec.selector 字段的内容必须与控制器中 .spec.selector 字段的内容相同。

自 Kubernetes v 1.15 开始,PDB支持激活了 scale subresource 的 custom controller.

也可以为那些不是通过上述控制器创建的 Pod(或者任意一组 Pod)设置 PDB,但是,这个时候存在一些限制条件

思考应用程序如何应对毁坏

当自愿中断发生时,在短时间内,您的应用程序最多可以容许多少个实例被终止。

  • 无状态的前端:
    • 关注点:不能让服务能力(serving capacity)降低超过 10%
    • 解决方案:在 PDB 中配置 minAvailable 90%
  • 单实例有状态应用:
    • 关注点:未经同意不能关闭此应用程序
    • 解决方案1: 不使用 PDB,并且容忍偶尔的停机
    • 解决方案2: 在 PDB 中设置 maxUnavailable=0。与集群管理员达成一致(不是通过Kubernetes,而是邮件、电话或面对面),请集群管理员在终止应用之前与你沟通。当集群管理员联系你时,准备好停机时间,删除 PDB 以表示已准备好应对毁坏。并做后续处理
  • 多实例有状态应用,例如 consul、zookeeper、etcd:
    • 关注点:不能将实例数降低到某个数值,否则写入会失败
    • 解决方案1: 在 PDB 中设置 maxUnavailable 为 1 (如果副本数会发生变化,可以使用此设置)
    • 解决方案2: 在 PDB 中设置 minAvailable 为最低数量(例如,当总副本数为 5 时,设置为3)(可以同时容忍更多的毁坏数)
  • 可以重新开始的批处理任务:
    • 关注点:当发生自愿毁坏时,Job仍然需要完成其执行任务
    • 解决方案: 不创建 PDB。Job 控制器将会创建一个 Pod 用于替换被毁坏的 Pod

指定百分比时的舍入逻辑

minAvailablemaxUnavailable 可以指定为整数或者百分比。

  • 当指定一个整数时,代表 Pod 的数量。例如,设置 minAvailable 为 10,则至少 10 个 Pod 必须始终可用,即便是在毁坏发生时
  • 当指定一个百分比时(例如,50%),代表总 Pod 数量的一个百分比。例如,设置 maxUnavailable50%,则最多可以有 50% 的 Pod 可以被毁坏

如果指定这些值为一个百分数,其计算结果可能不会正好是一个整数。例如,假设有 7 个 Pod,minAvailable 设置为 50%,你将很难判断,到底是 3 个还是 4 个 Pod 必须始终保持可用。Kubernetes 将向上舍入(round up to the nearest integer),因此,此处必须有 4 个 Pod 始终可用

定义PodDisruptionBudget

PodDisruptionBudget 包含三个字段:

  • 标签选择器 .spec.selector 用于指定 PDB 适用的 Pod。此字段为必填
  • .spec.minAvailable:当完成驱逐时,最少仍然要保留多少个 Pod 可用。该字段可以是一个整数,也可以是一个百分比
  • .spec.maxUnavailable: 当完成驱逐时,最多可以有多少个 Pod 被终止。该字段可以是一个整数,也可以是一个百分比

在一个 PodDisruptionBudget 中,只能指定 maxUnavailableminAvailable 中的一个。 maxUnavailable 只能应用到那些有控制器的 Pod 上。下面的例子中,“期望的副本数” 是 PodDisruptionBudget 对应 Pod 的控制器的 .spec.replicas 字段:

例子1: minAvailable 为 5 时,只要 PodDisruptionBudget 的 selector 匹配的 Pod 中有超过 5 个仍然可用,就可以继续驱逐 Pod 例子2: minAvailable 为 30% 时,至少保证期望副本数的 30% 可用 例子3: maxUnavailable 为 5 时,最多可以有 5 个副本不可用(unthealthy) 例子4: maxUnavailable 为 30% 时,最多可以有期望副本数的 30% 不可用

通常,一个 PDB 对应一个控制器创建的 Pod,例如,Deployment、ReplicaSet或StatefulSet。

PodDisruptionBudget 并不能真正确保指定数量(或百分比)的Pod始终保持可用。例如,当 Pod 数量已经为 PDB 中指定的最小数时,某一个节点可能意外宕机,导致 Pod 数量低于 PDB 中指定的数量。 PodDisruptionBudget 只能保护应用避免受到 自愿毁坏 的影响,而不是所有原因的毁坏。

maxUnavailable 为 0%(或0)或者 minAvailable 为 100%(或与控制器的 .spec.replicas 相等)将阻止节点排空任务。按照 PodDisruptionBudget 的语义,这种做法是允许的。

下面是两个 PDB 的例子:

使用 minAvailable

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: zookeeper

使用 maxUnavailable

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: zookeeper

例如,如果 zk-pdb 对象选择的 Pod 对应的 StatefulSet 的 spec.replicas 为 3,则两个 PDB 含义相同。推荐使用 maxUnavailable 这种形式的定义,因为当控制器的 spec.replicas 发生变化时,应用受到的影响更小一些。例如,将其副本数伸缩到 10,如果使用 minAvailable=2 这种形式,则可能会有 8 个 Pod 被毁坏。而如果使用 maxUnavailable=1 这种形式,应用程序将可以保存 9 个可用实例

建PDB对象

使用 kubectl apply -f mypdb.yaml 命令可以创建或更新 PDB 对象

#检查PDB的状态

假设名称空间中实际没有与 app: zookeeper 匹配的 Pod,执行命令

kubectl get poddisruptionbudgets

输出结果为:

NAME      MIN-AVAILABLE   ALLOWED-DISRUPTIONS   AGE
zk-pdb    2               0                     7s   

如果存在 3 个匹配的 Pod,执行命令

kubectl get poddisruptionbudgets

输出结果为:

NAME      MIN-AVAILABLE   ALLOWED-DISRUPTIONS   AGE
zk-pdb    2               1                     7s

ALLOWED-DISRUPTIONS 为非零证书,意味着 disruption 控制器已经匹配到了 Pod,计算了匹配的 Pod 数,并更新了 PDB 的状态。

执行命令,可以获得 PDB 的更多信息:

kubectl get poddisruptionbudgets zk-pdb -o yaml

输出结果如下所示:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  creationTimestamp: 2019-11-19T021:38:26Z
  generation: 1
  name: zk-pdb
…
status:
  currentHealthy: 3
  desiredHealthy: 3
  disruptedPods: null
  disruptionsAllowed: 1
  expectedPods: 3
  observedGeneration: 1
   

任意控制器和选择器)任意控制器和选择器

如果您只配合 Kubernetes 内建控制器(Deployment、ReplicationController、ReplicaSet、StatefulSet)使用 PDB,您可以跳过此章节。

PDB 可以用于保护其他类型控制器(例如,“operator”)创建的 Pod,或者直接创建的 Pod(bare pod),但是有如下限定:

  • 只能使用 .spec.minAvailable,不能使用 .spec.maxUnavailable
  • .spec.minAvailable 字段中只能使用整型数字,不能使用百分比

当配合内建控制器(Deployment、ReplicationController、ReplicaSet、StatefulSet)使用时,PDB 的标签选择器可以选择控制器创建 Pod 的一个子集或者超集。然而,当名称空间中有多个 PDB 时,必须十分小心,PDB 的标签选择器之间不能重叠

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis—哨兵机制】

概念 当进行主从复制时,如果主节点挂掉了,那么没有主节点来服务客户端的写操作请求了,也没有主节点给从节点进行数据同步了。此时需要进行主从切换(主从节点故障转移),Redis在 2.8 版本以后提供的哨兵&…

C++标准库 --- 动态内存 (Primer C++ 第五版 · 阅读笔记)

C标准库 --动态内存 (Primer C 第五版 阅读笔记) 第12章 动态内存------(持续更新)12.1、动态内存与智能指针12.1.1、shared_ptr类12.1.2、直接管理内存12.1.3、shared_ptr和new结合使用12.1.4、智能指针和异常12.1.5、unique_ptr12.1.6、weak_ptr 12.2、动态数组1…

抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言

近日又有一个社区迷惑走红 上万个AI发帖聊天,人类不得入内? 据红星新闻报道 近日,一个名为Chirper的AI网络社区突然爆火 上万个AI聊天机器人在其中 激烈地聊天、互动、分享 社区主页右上角明确写着: “这是一个人工智能的社交…

【五一创作】( 字符串) 409. 最长回文串 ——【Leetcode每日一题】

❓ 409. 最长回文串 难度:简单 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s “abccccdd”…

蒙蒂霍尔悖论

贝叶斯与频率主义对蒙蒂霍尔问题的解 在定义概率时,通常有两种思想流派:贝叶斯主义和频率主义。前者将概率视为我们对事件发生的信念程度,而后者则将其视为事件发生的相对频率。这篇文章介绍了使用贝叶斯和频率主义方法来解决著名的蒙蒂霍尔问…

IDEA Java 第一个mybatis入门程序

文章目录 准备mysql 开始新建maven项目maven添加引用mybatis配置文件工具类创建实例类添加mappermappermapper.xml 测试类 发现问题org.apache.ibatis.binding.BindingException: Type interface com.cpyy.mapper.UserMapper is not known to the MapperRegistry.The error may…

chatGPT国内可用镜像源地址

chatGPT国内可用镜像源地址 彷丶徨丶 关注 IP属地: 湖北 0.811 2023.03.15 16:02:16 字数 1,152 阅读 249,582 如果你正在尝试访问Chatgpt网站,但由于某些原因无法访问该网站,那么你可以尝试使用Chatgpt的国内镜像网站。以下是一些Chatgpt国内镜像网站的…

【MYSQL】数据类型和约束

目录 数据类型 1.数值类型 1.1.位--类型bit(M) 1.2. 整数类型--tinyint,smallint,int,bigint 1.3.小数类型--float、decimal 2.字符类型--char、varchar 3.日期类型--datetime、timestamp 4.string类型--enum和set mysql的约束 1.空…

【人工智能】— 不确定性、先验概率/后验概率、概率密度、贝叶斯法则、朴素贝叶斯 、最大似然估计

【人工智能】— 不确定性 不确定性不确定性与理性决策基本概率符号先验概率(无条件概率)/后验概率(条件概率)随机变量概率密度联合概率分布公理完全联合分布概率演算独立性 贝叶斯法则例1例2 使用贝叶斯规则:合并证据朴素贝叶斯最大似然估计小结 不确定性 不确定性与…

PCIe物理层详细总结-PCIE专题知识(一)

目录 一、简介二、PCIe物理层结构及功能2.1 PCIe端对端连接方式2.2 PCIe组成2.2.1 逻辑层(Logic)1 发送逻辑2 接收逻辑 2.2.2 电气层(Electrical)1 物理层-电气(Physical Layer Electrical)2 数据传送----差分方式 2.2.3 PLP介绍 三、其他相关链接1、PCI总线及发展历程总结2、P…

mockjs学习笔记

文章目录 一、什么是mockjs二、安装mockj项目安装mock 三、mock语法生成字符串生成文本生成标题和句子生成段落生成数字生成自增id生成姓名-地址-身份证随机生成图片生成时间 mock拦截请求定义get请求定义post请求 四、实现新闻管理案例获取数据添加新闻删除新闻 一、什么是moc…

最优化方法Python计算:一元函数搜索算法——二分法

设一元目标函数 f ( x ) f(x) f(x)在区间 [ a 0 , b 0 ] ⊆ R [a_0,b_0]\subseteq\text{R} [a0​,b0​]⊆R(其长度记为 λ \lambda λ)上为单峰函数,且在 ( a 0 , b 0 ) (a_0,b_0) (a0​,b0​)内连续可导,即其导函数 f ′ ( x ) f…

PySpark基础入门(1):基础概念+环境搭建

目录 Spark基础入门 spark基础概念 spark架构 Spark环境搭建 local模式 Standalone 模式 Spark On YARN 模式 PySpark开发环境搭建 Python On Spark 执行原理 更好的阅读体验:PySpark基础入门(1):基础概念+环…

数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的 空间滤波涉及改善性能的操作(邻域操作),如通过图像中每一个像素的邻域处理来锐化图像 这两种方法均属于图像增强。 灰度变换 邻域基本增强变换定义数学表达三种基本…

基于协同过滤的旅游推荐系统设计与实现(论文+源码)_kaic

1 绪论 1.1 研究背景及意义 1.2 国内外研究现状 1.3 研究目标与意义 1.4 主要研究工作 2 相关理论介绍 2.1HTML与JavaScript 2.2 MySQL数据库 2.3 协同过滤算法简介 3 系统分析与设计 3.1 系统需求分析 3.1.1 功能性需求 3.1.2 安全性需求 3.2 系统总体架构 3.3 功能模块设计 3…

【LeetCode】221.最大正方形

221.最大正方形(中等) 题解 对于在矩阵内搜索正方形或长方形的题型,一种常见的做法是:定义一个二维 dp 数组,其中 dp[i][j] 表示满足题目条件的、以(i,j)为右下角的正方形或长方形属性。在本题中…

Android 编译模块 (小记)

1.整编 source build/envbuild.sh lunch xxx make 2.单独编译模块 2.1 去Android.bp 中找模块名 比如我想编译system/core/fastboot,那么我就去找这个路径下的Android.bp/ Android.mk Android.bp 中找每个模块的那么就行 然后直接make这个name make fastboot_…

设置苹果电脑vsode在新窗口中打开文件

0、前言 最近切换到mac电脑工作,又得重新安装一些工具软件并设置。虽然这些设置并表示啥复杂的设置,但是久了不设置还是会忘记。于是记录之,也希望给能帮助到需要的人。 我们使用vscode阅读或者编辑文件时,有时候希望同时打开多…

3个经典线程同步问题

生产者消费者问题 问题描述 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。生产者、消费者共享一个初始为空、大小为n的缓冲区 伪码描述 semaphore mutex 1;//互斥信…

SpringBoot集成 ElasticSearch

Spring Boot 集成 ElasticSearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…