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

【云原生】Kubernetes PDB(Pod Disruption Budget)介绍与简单使用

一、概述

Pod Disruption Budget (pod 中断 预算) 简称PDB
,含义其实是终止pod前通过 labelSelector 机制获取正常运行的pod数目的限制,目的是对自愿中断的保护措施主动驱逐PodKubernetes version >= 1.7
 才支持 PodDisruptionBudget

官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/configure-pdb/

完整版 k8s 内置资源结构图:

二、PDB 应用场景

  • 节点维护或升级时 ( kubectl drain )

  • 对应用的自动缩容操作(autoscaling down)

【温馨提示】如果 Node 状态处于 not ready,PDB 是不会生效,因为 PDB 只能针对自愿中断生效。

1)自愿中断和非自愿中断场景

Pod 不会消失,直到有人(人类或控制器)将其销毁,或者当出现不可避免的硬件或系统软件错误。

1、非自愿性中断场景

常见的非自愿性中断场景,例如:

  • 后端节点物理机的硬件故障

  • 集群管理员错误地删除虚拟机(实例)

  • 云提供商或管理程序故障使虚拟机消失

  • 内核恐慌(kernel panic)

  • 节点由于集群网络分区而从集群中消失

  • 由于节点资源不足而将容器逐出

2、自愿性中断场景

常见的自愿性中断场景,例如:

包括由应用程序所有者发起的操作和由集群管理员发起的操作。

  • 删除管理该 pod 的 Deployment 或其他控制器。

  • 更新了 Deployment 的 pod 模板导致 pod 重启。

  • 直接删除 pod。

  • 排空(drain)节点进行修复或升级。

  • 从集群中排空节点以缩小集群(了解集群自动调节)。

  • 从节点中移除一个 pod,以允许其他 pod 使用该节点。

2)PDB 关键参数和注意事项

  • .spec.selector
    ——用于指定其所作用的 Pod 集合(pod label),该字段为必需字段

  • .spec.minAvailable
    ——表示驱逐后仍须保证可用的 Pod 数量。即使因此影响到 Pod 驱逐 (即该条件在和 Pod 驱逐发生冲突时优先保证)。 minAvailable 值可以是pod数量或者百分比

  • .spec.maxUnavailable
    ——表示发生自愿中断的过程中,要保证最大不可用的pod数量或者百分比

如果上面配置只能用来应用内置的 Deployment
RS
RC
StatefulSet
StatefulSet
的Pods,推荐优先使用 .spec.maxUnavailable
。如果你使用了例如 Operator
 的其他控制器,那么设置时就要注意以下两点:

  • 只能配置 .spec.minAvailable
    ,不能使用 maxUnavailable;

  • .spec.minAvailable
     只能为整型值,不能是百分比。

【注意事项】

  • 同一个 PDB Object 中不能同时定义 .spec.minAvailable
     和 .spec.maxUnavailable

  • 如果即没有设置 .spec.minAvailable
     也没有设置 .spec.maxUnavailable
     的话,那么会默认设置 .spec.minAvailable
     为 1

  • 前面提到,应用滚动更新时Pod的delete
    unavailable
    虽然也属于自愿中断,但是实际上滚动更新有自己的策略控制(marSurge
     和 maxUnavailable
    ),因此PDB不会干预这个过程。

  • PDB 只能保证自愿中断时的副本数,比如 evict pod过程中刚好满足 .spec.minAvailable
     或 .spec.maxUnavailable
    ,这时某个本来正常的Pod突然因为Node Down(非自愿中断)挂了,那么这个时候实际Pods数就比PDB中要求的少了,因此PDB不是万能的。

三、示例演示

1)使用 minAvailable 的PDB 示例

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper

2)使用 maxUnavailable 的 PDB 示例

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
maxUnavailable: 1
selector:
matchLabels:
app: zookeeper

Kubernetes PDB 的介绍就先到这里了,其实PDB的使用场景不是很多,有疑问的小伙伴欢迎给我留言哦,后续会持续更新【云原生和大数据】相关的文章,请小伙伴耐心等待哦~


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

评论