


先了解一下SLA:
SLA:
SLA的计算方式:使用正常运行时间/(正常运行时间+故障时间)
,当指标为99.99的时候,每年的停机时间只有52.26分钟。停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外停机时间。
在分布式系统中,一般使用请求的成功率来计算SLA,也就是SLA=请求成功/(请求成功+请求失败)
,在使用这种计算方式的时候,无论你是前端的web服务,还是后端的存储服务,还是离线服务,都是可以很好的计算。毕竟是一个可以量化的数据。
k8s中为了保证业务不中断或者业务SLA(服务质量协议)不降级,需要将应用集群化部署,比如Deployment,StatefulSet部署等。虽然是集群化部署,但是在我们主动销毁Pod的时候,为了避免一次性销毁太多Pod,Kubernetes引用PodDisruptionBudget(PDB)
控制器,用来控制集群中Pod的运行个数。
Pod Disruption Budget
(pod 中断 预算),含义其实是 终止pod前 通过labelSelector机制获取正常运行的pod数目的限制,目的是对主动驱逐的保护措施。
场景:
节点维护或升级时(kubectl drain) 对应用的自动缩容操作(autoscaling down) 由于节点不可用(not ready)导致的Pod驱逐就不能称之为主动特性
特性:
PDB指定一个pod集合在一段时间内存活的最小实例数量或者百分比 作用于一组被同一个控制器管理的pod。例如:RC或者statefulapp 使用 PodDisruptionBudget
控制器本身无法真正保障指定数量或者百分比的pod存活,PodDisruptionBudget
控制器只能保证POD主动逃离的情况下业务不中断或者业务SLA不降级场景局限于:主动驱逐
主动驱逐的场景下,如果能够保持存活pod数量,将会非常有用。通过使用Pod Disruption Budget 对象,应用可以保证那些主动移除pod的集群操作永远不会同一时间停掉太多pod,导致服务中断或者服务降级。
kubectl drain 操作时遵循PDB对象的设定,如果在该节点上运行了属于统一服务的多个pod,则为了保证最少存活数量,系统会确保每终止一个pod就会在健康的node上启动新的pod后,再继续终止下一个pod容器。
从版本1.7开始可以通过两个参数来配置PodDisruptionBudget:
minAvailable
:表示最小可用Pod数,表示在Pod集群中处于运行状态的最小Pod数或者是运行状态的Pod数和总数的百分比;maxUnavailable
:表示最大不可用Pod数,表示Pod集群中处于不可用状态的最大Pod数或者不可用状态Pod数和总数的百分比;
注意:minAvailable和maxUnavailable是互斥关系,也就是说两者同一时刻只能出现一种。
kubectl drain命令已经支持了PodDisruptionBudget控制器,在进行kubectl drain操作时会根据PodDisruptionBudget控制器判断应用POD集群数量,进而保证在业务不中断或业务SLA不降级的情况下进行应用POD销毁。在进行kubectl drain或者Pod主动逃离的时候,Kubernetes会通过以下几种情况来进行判断:
minAvailable设置成了数值5:应用POD集群中最少要有5个健康可用的POD,那么就可以进行操作。 minAvailable设置成了百分数30%:应用POD集群中最少要有30%的健康可用POD,那么就可以进行操作。 maxUnavailable设置成了数值5:应用POD集群中最多只能有5个不可用POD,才能进行操作。 maxUnavailable设置成了百分数30%:应用POD集群中最多只能有30%个不可用POD,才能进行操作。
在极端的情况下,比如将maxUnavailable设置成0,或者设置成100%,那么就表示不能进行kubectl drain操作。同理将minAvailable设置成100%,或者设置成应用POD集群最大副本数,也表示不能进行kubectl drain操作。
注意:使用PodDisruptionBudget控制器并不能保证任何情况下都对业务POD集群进行约束,PodDisruptionBudget控制器只能保证POD主动逃离的情况下业务不中断或者业务SLA不降级 例如在执行kubectl drain命令时。
新特性例子:
1、定义minAvailable
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2 # 定义存活的zookeeper的pod最少为5个
selector:
matchLabels:
app: zookeeper
2、定义maxUnavailable
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
maxUnavailable: 1 # 定义存活的zookeeper的pod最多为1个
selector:
matchLabels:
app: zookeeper
当zk-pdb对象副本数是3的时候,上面这1和2两个步骤的例子所表达的意思是一样的。
3、创建资源清单
对于PodDisruptionBudget对象,无法直接进行更新操作,只能通过删除和重新创建来完成对PodDisruptionBudget对象的更新。
# kubectl apply -f zk-pdb.yaml
4、查看状态
对于PodDisruptionBudget对象,无法直接进行更新操作,只能通过删除和重新创建来完成对PodDisruptionBudget对象的更新。
# kubectl get pdb
NAME MIN-AVAILABLE ALLOWED-DISRUPTIONS AGE
zk-pdb 2 1 7s
5、查看详细信息
# kubectl describe pdb pdb-demo
Name: zk-pdb
Namespace: default
Min available: 2
Selector: app=zookeeper
Status:
Allowed disruptions: 0
Current: 0
Desired: 2
Total: 0
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal NoPods 2m58s (x53 over 28m) controllermanager No matching pods found
6、通过下面命令查看PodDisruptionBudget对象的详细信息
kubectl get poddisruptionbudgets zk-pdb-o yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
...
status:
currentHealthy: 3
desiredHealthy: 3
disruptedPods: null
disruptionsAllowed: 1
expectedPods: 3
observedGeneration: 1
官方参考文档:https://kubernetes.io/docs/tasks/run-application/configure-pdb/
完
------------------------------------------------------
公众号:竹下侯小姜运维
个人博客:https://www.ayunw.cn
重要的事情认真做,普通的事情规范做!
------------------------------------------------------
不定期更新优质内容,技术干货!如果觉得对你有帮助,请扫描下方二维码关注!

温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我!




