K8S优先级、Pod驱逐、HPA扩缩容 学习笔记

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(优先级从高到低):

  1. QoS 等级:优先驱逐 BestEffort,其次 Burstable,最后 Guaranteed

  2. PriorityClass 优先级:优先级数值越低,越优先被驱逐

  3. 辅助因素:资源使用率越接近 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 生成)

相关推荐
RisunJan2 分钟前
鸿蒙(HarmonyOS NEXT)开发小白入门学习计划表
学习·华为·harmonyos
征尘bjajmd10 分钟前
黑马AI大模型机器学习课程笔记(个人记录、仅供参考)
人工智能·笔记·机器学习
猫吃了源码11 分钟前
Ubuntu24系统安装部署最新版K8s(Kubernetes)1.36保姆级详细教程
云原生·容器·kubernetes
蒸蒸yyyyzwd17 分钟前
cpp选手备战秋招学习笔记day17
笔记·学习
谢白羽31 分钟前
SGLang模型加载过程笔记
笔记·llm·论文·agent·vllm·大模型部署·sglang
AAA代码批发商1 小时前
Days 32 Linux 多线程:线程分离属性、多进程 vs 多线程、线程同步互斥锁、信号量
linux·笔记
陈天伟教授1 小时前
【30天学会机械制图 第15 天】项目四 学会看零件图 任务1 学习零件的基本表达方法 (1)
学习·工程制图·机械制图
从零开始的嵌入式之旅1 小时前
day31
linux·c语言·经验分享·笔记·嵌入式硬件
小张帅三代1 小时前
yolo基础学习笔记
笔记·学习·yolo
秋风点枝1 小时前
第二篇:安装 Argo CD + 第一次部署应用
kubernetes·github·argocd