如何配置Kubernetes仅在Pod故障时重调度,避免主动迁移正常Pod?
Kubernetes 遗留有状态单体应用调度规则配置方案
1. 部署资源类型选择
优先使用StatefulSet而非Deployment部署应用:
- StatefulSet 会为每个Pod分配稳定的唯一标识与存储绑定关系,Pod重建时优先尝试在原节点原地重启,仅当原节点完全失联/不可用才会触发跨节点重调度,避免无意义的主动迁移。
2. 配置Pod干扰预算阻断主动运维迁移
PodDisruptionBudget(PDB)用于控制集群自愿中断场景下的Pod终止行为,包括节点版本升级、集群自动缩容排空、运维手动执行kubectl drain等主动操作,配置maxUnavailable: 0即可禁止所有主动场景下的Pod终止操作:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: legacy-tomcat-pdb spec: maxUnavailable: 0 selector: matchLabels: app: legacy-tomcat-app
3. 配置高优先级避免资源抢占驱逐
集群调度器遇到节点资源不足时,会主动驱逐低优先级Pod来释放资源,通过创建高优先级PriorityClass并关联到应用Pod,可避免被其他低优先级业务抢占:
- 创建优先级类
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: legacy-app-high-priority value: 1000000 globalDefault: false description: "遗留单体应用专用高优先级,避免被抢占"
- 在Pod模板中引用优先级类
spec: priorityClassName: legacy-app-high-priority # 其余Pod配置省略
4. 豁免节点压力驱逐与自动重调度
- 若集群部署了Descheduler负载均衡组件,给Pod添加注解
descheduler.alpha.kubernetes.io/evict: "false",禁止组件为平衡节点负载主动迁移正常Pod。 - 调整kubelet驱逐规则,可将该高优先级类加入节点压力驱逐豁免列表,避免节点资源紧张时正常运行的Pod被主动驱逐。
5. 探针与终止策略优化
- 针对20分钟的启动时长,调整
livenessProbe的初始延迟参数,避免启动阶段被误判为故障杀死:
livenessProbe: httpGet: path: /已配置的liveness检测端点 port: 8080 initialDelaySeconds: 1260 # 设置21分钟缓冲,覆盖最长启动时间 periodSeconds: 10 failureThreshold: 3
- 配置足够长的终止宽限期,给用户预留操作收尾时间:
spec: terminationGracePeriodSeconds: 300 # 其余配置省略
6. 可选优化:会话粘滞配置
在Ingress或Service层配置会话粘性,确保同一用户的请求始终转发到同一个Pod,避免会话丢失:
- Nginx Ingress 配置示例:添加注解
nginx.ingress.kubernetes.io/affinity: "cookie"
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

