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 调度到拥有指定标签的节点上。这是一种简单、直接的硬约束调度方式。
- 首先,给目标节点打上标签。
kubectl label nodes <node-name> wise=yes
- 在 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 才能被调度到该节点。常用于守护节点、专用节点等场景
- 设置节点污点
kubectl taint nodes node2 app=node:NoSchedule
- 在 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"

浙公网安备 33010602011771号