配置 Pod 干扰预算
EMQX Operator 3.0 不会为 EMQX 集群创建 Kubernetes PodDisruptionBudget(PDB)。本页介绍如何分别为 Core 和 Replicant Pod 创建 PDB,以限制节点排空、集群自动伸缩器缩容或 Descheduler 驱逐等操作造成的自愿干扰。
PDB 仅限制通过 Kubernetes Eviction API 请求的驱逐,无法防止非自愿故障、直接删除 Pod,或 EMQX Operator 在滚动更新期间执行的 Pod 替换。
准备工作
本示例假定当前 kubectl 命名空间中包含一个名为 emqx 的 EMQX 资源。如果资源使用其他名称,请将 apps.emqx.io/instance 选择算符和 EMQX 资源命令中的 emqx 替换为该资源的 metadata.name。每个 PDB 必须与其 EMQX 资源位于同一命名空间。PDB 资源名称 emqx-core 和 emqx-replicant 仅为示例。如果修改了这些名称,请在 PDB 验证命令中使用修改后的名称。
EMQX Operator 会在 EMQX 状态中发布当前的 Pod 选择算符:
status.coreSelectorstatus.replicantSelector
对于名为 emqx 的 EMQX 集群,这些选择算符使用以下稳定标签:
apps.emqx.io/instance: emqx # 使用对应 EMQX CR 的 metadata.name。
apps.emqx.io/managed-by: emqx-operator
apps.emqx.io/db-role: core # 对于 Replicant Pod,使用 replicant。请根据每种角色的 Pod 数量和可用性要求选择 minAvailable 或 maxUnavailable。例如,对于只有一个 Pod 的角色,maxUnavailable: 1 无法保证该角色的可用性。如果自愿干扰不能移除该 Pod,请使用 minAvailable: 1。
创建 PodDisruptionBudget
将以下资源保存为
emqx-pdb.yaml。本示例定义了两个 PDB,将 Core Pod 和 Replicant Pod 作为两个独立的可用性资源池进行保护。如果使用一个 PDB 同时匹配这两种角色,其中一种角色发生驱逐时,可能会占用另一种角色所需的中断容量。如果集群未使用 Replicant Pod,请省略
emqx-replicantPDB。yamlapiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: emqx-core spec: maxUnavailable: 1 selector: matchLabels: apps.emqx.io/instance: emqx apps.emqx.io/managed-by: emqx-operator apps.emqx.io/db-role: core --- apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: emqx-replicant spec: maxUnavailable: 1 selector: matchLabels: apps.emqx.io/instance: emqx apps.emqx.io/managed-by: emqx-operator apps.emqx.io/db-role: replicant应用 PDB:
bashkubectl apply -f emqx-pdb.yaml
验证 PodDisruptionBudget
检查 EMQX Operator 报告的选择算符:
bashkubectl get emqx emqx -o jsonpath='{.status.coreSelector}{"\n"}{.status.replicantSelector}{"\n"}'验证每个选择算符是否与预期的 Pod 匹配。如果集群未使用 Replicant Pod,请省略第二条命令。
bashkubectl get pods -l 'apps.emqx.io/instance=emqx,apps.emqx.io/managed-by=emqx-operator,apps.emqx.io/db-role=core' kubectl get pods -l 'apps.emqx.io/instance=emqx,apps.emqx.io/managed-by=emqx-operator,apps.emqx.io/db-role=replicant'检查每个 PDB,并查看允许的中断次数。如果集群未使用 Replicant Pod,请省略
emqx-replicant及其describe命令。bashkubectl get pdb emqx-core emqx-replicant kubectl describe pdb emqx-core kubectl describe pdb emqx-replicant限制过严的 PDB 可能会无限期阻塞节点排空。开始维护前,请检查每个 PDB 的
status.disruptionsAllowed值,并确保有足够的匹配 Pod 处于就绪状态。