K8s调度方式

Kubernetes调度完全指南:7种核心策略与生产环境实战

调度是Kubernetes集群的"大脑",决定了业务负载的最佳落脚点。本文将深入解析生产环境中最关键的7种调度策略,并附上经过百亿级容器验证的配置方案。


一、基础调度三板斧

  1. 智能默认调度

    • 运作机制:kube-scheduler综合评估节点资源、污点等条件
    • 核心算法
      • 过滤不满足条件的节点(Predicates)
      • 对剩余节点打分排序(Priorities)
    • 生产监控
      # 查看调度事件
      kubectl get events --field-selector involvedObject.kind=Pod,reason=FailedScheduling
      
  2. 精准定向调度

    • 适用场景
      • GPU节点专属调度
      • 本地SSD存储节点绑定
    • 配置示例
      nodeSelector:
        accelerator: nvidia-tesla-v100
        storage: local-ssd
      
    • 避坑指南
      • 配合节点反亲和性避免单点故障
      • 定期检查标签有效性
  3. 资源水位控制

    • 黄金法则
      resources:
        requests:
          cpu: "1"
          memory: "2Gi"
        limits:
          cpu: "2"
          memory: "4Gi"
      
    • 容量规划公式
      单节点最大Pod数 = (总内存 - 系统预留) / max(Pod内存请求)
      

二、高阶调度策略

调度策略决策树

  1. 亲和性调度矩阵
类型 硬性要求 软性建议 典型场景
节点亲和 requiredDuringScheduling preferredDuringScheduling 区域部署合规性
Pod亲和 mustMatch tryToMatch 微服务共置提升性能
Pod反亲和 mustNotMatch tryToSeparate 高可用多副本分散部署

生产级配置模板

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.kubernetes.io/zone
          operator: In
          values: [zoneA]
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchLabels:
          app: order-service
      topologyKey: kubernetes.io/hostname
  1. 污点免疫系统

    • 节点防护
      # 保护数据库专用节点
      kubectl taint nodes db-node dedicated=db:NoSchedule
      
    • Pod通行证
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "db"
        effect: "NoSchedule"
      
    • 特殊污点类型
      • NoExecute:驱逐现有Pod
      • PreferNoSchedule:软性排斥
  2. 拓扑分布约束

    • 多维度均衡
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: payment-gateway
      
    • 关键参数
      • maxSkew:最大不均衡度
      • topologyKey:分区维度(机架/区域)
      • whenUnsatisfiable:硬性/软性约束

三、生产环境进阶技巧

  1. 优先级抢占机制

    • 配置流程
      1. 定义PriorityClass
      apiVersion: scheduling.k8s.io/v1
      kind: PriorityClass
      metadata:
        name: mission-critical
      value: 1000000
      globalDefault: false
      
      1. Pod引用
      priorityClassName: mission-critical
      
    • 注意事项
      • 谨慎设置globalDefault
      • 监控抢占事件日志
  2. 动态调度扩展

    • 自定义调度器
      type CustomScheduler struct {
          defaultScheduler *core.Scheduler
      }
      func (cs *CustomScheduler) Schedule(ctx context.Context, pod *v1.Pod) (result ScheduleResult, err error) {
          // 自定义调度逻辑
      }
      
    • 调度框架插件
      apiVersion: kubescheduler.config.k8s.io/v1beta2
      kind: KubeSchedulerConfiguration
      profiles:
        - schedulerName: custom-scheduler
          plugins:
            score:
              enabled:
                - name: MyCustomPlugin
      

四、多云/混合云调度策略

  1. 跨云调度方案

    • 联邦集群调度
      apiVersion: scheduling.kubefed.io/v1alpha1
      kind: ReplicaSchedulingPreference
      spec:
        targetClusters:
          - aws-cluster
          - on-premise-cluster
        totalReplicas: 10
        clusters:
          aws-cluster:
            minReplicas: 3
            maxReplicas: 8
      
    • 权重分配算法
      def calculate_weight(cluster):
          return cluster.cpu_available * 0.6 + cluster.memory_available * 0.4
      
  2. 边缘计算调度

    • 边缘节点标记
      kubectl label node edge-node-1 node-type=edge
      
    • 延迟敏感型配置
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-type
                operator: In
                values: [edge]
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/region
      

五、调度问题排查手册

常见故障场景

  1. Pending状态分析
    kubectl describe pod [POD_NAME] | grep -A 10 Events
    # 查看调度失败原因
    
  2. 资源碎片优化
    kubectl top nodes
    # 配合descheduler进行碎片整理
    
  3. 调度器性能调优
    apiVersion: kubescheduler.config.k8s.io/v1beta2
    kind: KubeSchedulerConfiguration
    percentageOfNodesToScore: 50 # 大型集群调低该值
    

调度可视化工具

# 安装调度器视图插件
kubectl create -f https://github.com/kubernetes-sigs/scheduler-plugins/raw/master/manifests/visualization/deploy.yaml

掌握这些调度策略,您的Kubernetes集群将如同精密的交通控制系统,让每个Pod都能找到最佳运行位置。记住:好的调度策略不仅要考虑当前状态,更要为未来的扩展留下弹性空间。

posted on 2025-03-11 12:32  Leo-Yide  阅读(48)  评论(0)    收藏  举报