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 生成)

相关推荐
babe小鑫1 小时前
2026年IT行业学习数据分析的价值
学习·数据挖掘·数据分析
星恒随风1 小时前
四天学完前端基础三件套(CSS篇)
前端·css·笔记·学习
05候补工程师1 小时前
【编译原理】语法制导翻译:属性分类、依赖图与求值逻辑全解析
经验分享·笔记·考研·自然语言处理·机器翻译
xingfujie1 小时前
第2章:服务器规划与基础环境配置
linux·运维·微服务·云原生·容器·kubernetes·负载均衡
xiaoyuchidayuma1 小时前
【无标题】
笔记
Raink老师2 小时前
【AI面试临阵磨枪-56】大模型服务部署:Docker、K8s、GPU 调度、推理加速
人工智能·面试·kubernetes·ai 面试
Hali_Botebie2 小时前
【图卷积网络】GAT(Graph Attention Network,图注意力网络),可学习的打分 + 归一化加权求和’构成了注意力
学习
Hua-Jay2 小时前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
许长安2 小时前
rpc和http的区别
经验分享·笔记·网络协议·http·rpc