
Kubernetes 集群中调度器(Scheduler)负责将 Pod 分配到合适的节点上运行。除了默认的调度策略外,Kubernetes 还提供了一系列高级调度机制,允许根据业务需求对 Pod 的部署位置进行精细化控制。本文将详细介绍这些高级调度方法的使用说明、适用场景,并提供相应的代码示例。
使用说明:
节点选择器是控制 Pod 调度位置的最直接方式。通过在 Pod 的 spec.nodeSelector 字段中指定键值对,Pod 只会被调度到拥有匹配标签的节点上。这是一种“硬性”要求,如果没有节点满足条件,Pod 将处于 Pending 状态。
场景:
适用于需要将 Pod 固定部署到具有特定硬件(如 GPU、SSD)、特定软件环境或特定网络区域的节点上的场景。
代码示例:
1、为节点添加标签:
kubectl label nodes node01 disktype=ssd zone=us-west2、在 Pod 定义中使用 NodeSelector:
apiVersion: v1
kind: Pod
metadata:
name: nginx-ssd
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd
zone: us-west此 Pod 将只会被调度到同时拥有 disktype=ssd 和 zone=us-west 标签的节点。
亲和性调度提供了比 NodeSelector 更强大、更灵活的规则,包括“软性”偏好和“硬性”要求,并且可以基于节点或 Pod 的标签进行决策。
使用说明:
节点亲和性允许你定义 Pod 对节点标签的偏好。它分为两类:
场景:
代码示例:
1、硬亲和性示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-hard-affinity
spec:
containers:
- name: nginx
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
- key: memory-size
operator: Gt
values:
- "16"此 Pod 必须调度到标签 disktype 值为 ssd 且 memory-size 值大于 “16” 的节点上。
2、软亲和性示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-soft-affinity
spec:
containers:
- name: nginx
image: nginx
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
- weight: 20
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-west调度器会优先选择有 disktype=ssd 标签的节点(权重80),其次选择有 zone=us-west 标签的节点(权重20)。
使用说明:
Pod 亲和性/反亲和性定义了 Pod 之间部署位置的相互关系。
规则通过 labelSelector 选择目标 Pod,并通过 topologyKey 定义“拓扑域”(即,在哪个范围内判定“在一起”或“不在一起”)。常见的 topologyKey 有:
场景:
代码示例:
1、Pod 反亲和性(硬性)示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname此 Deployment 的 3 个 Pod 绝对不能被调度到同一个节点上( topologyKey: kubernetes.io/hostname ),确保了节点级别的高可用性。
2、Pod 亲和性(软性)示例:
apiVersion: v1
kind: Pod
metadata:
name: analytics-pod
spec:
containers:
- name: analytics
image: analytics:latest
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: topology.kubernetes.io/zone此 analytics-pod 优先调度到与带有 app=web 标签的 Pod 同一个可用区的节点上。
使用说明:
污点和容忍度提供了一种“节点排斥 Pod”的机制。
污点包含三个部分: key=value:effect 。
场景:
代码示例:
1、为节点添加污点:
# 添加一个污点,键为 `special`,值为 `gpu`,效果为 `NoSchedule`
kubectl taint nodes node01 special=gpu:NoSchedule2、在 Pod 中定义容忍度:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: cuda-app
image: nvidia/cuda:latest
tolerations:
- key: "special"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"只有定义了此容忍度的 Pod 才能被调度到 node01 上。
3、删除污点:
kubectl taint nodes node01 special-Kubernetes 的高级调度机制构成了一个强大而精细的控制平面,使部署能够满足复杂的业务需求:
在实际生产环境中,这些策略常常组合使用。例如,一个高可用的 Web 服务可能同时使用 PodAntiAffinity 确保副本分散,使用 NodeAffinity 优先选择高性能节点,并通过容忍度允许自己运行在部分被标记为专用的节点上,从而在性能、可用性和资源利用之间取得最佳平衡。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!