Kubernetes Pod 调度全解析:从 nodeSelector 到亲和性调度

一、调度器工作流程

CODE
1. 过滤(Predicate):筛掉不满足条件的节点
2. 打分(Priority):对候选节点评分
3. 选定:得分最高的节点,binding

二、最简单:nodeName

YAML
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeName: node-1      # 直接指定,跳过调度器
  containers:
  - name: nginx
    image: nginx:1.25

三、nodeSelector(标签选择)

Bash
# 给节点打标签
kubectl label nodes node-1 disktype=ssd
kubectl label nodes node-2 zone=beijing
YAML
spec:
  nodeSelector:
    disktype: ssd

四、节点亲和性(更强大)

YAML
spec:
  affinity:
    nodeAffinity:
      # 硬约束:必须满足
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values: [linux]
      # 软约束:尽量满足,权重 1-100
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 80
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values: [ssd]

支持的 operator:In、NotIn、Exists、DoesNotExist、Gt、Lt

五、Pod 亲和性与反亲和性

场景:Web 服务与缓存尽量靠近;同一应用的副本尽量分散。
YAML
spec:
  affinity:
    # 反亲和:同一应用不要调度到同一节点(高可用)
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: [web]
        topologyKey: kubernetes.io/hostname

    # 亲和:与 redis 部署在同一可用区
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values: [redis]
          topologyKey: topology.kubernetes.io/zone

六、污点与容忍

Bash
# 给节点加污点(禁止普通 Pod 调度)
kubectl taint nodes node-1 dedicated=gpu:NoSchedule

# 移除
kubectl taint nodes node-1 dedicated=gpu:NoSchedule-

三种 effect:

| effect | 说明 |
| --- | --- |
| NoSchedule | 新 Pod 不调度到该节点 |
| PreferNoSchedule | 尽量不调度 |
| NoExecute | 驱逐已有 Pod |

容忍配置:

YAML
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"
    tolerationSeconds: 3600

七、拓扑分布约束(推荐)

YAML
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: web

八、资源请求与限制

YAML
resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "2"
    memory: "2Gi"

调度只看 requests,不看 limits。

九、排查 Pending

Bash
kubectl describe pod <pod> | grep -A 10 Events
# 常见原因:
# - 资源不足
# - 节点污点未容忍
# - PVC 未绑定
# - 亲和性规则无法满足
打赏作者 已有 0 人打赏,共 ¥0.00
我的打赏
云原生小分队
云原生小分队
Lv6 原创 1 粉丝 212

Service Mesh / Istio / 可观测性

  • 1文章
  • 1.9万总阅读
  • 462获赞
  • 212粉丝

评论(0)

💬

还没有评论,来说两句吧