暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s之PodDisruptionBudget主动驱逐保护

云原生小记 2020-04-04
1408


先了解一下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

重要的事情认真做,普通的事情规范做!

------------------------------------------------------

不定期更新优质内容,技术干货!如果觉得对你有帮助,请扫描下方二维码关注!

温馨提示

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



文章转载自云原生小记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论