K8S优先级、Pod驱逐、HPA扩缩容 学习笔记
一、K8S Pod 优先级与节点优先级
1.1 Pod 优先级核心概念
Pod 优先级用于定义 Pod 在集群中的重要程度,核心作用是保障核心业务 Pod 优先调度、优先占用资源,避免重要服务被普通业务抢占资源。
1.1.1 PriorityClass 优先级类
PriorityClass 是 K8S 全局资源对象,用于定义优先级名称与优先级数值的映射,供 Pod 直接引用,核心规则:
-
优先级数值为整数,数值越大,优先级越高,支持小于10亿的整数
-
globalDefault:是否为集群默认优先级,未配置优先级的 Pod 优先级默认为 0
-
description:自定义优先级描述,用于备注用途
1.1.2 两大优先级调度策略
根据资源不足时的处理方式,分为非抢占、抢占两种策略:
-
非抢占优先(preemptionPolicy: Never):仅调度阶段优先排队,Pod 调度成功后不会被抢占。资源不足时,高优先级 Pod 只能等待低优先级 Pod 释放资源。
-
抢占优先(preemptionPolicy: PreemptLowerPriority):资源不足时,高优先级 Pod 会主动删除节点上低优先级 Pod,抢占资源完成自身调度,保障核心服务运行。
1.2 非抢占优先级 实操配置
1.2.1 定义优先级类 YAML
yaml
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: high-non
globalDefault: false
preemptionPolicy: Never
value: 1000
description: 高优先级非抢占策略
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: low-non
globalDefault: false
preemptionPolicy: Never
value: 500
description: 低优先级非抢占策略
执行创建命令:
bash
kubectl apply -f mypriority.yaml
# 查看所有优先级类
kubectl get priorityclasses.scheduling.k8s.io
1.2.2 不同优先级 Pod 配置
指定固定节点、占用高 CPU 资源,模拟资源不足场景:
yaml
# 无优先级 Pod(nginx1.yaml)
kind: Pod
apiVersion: v1
metadata:
name: nginx1
spec:
nodeName: k8s-node2
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "1500m"
# 低优先级 Pod(nginx2.yaml)
kind: Pod
apiVersion: v1
metadata:
name: nginx2
spec:
nodeName: k8s-node2
priorityClassName: low-non
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "1500m"
# 高优先级 Pod(nginx3.yaml)
kind: Pod
apiVersion: v1
metadata:
name: nginx3
spec:
nodeName: k8s-node2
priorityClassName: high-non
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "1500m"
1.2.3 验证非抢占策略
bash
# 依次创建三个Pod
kubectl apply -f nginx1.yaml
kubectl apply -f nginx2.yaml
kubectl apply -f nginx3.yaml
# 查看Pod状态:无优先级Pod运行,高低优先级Pod均pending
kubectl get pods
# 删除占用资源的无优先级Pod
kubectl delete pod nginx1
# 再次查看:高优先级Pod优先启动,低优先级仍pending
kubectl get pods
# 清理实验资源
kubectl delete pod nginx2 nginx3
1.3 抢占优先级 实操配置
1.3.1 抢占式优先级类 YAML
yaml
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: high1
globalDefault: false
preemptionPolicy: PreemptLowerPriority
value: 1000
description: 高优先级抢占策略
---
kind: PriorityClass
apiVersion: scheduling.k8s.io/v1
metadata:
name: low1
globalDefault: false
preemptionPolicy: PreemptLowerPriority
value: 500
description: 低优先级抢占策略
1.3.2 验证抢占策略
bash
# 创建基础占用资源Pod
kubectl apply -f nginx1.yaml
# 创建高优先级抢占Pod
sed 's,-non,,' nginx3.yaml |kubectl apply -f-
# 高优先级Pod直接抢占资源成功运行
kubectl get pods
# 创建低优先级抢占Pod,资源不足直接pending
sed 's,-non,,' nginx2.yaml |kubectl apply -f-
kubectl get pods
# 清理资源
kubectl delete pod nginx2 nginx3
kubectl delete -f mypriority.yaml
1.4 节点优先级
节点优先级用于调度器优先选择优质节点部署 Pod,共分为三类常用优先级:
1.4.1 静态优先级
通过节点注解设置固定优先级,数值越高优先级越高,适合新旧硬件混合集群,优先将业务调度到新硬件节点。
bash
# 给新节点设置高优先级、旧节点设置低优先级
kubectl annotate node node-new-1 scheduler.alpha.kubernetes.io/priority=100
kubectl annotate node node-new-2 scheduler.alpha.kubernetes.io/priority=100
kubectl annotate node node-old scheduler.alpha.kubernetes.io/priority=50
# 删除节点优先级注解
kubectl annotate node node-old scheduler.alpha.kubernetes.io/priority-
1.4.2 亲和性优先级
通过节点亲和性权重控制调度优先级,权重越高越优先被选中,适合多区域集群,实现就近部署、降低网络延迟。核心是通过 preferredDuringSchedulingIgnoredDuringExecution 的 weight 参数定义优先级权重。
1.4.3 QoS 服务质量优先级
K8S 根据 Pod 的 resources 配置,自动划分 3 个 QoS 等级,决定资源不足时的驱逐优先级,等级越高,越不容易被驱逐:
-
Guaranteed(最高优先级):requests 和 limits 资源值完全一致,核心业务(数据库、交易服务)首选,几乎不会被驱逐
-
Burstable(中优先级):仅配置 requests 或 limits,或两者数值不一致,普通业务服务使用
-
BestEffort(最低优先级):未配置任何资源限制,临时日志、测试服务使用,资源不足时最先被驱逐
驱逐顺序:BestEffort > Burstable > Guaranteed
二、K8S Pod 驱逐机制
2.1 驱逐机制核心作用
单纯依赖系统 OOM 杀进程存在缺陷:无法管控 CPU 资源、容易导致 Pod 反复重启。Kubelet 内置驱逐机制,通过自定义资源阈值,主动驱逐低优先级 Pod,防止节点资源耗尽、节点宕机,保障集群整体稳定。
2.2 两大驱逐模式
2.2.1 软驱逐(Soft Eviction)
资源达到阈值后,等待预设宽限期,若宽限期内资源压力未缓解,才执行驱逐;若资源恢复则不驱逐,适合对可用性敏感的业务。
2.2.2 硬驱逐(Hard Eviction)
资源一旦达到阈值,立刻强制驱逐 Pod,无等待时间,是节点资源保护的最后防线。
2.3 驱逐核心影响因素
节点资源不足时,Kubelet 按以下优先级选择驱逐 Pod(优先级从高到低):
-
QoS 等级:优先驱逐 BestEffort,其次 Burstable,最后 Guaranteed
-
PriorityClass 优先级:优先级数值越低,越优先被驱逐
-
辅助因素:资源使用率越接近 limit、运行时间越短的 Pod,越容易被驱逐
2.4 节点污点与驱逐联动
K8S 默认开启 TaintNodesByCondition、TaintBasedEvictions 特性,节点出现异常时自动打污点,无容忍的 Pod 会被自动驱逐:
-
节点状态异常污点:节点未就绪、不可达、磁盘满、网络不可用等(NoSchedule 禁止新 Pod 调度)
-
资源压力污点:内存不足、磁盘不足(NoExecute 直接驱逐现有 Pod)
2.5 实战:内存驱逐故障排查
2.5.1 故障现象
业务无法访问,Pod 状态为 Evicted(被驱逐),日志提示内存资源压力。
2.5.2 排查命令
bash
# 查看所有异常Pod
kubectl get pods -A | grep 0/1
# 查看Pod驱逐事件原因
kubectl describe pods 被驱逐Pod名称
# 查看节点可分配资源
kubectl describe node
2.5.3 故障根因与优化
虚拟机在线扩容内存后,未重启 kubelet,kubelet 识别的可分配内存仍是旧数值,导致误判资源不足、驱逐 Pod。
优化方案:新增监控告警,对比节点物理内存与 kubelet 识别内存,差值过大时触发告警,及时重启 kubelet。
2.6 Kubelet 驱逐参数生产配置
配置文件路径:/var/lib/kubelet/config.yaml,核心生产配置如下:
yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# 硬性驱逐阈值
evictionHard:
memory.available: "200Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "15%"
# 软性驱逐阈值
evictionSoft:
memory.available: "300Mi"
nodefs.available: "15%"
# 软驱逐宽限期
evictionSoftGracePeriod:
memory.available: "1m"
nodefs.available: "1m"
# Pod最大优雅终止时间
evictionMaxPodGracePeriod: 60
# 资源压力稳定等待时间
evictionPressureTransitionPeriod: "5m"
# 生产必备:系统、K8S组件资源预留
systemReserved:
memory: "1Gi"
cpu: "500m"
kubeReserved:
memory: "1Gi"
cpu: "250m"
enforceNodeAllocatable:
- pods
- system-reserved
- kube-reserved
# 镜像垃圾回收配置
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
imageMinimumGCAge: 2m0s
2.7 Pod 驱逐最佳实践
-
核心业务 Pod 配置Guaranteed 等级(request=limit),并配置高 PriorityClass,降低驱逐概率
-
必须配置 systemReserved、kubeReserved,防止系统核心进程被抢占资源
-
监控集群 Evicted 事件,及时优化 Pod 资源配额
-
区分软硬驱逐,核心业务适配软驱逐,预留缓冲时间
三、K8S HPA 水平扩缩容
3.1 HPA 核心作用
HPA(Horizontal Pod Autoscaler)是 K8S 自动扩缩容组件,用于根据业务负载 自动调整 Deployment 副本数,解决人工频繁调整副本、资源浪费、流量峰值服务过载问题。
集群三类弹性伸缩区别:
-
Cluster-Autoscale:自动扩缩集群 Node 节点数量
-
VPA:垂直扩缩,自动调整 Pod 的 CPU/内存资源配额
-
HPA:水平扩缩,自动增减 Pod 副本数,生产最常用
3.2 HPA 四大监控指标类型
HPA 通过监控指标触发扩缩容,v2 版本支持四类指标,适配不同业务场景:
-
Resource:系统原生指标(CPU、内存使用率),最常用
-
Pods:Pod 自定义指标(如单 Pod QPS、请求延迟)
-
Object:K8S 资源对象指标(如 Ingress 总流量)
-
External:外部系统指标(如业务订单量、MQ 消息堆积数)
3.3 基础 HPA 配置示例
实现:CPU 平均使用率超过 50% 自动扩容,副本数限制 1-10 个
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
# 绑定需要扩缩容的Deployment
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
# 最小、最大副本数
minReplicas: 1
maxReplicas: 10
# 监控CPU使用率
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
3.4 HPA 核心扩缩容规则
3.4.1 基础算法
期望副本数 = 向上取整(当前副本数 × 当前指标值 / 目标指标值)
3.4.2 默认伸缩策略
-
快速扩容:无冷却时间,15秒可扩容一次,单次最大扩容至原副本数2倍或新增4个Pod(取最大值)
-
谨慎缩容:默认5分钟冷却窗口,取5分钟内最大副本数作为基准,防止频繁抖动
-
容忍阈值:副本数变化小于10%时,不执行伸缩,避免频繁微调
3.5 自定义扩缩容速率(Behavior)
K8S 1.18+ 支持通过 behavior 自定义扩缩容速度,精准适配业务场景,无需依赖全局配置。
3.5.1 常用场景配置
场景1:极速扩容、缓慢缩容(高并发业务)
yaml
behavior:
scaleUp:
policies:
- type: Percent
value: 900
periodSeconds: 60
scaleDown:
policies:
- type: Pods
value: 1
periodSeconds: 600
场景2:只扩容、不缩容(核心稳定业务)
yaml
behavior:
scaleDown:
selectPolicy: Disabled
场景3:缓慢扩容(资源敏感业务)
yaml
behavior:
scaleUp:
policies:
- type: Pods
value: 1
periodSeconds: 600
3.6 HPA 核心总结与使用注意
-
HPA 遵循快扩慢缩原则,优先保障流量峰值可用性,规避抖动问题
-
支持多指标联动伸缩,多个指标触发扩容时,取最大扩容幅度
-
必须配置 min/max 副本边界,防止指标异常导致集群资源耗尽
-
内存指标不建议作为核心伸缩依据(GC、内存池会导致数据不准),优先使用 CPU、业务 QPS
-
可结合 CronHPA 实现定时伸缩,适配固定周期流量业务
(注:文档部分内容可能由 AI 生成)