kubernetes之PDB
2019-06-07 08:40
691 查看
上一节我们讲到了由于一些人为的或者不可避免的原因,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定义中,只能指定
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 Pod Disruption Budgets(PDB)
- kubernetes 集群的安装部署
- kubernetes集群中利用etcd和grpc实现golang服务间通信
- Kubernetes的ConfigMap说明
- oracle中创建pdb数据库及用户,plsql登录pdb数据库
- kubernetes容器编排系统介绍
- 深入kubernetes调度之NodeSelector
- 用多种方法实现创建3个PDB
- 基于Kubernetes的分布式压力测试方案
- 巅峰对决之Swarm、Kubernetes、Mesos - a515983690的博客 - 博客频道 - CSDN.NET
- Oracle12C新特性——cdb与pdb
- Kubernetes系统架构简介
- 使用Ceph集群作为Kubernetes的动态分配持久化存储
- kubernetes如何要使用用户名和密码登陆harbor以拉取docker镜像,应该如何操作?
- kubernetes核心概念总结和手动集群部署实践 之一
- Kubernetes基础组件概述(这个文章太好了,保存下来)
- kubernetes学习记录(5)——服务发现机制与Cluster DNS的安装(无CA认证版)
- Kubernetes核心概念总结
- Docker-compose 到 Kubernetes 的迁移工具!
- Oracle 12c创建用户和切换CDB、PDB