kubernetes之PDB
上一节我们讲到了由于一些人为的或者不可避免的原因,pod可能会中断,而使用Pod Disruption Budget
可以最大限度地保证在pod中断发生时集群仍然保持能够接受的状态.
一句话,PDB能够限制同时中断的pod的数量,以保证集群的高可用性.
使用PodDisruptionBudget来保护集群
确定你想要使用
PodDisruptionBudget (PDB)
来保护的集群考虑集群如何影响中断
使用yaml文件创建PDB定义
使用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有三个字段:
一个label选择器
.spec.selector
,用来指定要选择的pod集合,此为必选项.spec.minAvailable
,在pod被驱离的情况下,必须保证的最小可用的pod数量.minAvailable
可以是一个绝对数值或者一个百分数.spec.maxUnavailable
(kubernetes 1.7以后版本),在发生驱离的情况下,最大的不可用副本的数量,值可以是绝对数值或者一个百分比.
在一个PDB定义中,只能指定minAvailable
或maxUnavailable
其一.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的更多相关文章
- 基于jenkins,tekton等工具打造kubernetes devops平台
本贴为目录贴,将不断更新 目录 1.Docker在centos下安装以及常见错误解决 2.使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像) 3.无法访问gcr ...
- Kubernetes自动横向伸缩集群节点以及介绍PDB资源
在kubernetes中,有HPA在需要的时候创建更多的pod实例.但万一所有的节点都满了,放不下更多pod了,怎么办?显然这个问题并不局限于Autoscaler创建新pod实例的场景.即便是手动创建 ...
- Kubernetes的十大使用技巧
1. bash针对kubectl命令的自动补充这可能是在使用Kubernetes过程中最容易做的事,但它也是其中一个最有用的.要添加自动补充功能,如果使用bash,只需执行以下命令: echo &qu ...
- k8s技术--Kubernetes集群kubectl命令的常见使用方法
简介:kubectl是一个命令行界面,用于运行针对Kubernetes群集的命令. 语法: kubectl [command] [TYPE] [NAME] [flags] command:指定您希望对 ...
- Kubernetes工作流之Pods二
Init Containers This feature has exited beta in 1.6. Init Containers can be specified in the PodSpec ...
- Kubernetes基础:Pod的详细介绍
本文的演练环境为基于Virtualbox搭建的Kubernetes集群,具体搭建步骤可以参考kubeadm安装kubernetes V1.11.1 集群 1. 基本概念 1.1 Pod是什么 Pod是 ...
- kubernetes之pod中断
系列目录 目标读者: 想要构建高可用应用的应用所有者,因此需要知道pod会发生哪些类型的中断 想要执行自动化(比如升级和自动扩容)的集群管理员. 自愿和非自愿的中断 pod不会自动消息,除非有人(可能 ...
- kubernetes集群升级的正确姿势
kubernetes社区非常活跃,每季度都会发布一个release.但是线上集群业务可用性要求较高,场景复杂,任何微小的变更都需要非常小心,此时跟随社区版本进行升级略显吃力.但是为了能够使用到最新的一 ...
- kubernetes 1.15 有哪些让人眼前一亮的新特性?
原文链接:kubernetes 1.15 有哪些让人眼前一亮的新特性? 2019 年 6 月 20 日,Kubernetes 重磅发布了 1.15 版本,不过笔者忙到现在才有空认真来看一下到底更新了哪 ...
随机推荐
- css3制作扇形菜单
工作中网页中有一个扇形的导航菜单,以前没有接触过,参考了http://www.w3cplus.com/css3/building-a-circular-navigation-with-css-tran ...
- spring-boot项目热部署以及spring-devtools导致同类不能转换
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- d3 根据数据绘制svg
, , , , ]; var circles = svg.selectAll("circle") .data(dataset) .enter() .append("cir ...
- 学习javascript设计模式之单例模式
1.单例模式的核心是确保只有一个实例,并提供全局访问. 2.惰性单例 指的是在需要的时候才创建对象实例. 如在页面中创建唯一div 普通做法 var createDiv = (function(){ ...
- 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...
- PHP解码Json(json_decode)字符串返回NULL的原因及解决方法(转载)
本文主要为大家讲解了php在使用json_decode函数解码json字符串时,解码不成功返回NULL的问题原因分析和解决方法,感兴趣的同学参考下. 一般来说,php对json字符串解码使用json_ ...
- 无法安装64位版本的visio/office,因为在您的PC上找到了以下32位程序的解决办法
解决方案:按下win+R键,打开运行,输入regedit,打开注册表,依次定位到 HKEY_CLASSES_ROOT\Installer\Products,展开Products后 将这些“00005 ...
- Codeforces 919 B. Perfect Number
B. Perfect Number time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- win10下ubuntu虚拟机互传文件
前言 用过虚拟机的都知道在向linux传文件的时候总是会遇到各种问题 安装虚拟机的增强工具不好用,反正就是各种麻烦各种麻烦 准备-------方案一 使用专门的xshell可以直接链接到虚拟机,同时配 ...
- BZOJ1007水平可見直線 計算幾何
@[計算幾何] Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于 ...