• kubernetes之PDB


    系列目录

    上一节我们讲到了由于一些人为的或者不可避免的原因,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
    
  • 相关阅读:
    httprunner运行报错问题:base url missed
    Locust性能模块浅谈
    如何对HTMLTestRunner 进行输出print 进行修改
    网易UI自动化测试工具Airtest中导入air文件中的方法
    如何在 idea 2019.3.4 中导入Github的项目并使用Git同步项目?
    Win10 Microsoft Store 微软商店 Error 0x00000193 解决方法
    读书笔记 |《计算机组成结构化方法》-01
    [MR] MapReduce 总结、回顾与吐槽
    [Git] 极简Git——关于Git的简要回顾
    [FlyWay] FlyWay工作原理
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/10987576.html
Copyright © 2020-2023  润新知