1. 当集群变成菜市场:资源争抢那些事儿

某个周五晚八点,电商系统的订单服务突然出现延迟告警。排查发现计算节点全被商品推荐系统的机器学习任务占据,这个场景暴露出Kubernetes原生的FIFO调度策略存在重大缺陷——就像超市结账时VIP客户和普通顾客排同个队列,这在生产环境中显然不可接受。

传统调度算法的主要问题:

# 典型的问题场景(所有Pod平等调度)
apiVersion: v1
kind: Pod
metadata:
  name: order-service
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests: # 核心业务申请8核
        cpu: "8"

---

apiVersion: v1
kind: Pod 
metadata:
  name: data-analysis
spec:
  containers:
  - name: python
    image: pytorch-job
    resources:
      requests: # 分析任务申请24核
        cpu: "24"

(注释:当分析任务先于订单服务启动时,就会导致关键业务资源不足)

2. 优先级的魔法结界搭建指南

2.1 优先级分类器的工作原理

PriorityClass相当于给不同业务颁发VIP卡:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: platinum-tier
value: 1000000            # 特权等级数值
globalDefault: false      # 需要显式指定使用
description: "核心交易系统专用"

---

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: bronze-tier
value: 100
description: "后台分析任务级别"

(注释:数值范围建议保留百万级跨度,方便后续扩展中间级别)

2.2 高优先级服务配置模板

为支付网关注入特权属性:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-gateway
spec:
  template:
    metadata:
      labels:
        app: critical-service
    spec:
      priorityClassName: platinum-tier # 关键标识
      containers:
      - name: payment
        image: payment:v3.2
        resources:
          requests:
            cpu: "4"
          limits:
            cpu: "8"
        readinessProbe:          # 健康检查双保险
          httpGet:
            path: /health
            port: 8080
        livenessProbe:
          exec:
            command: ["pgrep", "java"]

(注释:特权服务必须配置完善的健康检查,避免僵尸进程浪费资源)

3. 抢占机制的实弹演练

3.1 抢占触发全流程拆解

当高优先级Pod遭遇资源饥荒:

# 观察抢占事件的实时追踪
kubectl get events --field-selector reason=Preempted --sort-by='.lastTimestamp'

# 典型输出示例
LAST SEEN   TYPE     REASON      OBJECT               MESSAGE
5s          Normal   Preempted   pod/data-processor   Preempting pod data-processor to make room for critical pod payment-gateway-djj2

(注释:被抢占的Pod会进入Terminating状态,建议配置优雅退出脚本)

3.2 抢占防御配置示例

为重要分析任务设置防抢占护盾:

apiVersion: batch/v1
kind: Job
metadata:
  name: financial-report
spec:
  template:
    spec:
      priorityClassName: gold-tier
      preemptionPolicy: Never  # 生死状签名位
      containers:
      - name: spark
        image: financial-analytics:v2
        command: ["/opt/run_report.sh"]

(注释:该配置仅适用于v1.24+版本,需谨慎评估业务容忍度)

4. 三位一体的防护矩阵

4.1 资源配额的战略布局

为不同部门设置资源隔离区:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: transaction-quota
spec:
  hard:
    requests.cpu: "32"       # 交易业务专属配额
    limits.cpu: "64"
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass 
      values: ["platinum-tier"]

(注释:建议按优先级级别划分资源池,实现软隔离)

4.2 亲和性的智能编排

数据库缓存服务的黄金搭档:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  template:
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["payment-service"] # 支付服务在哪我就在哪
            topologyKey: kubernetes.io/hostname
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values: ["redis"]
              topologyKey: topology.kubernetes.io/zone # 跨可用区容灾

(注释:硬亲和保证性能,软反亲和确保容灾,需要结合业务特性调整权重)

5. 最佳作战场景手册

5.1 电商大促预案

设置多级响应策略:

  • 活动开始前2小时:批量调低数据分析任务优先级
  • 支付峰值期间:启动实时监控自动触发应急抢占
  • 促销结束后:渐进式恢复常规任务

5.2 AI训练任务调度

采用动态优先级策略:

# 根据队列状态自动调整
kubectl patch priorityclass gold-tier --type merge -p '{"value":500000}' 

# 与HPA联动的自动化案例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: model-training
spec:
  metrics:
  - type: External
    external:
      metric:
        name: cluster_cpu_pressure
      target:
        type: Value
        value: 70
  behavior:
    scaleUp:
      policies:
      - type: Pods
        value: 2
        periodSeconds: 60

(注释:需要配合Prometheus等监控系统实现智能联动)

6. 双刃剑的锋芒与锈迹

6.1 显著优势

  • 关键业务SLA达标率提升70%+
  • 集群资源利用率突破85%瓶颈
  • 故障应急响应速度缩短至秒级

6.2 潜在风险

  • 优先级误配置可能引发级联故障
  • 频繁抢占导致etcd写入压力暴增
  • 缺乏监控时可能形成资源孤岛

7. 老兵的经验宝典

  1. 建立优先级命名规范(如:team-env-function)
  2. 为抢占操作设置全局冷却期(建议300秒)
  3. 定期审计资源配额与实际消耗偏差
  4. 核心业务建议预留5%-10%buffer
  5. 监控重点指标:
# 抢占告警表达式
sum(kube_pod_status_reason{reason="Preempted"}) by (namespace)
> 0

# 配额使用率预警
(kube_resourcequota{type="used"} / ignoring(instance) kube_resourcequota{type="hard"}) 
* 100 > 85

8. 架构师的全局观

经过半年生产环境验证,某跨境电商平台通过分级调度策略:

  • 促销期间核心服务可用性达到99.995%
  • 计算资源成本下降40%
  • 应急操作人工介入减少80%

但需要注意:

  • 每次K8s版本升级需重新验证抢占策略
  • 与网络策略、存储卷声明等存在隐性耦合
  • 需要建立跨团队的资源审批流程