k8s

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>
  2. 执行 node drain 排空节点,将其上运行的 Pod 平滑迁移
    至其他节点。

    kubectl drain <node name>
  3. 如果应用不可中断,就需要设置pdb。
  4. 设置了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

    file

  2. 创建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

    file

  3. 解码kubeconfig
    cat ~/.kube/config
    echo 'xxx' | base64 -d > admin.crt
    echo 'xxx' | base64 -d > admin.key
  4. 创建eviction.json文件
    cat eviction.json
    {
    "apiVersion": "policy/v1",
    "kind": "Eviction",
    "metadata": {
    "name": "nginx-deployment-75f4d489b4-b6grv",
    "namespace": "default"
    }
    }
  5. 通过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

    file

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

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

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

注意

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

分类: k8s
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x