• PodDisruptionBudget


    介绍

    PDB(PodDisruptionBudget)是为了自主中断时(除了节点crash)保障应用的高可用。
    在使用 PDB 时,你需要弄清楚你的应用类型以及你想要的应对措施:

    • 无状态应用:
      • 目标:至少有60%的副本 Available。
      • 方案:创建 PDB Object,指定 minAvailable 为60%,或者 maxUnavailable 为 40%。
    • 单实例的有状态应用:
      • 目标:终止这个实例之前必须提前通知客户并取得同意。
      • 方案:创建 PDB Object,并设置 maxUnavailable 为0。
    • 多实例的有状态应用:
      • 目标:最少可用的实例数不能少于某个数N,例如 etcd。
      • 方案:设置 maxUnavailable=1或者 minAvailable=N,分别允许每次只删除一个实例和每次删除 expected_replicas-minAvailable 个实例。

    移除节点步骤

    1. 将node置为不可调度。
    kubectl cordon snode name>
    
    • 1
    1. 执行 node drain 排空节点,将其上运行的 Pod 平滑迁移
      至其他节点。
    kubectl drain <node name>
    
    • 1
    1. 如果应用不可中断,就需要设置pdb。
    2. 设置了pdb后,kubelet在驱逐pod时,会去看pdb的配置,校验这个应用比如deployment最少需要多少个实例,如果驱逐了pod后不满足这个数量,驱逐就会失败,确保应用不受影响。这时可以人工干预。

    实例

    1. 创建并应用nginx deployment
    cat nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
    k apply -f nginx-deployment.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    file

    1. 创建pdb
    cat pdb.yaml
    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: nginx-deployment
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          app: nginx
    k apply -f pdb.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    file

    1. 解码kubeconfig
    cat ~/.kube/config
    echo 'xxx' | base64 -d > admin.crt
    echo 'xxx' | base64 -d > admin.key
    
    • 1
    • 2
    • 3
    1. 创建eviction.json文件
    cat eviction.json
    {
      "apiVersion": "policy/v1",
      "kind": "Eviction",
      "metadata": {
        "name": "nginx-deployment-75f4d489b4-b6grv",
        "namespace": "default"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 通过evict api驱逐pod
    curl -v -H 'Content-type: application/json' --key admin.key --cert admin.crt https://192.168.0.6:6443/api/v1/namespaces/default/pods/nginx-deployment-75f4d489b4-b6grv/eviction -d @eviction.json -k
    
    • 1

    file

    1. 查看pod
      nginx-deployment-75f4d489b4-b6grv pod已经被重建。
      file
    2. 编辑pdb,修改minAvailable为3
    k edit pdb
    
    • 1

    file
    ALLOWED DISRUPTIONS为0代表一个都不能驱逐。

    1. 修改nginx pod,再次驱逐
      file
      需要3个healthy pod,现在有3个,所以驱逐失败了。

    注意

    如果你将pdb中的minAvailable设置为0,那么这个节点就不能操作下线等操作了。

  • 相关阅读:
    成都睿趣科技:抖音开店初期要注意什么
    PyVis|神经网络数据集的可视化
    CDH6.3.2之Kafka配置和命令
    [halcon案例2] 足球场的提取和射影变换
    利用OPNET进行网络任意源组播(ASM)仿真的设计、配置及注意点
    前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读小程序系统 开题报告
    什么是 x10 开发工具?「GitHub 热点速览」
    项目采购管理
    C语言图钉画表白程序,给自己的偶像制作一个吧
    字节秋招一轮面试分享
  • 原文地址:https://blog.csdn.net/weixin_43616190/article/details/126433485