Kubernetes调度与资源管理深度解析:从基础到高级策略

一、资源请求与限制:集群稳定的基石

1.1 requests与limits核心概念

在Kubernetes中,requestslimits是资源管理的两个关键参数:

resources:
  requests:
    cpu: "500m"  # 0.5个CPU核心
    memory: "512Mi"
  limits:
    cpu: "1"     # 1个CPU核心
    memory: "1Gi"
  • requests:调度依据,表示容器启动所需的最小资源
  • limits:运行时限制,容器能使用的资源上限

1.2 CPU与内存的特殊差异

特性CPUMemory
超用后果被限流容器可能被OOMKill
单位1=1vCPU (1000m=1vCPU)Mi/Gi (二进制单位)
可压缩性

实践建议

  • 生产环境必须设置limits
  • Java应用建议设置内存limits小于节点内存的75%(考虑JVM开销)
  • 使用LimitRange为命名空间设置默认值

二、调度策略:智能编排的艺术

2.1 基础调度:nodeSelector

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  nodeSelector:
    accelerator: nvidia-tesla
  containers:
  - name: cuda-container
    image: nvidia/cuda

2.2 高级调度:Affinity/Anti-Affinity

图1

示例:避免同一服务的Pod集中在同一节点

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: [web]
      topologyKey: kubernetes.io/hostname

2.3 污点与容忍(Taint & Toleration)

图2

典型场景

  • 专用节点(GPU/高IO)
  • 节点维护(NoExecute)
  • 边缘节点(network=slow:PreferNoSchedule)

三、资源监控:数据驱动的决策

3.1 Metrics Server架构

图3

3.2 HPA高级配置

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: External
    external:
      metric:
        name: requests_per_second
        selector:
          matchLabels:
            app: web
      target:
        type: AverageValue
        averageValue: 500

最佳实践

  • 生产环境建议使用v2版本的HPA
  • 结合自定义指标(如QPS)比单纯CPU更可靠
  • 设置合理的冷却时间(--horizontal-pod-autoscaler-downscale-stabilization)

四、实战案例:电商系统调度配置

4.1 订单服务配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: order
  template:
    metadata:
      labels:
        app: order
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values: [order]
              topologyKey: topology.kubernetes.io/zone
      containers:
      - name: order
        image: registry.example.com/order:v1.2
        resources:
          requests:
            cpu: "300m"
            memory: "512Mi"
          limits:
            cpu: "1"
            memory: "1Gi"
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

4.2 关键配置解析

  1. 多可用区部署:通过podAntiAffinity确保订单服务分散在不同zone
  2. 资源超卖控制:requests总和不超过节点资源的70%
  3. 优雅扩缩容:配合readinessProbe确保新Pod完全就绪

五、常见问题排查指南

5.1 调度失败常见原因

kubectl get events --sort-by=.metadata.creationTimestamp

常见错误:

  • Insufficient cpu/memory:资源不足
  • didn't match Pod's node affinity:亲和性冲突
  • unbound immediate PersistentVolumeClaims:存储未就绪

5.2 资源监控诊断

# 查看节点资源使用
kubectl top nodes --use-protocol-buffers

# 查看Pod资源使用
kubectl top pods -n production

六、演进趋势:调度器的未来

  1. 动态资源分配(DRA):GPU等扩展资源的精细化管理
  2. 拓扑感知调度:优化跨NUMA节点的资源分配
  3. 批调度支持:增强AI训练等批处理任务支持

延伸阅读建议

  1. 使用[Kube-bench]进行调度策略合规性检查
  2. 通过[Descheduler]定期重新平衡集群负载
  3. 参考[Kubernetes调度器性能调优指南]优化大规模集群

通过合理运用这些调度与资源管理技术,可以显著提升集群的稳定性和资源利用率。建议从业务需求出发,逐步实施高级调度策略。

添加新评论