Kubernetes中Go不直接管理Pod调度策略,而是通过client-go构造含Affinity和Toleration的Pod/Deployment清单提交API Server;Affinity控制节点或Pod间调度倾向,Toleration配合节点Taint实现容忍调度。

在 Kubernetes 中,Go 语言本身不直接参与 Pod 调度策略的管理——调度逻辑由 kube-scheduler 实现,而 Go 是编写 Kubernetes 组件(包括自定义调度器)和客户端程序的主要语言。你真正需要做的是:用 Go 编写的控制器、Operator 或部署工具(如 client-go)来生成符合 Affinity 和 Toleration 规则的 Pod/Deployment 清单,并提交给 API Server。
理解 Affinity 和 Toleration 的作用位置
Affinity(亲和性)和 Toleration(容忍度)是 PodSpec 的字段,属于工作负载对象(如 Deployment、StatefulSet、Pod)的一部分。它们不写在 Go 代码逻辑里,而是通过 Go 构建的 YAML/JSON 对象或 client-go 动态构造后提交。
- Affinity 控制“这个 Pod 倾向于调度到哪些节点”,分 nodeAffinity(节点亲和)、podAffinity/podAntiAffinity(Pod 间亲和/反亲和)
- Toleration 配合节点上的 Taint(污点)使用,表示“这个 Pod 可以容忍哪些污点”,没有对应容忍,Pod 就不会被调度到带该污点的节点上
用 client-go 在 Go 程序中设置 Affinity
你通常会用 client-go 构造 Deployment 对象,然后在 spec.template.spec.affinity 中填入规则。例如,让 Pod 只调度到带有 disktype=ssd 标签的节点:
affinity := &corev1.Affinity{
NodeAffinity: &corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
NodeSelectorTerms: []corev1.NodeSelectorTerm{{
MatchExpressions: []corev1.NodeSelectorRequirement{{
Key: "disktype",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"ssd"},
}},
}},
},
},
}
deployment.Spec.Template.Spec.Affinity = affinity
注意:RequiredDuringSchedulingIgnoredDuringExecution 表示硬约束;若想用软约束(preferred),则改用 PreferredDuringSchedulingIgnoredDuringExecution 并配权重。
立即学习“go语言免费学习笔记(深入)”;
用 Go 添加 Toleration 到 Pod 模板
Toleration 是一个切片,直接赋值给 PodSpec.Tolerations。例如,容忍节点上的 key=value:NoSchedule 污点:
tolerations := []corev1.Toleration{{
Key: "key",
Operator: corev1.TolerationOpEqual,
Value: "value",
Effect: corev1.TaintEffectNoSchedule,
}}
deployment.Spec.Template.Spec.Tolerations = tolerations
常见简写形式(容忍所有污点):{Operator: "Exists"},适合调试或特殊场景,但生产环境慎用。
验证与调试建议
Go 程序提交资源后,调度结果不由 Go 控制,需通过 kubectl 观察:
- 检查 Pod 是否 Pending:
kubectl get pod -o wide - 看调度失败原因:
kubectl describe pod,重点关注 Events 和 Events 中的 “FailedScheduling” 条目 - 确认节点是否有对应 label/taint:
kubectl get nodes --show-labels、kubectl describe node
如果用自定义调度器(用 Go 编写),则需实现 Schedule 接口并集成 predicate/priority 逻辑,但绝大多数场景下,复用默认调度器 + 正确配置 Affinity/Toleration 就已足够。
基本上就这些。










