系列目录

上一节我们讲到了由于一些人为的或者不可避免的原因,pod可能会中断,而使用Pod Disruption Budget可以最大限度地保证在pod中断发生时集群仍然保持能够接受的状态.

一句话,PDB能够限制同时中断的pod的数量,以保证集群的高可用性.

使用PodDisruptionBudget来保护集群

  1. 确定你想要使用PodDisruptionBudget (PDB)来保护的集群

  2. 考虑集群如何影响中断

  3. 使用yaml文件创建PDB定义

  4. 使用yaml文件创建PDB对象

确定想要保护的应用对象

最常见的要保护的对象是是以下kubernetes内置的controller创建的应用对象之一:

  • Deployment
  • ReplicationController
  • ReplicaSet
  • StatefulSet

考虑集群如何响应中断

决定在短时间内有多少个实例可能会被宕掉(由于自愿中断,前面一节我们讲到过何为自愿中断,非自愿中断不被PDB控制)

  • 无状态的前端

关注点:服务能力不能减少超过10%

解决方案: 使用一个包含minAvailable 90%值的PDB

  • 单实例有状态应用

关注点:不要在不知情情况下中断

可能的解决方案1:不使用PDB,容易偶尔的宕机

可能的解决方案2:使用PDB,设置maxUnavailable=0.当集群管理员想要终止pod的时候,他需要联系你,然后删除掉PDB以准备应对中断,然后重新创建.(如果maxUnavailable=0则不能进行自愿中断操作)

  • 多实例有状态应用,例如zookeeper,etcd,consul等

关注点:运行的实例数不能低于法定数量

可能的解决方案1:把maxUnavailable to 1(根据不同集群要求不同,可以设置为不同的值)

可能的解决方案2:把minAvailable设置为法定数量.

指定一个PodDisruptionBudget

一个PDB有三个字段:

  1. 一个label选择器.spec.selector,用来指定要选择的pod集合,此为必选项

  2. .spec.minAvailable,在pod被驱离的情况下,必须保证的最小可用的pod数量.minAvailable可以是一个绝对数值或者一个百分数

  3. .spec.maxUnavailable(kubernetes 1.7以后版本),在发生驱离的情况下,最大的不可用副本的数量,值可以是绝对数值或者一个百分比.

在一个PDB定义中,只能指定minAvailablemaxUnavailable其一.maxUnavailable中能用于有控制器控制的pod的驱离.

maxUnavailable 值为 0% (或 0),或者minAvailable值为100%(或者与replicas的值相等)则会完全阻止pod驱离.

以下示例的PDB会选择labels值包含app: zookeeper的pod

  • 使用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数量为3的有状态集合,上面两种定义意义完全相同,推荐使用maxUnavailable

创建PDB对象

你可以使用kubectl apply -f xxx.yaml来创建一个PDB对象

PDB对象不能被更新,你只能够删除它然后重新创建.

检测PDB的状态

使用kubectl来检测pdb是否被创建.

假设没有pod匹配app: zookeeper,你将会看到如下信息

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

如果有匹配的pod(比如说3个),则你看到的信息将类似如下

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

ALLOWED-DISRUPTIONS值不为0意味着中断控制器已经发现pod,计算了匹配的pod数量,然后更新了PDB的状态

你可以使用以下命令获取更多PDB的状态信息

kubectl get poddisruptionbudgets zk-pdb -o yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
creationTimestamp: 2017-08-28T02:38:26Z
generation: 1
name: zk-pdb
...
status:
currentHealthy: 3
desiredHealthy: 3
disruptedPods: null
disruptionsAllowed: 1
expectedPods: 3
observedGeneration: 1

kubernetes之PDB的更多相关文章

  1. 基于jenkins,tekton等工具打造kubernetes devops平台

    本贴为目录贴,将不断更新 目录 1.Docker在centos下安装以及常见错误解决 2.使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像) 3.无法访问gcr ...

  2. Kubernetes自动横向伸缩集群节点以及介绍PDB资源

    在kubernetes中,有HPA在需要的时候创建更多的pod实例.但万一所有的节点都满了,放不下更多pod了,怎么办?显然这个问题并不局限于Autoscaler创建新pod实例的场景.即便是手动创建 ...

  3. Kubernetes的十大使用技巧

    1. bash针对kubectl命令的自动补充这可能是在使用Kubernetes过程中最容易做的事,但它也是其中一个最有用的.要添加自动补充功能,如果使用bash,只需执行以下命令: echo &qu ...

  4. k8s技术--Kubernetes集群kubectl命令的常见使用方法

    简介:kubectl是一个命令行界面,用于运行针对Kubernetes群集的命令. 语法: kubectl [command] [TYPE] [NAME] [flags] command:指定您希望对 ...

  5. Kubernetes工作流之Pods二

    Init Containers This feature has exited beta in 1.6. Init Containers can be specified in the PodSpec ...

  6. Kubernetes基础:Pod的详细介绍

    本文的演练环境为基于Virtualbox搭建的Kubernetes集群,具体搭建步骤可以参考kubeadm安装kubernetes V1.11.1 集群 1. 基本概念 1.1 Pod是什么 Pod是 ...

  7. kubernetes之pod中断

    系列目录 目标读者: 想要构建高可用应用的应用所有者,因此需要知道pod会发生哪些类型的中断 想要执行自动化(比如升级和自动扩容)的集群管理员. 自愿和非自愿的中断 pod不会自动消息,除非有人(可能 ...

  8. kubernetes集群升级的正确姿势

    kubernetes社区非常活跃,每季度都会发布一个release.但是线上集群业务可用性要求较高,场景复杂,任何微小的变更都需要非常小心,此时跟随社区版本进行升级略显吃力.但是为了能够使用到最新的一 ...

  9. kubernetes 1.15 有哪些让人眼前一亮的新特性?

    原文链接:kubernetes 1.15 有哪些让人眼前一亮的新特性? 2019 年 6 月 20 日,Kubernetes 重磅发布了 1.15 版本,不过笔者忙到现在才有空认真来看一下到底更新了哪 ...

随机推荐

  1. Linux系统维护管理命令及vim编辑器

    系统维护管理命令date.clear $>>date //显示或修改系统时间与日期. //%H:小时 %M:分钟 %S:秒 %Y完整年份 %d:日 %m:月份 eg: date " ...

  2. 刷题总结——run(ssoj)

    题目: 题目描述 企鹅国正在举办全面运动会,第一项比赛就是跑步.N 个人在圆形跑道上跑步,他们都有各自的速度和起点.但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时 ...

  3. Linux System Programming 学习笔记(八) 文件和目录管理

    1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...

  4. CSS3动画那么强,requestAnimationFrame还有毛线用--摘抄

    CSS3动画那么强,requestAnimationFrame还有毛线用? 这篇文章发布于 2013年09月30日,星期一,19:12,归类于 web综合. 阅读 197124 次, 今日 84 次 ...

  5. 第5章-unix网络编程 TCP/服务端程序示例

    这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的  客户端代码 #include "unp. ...

  6. 捕获错误并发邮件 register_shutdown_function

    /** * 脚本程序异常捕获 */ function handleError() { global $config; $error = error_get_last(); if (isset($err ...

  7. Day 21 三元表达式、生成器函数、列表解析

    知识点程序: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "DaChao" # Date: 2017 ...

  8. github每次push提交都要输入账号密码

    问题产生的原因是在克隆的时候使用的是https的方式或者用一些特殊的指令来克隆的github项目源,如 golang里的go get github.com/...... 没次提交push的时候都会提示 ...

  9. SSL剥离工具sslstrip

    SSL剥离工具sslstrip   在日常上网过程中,用户只是在地址栏中输入网站域名,而不添加协议类型,如HTTP和HTTPS.这时,浏览器会默认在域名之前添加http://,然后请求网站.如果网站采 ...

  10. Druid连接池工具类

    package cn.zmh.PingCe; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSo ...