K8S调度

Pod调度概述

调度器通过 Kubernetes 的监测(Watch)机制来发现集群中新创建且尚未被调度到节点上的 Pod。
调度的主要任务是将Pod分配到集群中的合适的节点上。
调度器根据Pod的需求(如CPU、内存、存储等)和节点的资源状况(如可用CPU、内存、节点标签等)来决定Pod部署在哪个节点上。

调度策略

nodeName

作用:跳过 Kubernetes 调度器的所有调度逻辑,直接将 Pod 绑定到指定名称的节点上。这是一种最直接、最强制的方式,但缺乏弹性

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeName: node1 # 直接指定节点名称
  containers:
  - name: nginx
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:latest 

nodeSelector

作用:通过匹配节点的标签(Label),强制将 Pod 调度到拥有指定标签的节点上。这是一种简单、直接的硬约束调度方式。

  1. 首先,给目标节点打上标签。
kubectl label nodes <node-name> wise=yes
  1. 在 Pod 的 YAML 文件中,通过 nodeSelector 字段指定标签。
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeSelector:
    wise: "yes"  # Pod 只会被调度到拥有此标签的节点
  containers:
  - name: nginx
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:latest 

如果没有任何节点拥有 disktype=ssd 标签,Pod 将一直处于 Pending 状态

亲和性与反亲和性

支持“必须满足”(硬约束)和“尽量满足”(软约束)两种模式

Pod 亲和性允许你指定 Pod 与其他 Pod 一起调度,
而反亲和性则要求 Pod 不与特定的 Pod 调度到同一节点上,通常用于防止某些类型的 Pod 集中到同一节点上,避免单点故障。

节点亲和性

apiVersion: v1
kind: Pod
metadata:
  name: affinity-nginx
spec:
  affinity:
    nodeAffinity:  # 节点亲和性配置
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬约束
        nodeSelectorTerms:  
        - matchExpressions:  
          - key: disktype
            operator: In  
            values:
            - ssd
  containers:
  - name: nginx
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:latest 

Pod 亲和性

apiVersion: v1
kind: Pod
metadata:
  name: affinity-pod-nginx
spec:
  affinity:
    podAffinity:  # Pod亲和性
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬约束
        - labelSelector:  # 匹配已有Pod的标签规则
            matchExpressions:
            - key: app
              operator: In
              values:
              - affinity
          topologyKey: kubernetes.io/hostname  # 指定“同一节点”拓扑域(即当前Pod与匹配标签的Pod调度到同一节点)
  containers:
  - name: nginx
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:latest

Pod 反亲和性

podAffinity改为podAntiAffinity即可。

污点(Taints)与容忍度(Tolerations)

作用:节点可以设置污点来拒绝 Pod 调度,只有声明了相应容忍度的 Pod 才能被调度到该节点。常用于守护节点、专用节点等场景

  1. 设置节点污点
kubectl taint nodes node2 app=node:NoSchedule
  1. 在 Pod 定义中添加容忍度
apiVersion: v1
kind: Pod
metadata:
  name: taint-nginx
spec:
  containers:
  - name: taint-nginx
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:latest 
  tolerations:  # 容忍度配置
  - key: "app"
    operator: "Equal"
    value: "node"
    effect: "NoSchedule"

Pod 拓扑分布约束 (Topology Spread Constraints)

Pod 拓扑分布约束用于保证 Pod 在多个节点、区域或故障域中的均衡分布。
通过设置 topologySpreadConstraints,确保 Pod 在集群中分布更均衡,避免 Pod 集中到某节点或区域,从而增强集群的高可用性和容灾能力。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tp-nginx
  labels: # 顶层标签,用于管理Deployment资源本身[1](@ref)
    app: tp-nginx
spec:
  replicas: 10
  revisionHistoryLimit: 3
  selector: # 控制器用于选择Pod的标签选择器[6](@ref)
    matchLabels:
      app: tp-nginx # 关键:此标签必须存在于Pod模板中
  template:
    metadata:
      labels: # Pod的标签,必须包含selector中定义的所有标签[1](@ref)[2](@ref)
        app: tp-nginx # 必须与selector.matchLabels匹配
        # 可以添加其他标签,如 version: v1
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector: # 此选择器用于拓扑分布统计,与上面的selector目的不同
          matchLabels:
            app: tp-nginx # 统计所有带有此标签的Pod,包括本Deployment创建的
      containers:
      - name: nginx
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx:latest
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
posted @ 2025-12-30 16:59  WiseHYH  阅读(3)  评论(0)    收藏  举报