1. 概述
在 Kubernetes(K8s)中,为了更好地控制 Pod 在集群中的调度,K8s 提供了 亲和性(Affinity)、反亲和性(Anti-Affinity)、污点(Taints)和容忍(Tolerations) 机制。这些机制可以帮助我们合理安排 Pod 运行的节点,优化资源利用率,提高系统稳定性。
2. 亲和性(Affinity)和反亲和性(Anti-Affinity)
2.1 亲和性(Node Affinity)
亲和性允许 指定 Pod 期望调度到某些特定的节点,通常基于节点的标签(Labels)。Kubernetes 提供了两种亲和性规则:
-
requiredDuringSchedulingIgnoredDuringExecution(硬性规则):Pod 必须 调度到符合条件的节点,否则不会被调度。 -
preferredDuringSchedulingIgnoredDuringExecution(软性规则):Pod 优先 调度到符合条件的节点,但如果没有符合的节点,也不会阻止调度。
示例:将 Pod 只调度到 zone=us-east-1 的节点上
apiVersion: v1
kind: Pod
metadata:
name: affinity-example
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- us-east-1
containers:
- name: my-container
image: nginx
说明:
-
key: zone:指定用于匹配的节点标签键。 -
operator: In:表示zone需匹配values列表中的值。 -
values: [us-east-1]:只有zone=us-east-1的节点才符合条件。
2.2 反亲和性(Pod Anti-Affinity)
反亲和性(Pod Anti-Affinity)用于 避免特定的 Pod 运行在相同的节点上,通常用于高可用性(HA)部署。
示例:确保 Pod 分布在不同的节点上,避免单点故障
apiVersion: apps/v1
kind: Deployment
metadata:
name: anti-affinity-example
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my-app
topologyKey: kubernetes.io/hostname
containers:
- name: my-container
image: nginx
说明:
-
labelSelector.matchLabels:用于匹配 Pod 标签。 -
topologyKey: kubernetes.io/hostname:表明 Pod 不能运行在相同的节点。 -
requiredDuringSchedulingIgnoredDuringExecution:强制规则,必须执行。
3. 污点(Taints)与容忍(Tolerations)
3.1 污点(Taints)
污点(Taint)用于 标记节点,使特定 Pod 无法调度到该节点上,除非 Pod 具有相应的容忍(Toleration)。常用于隔离工作负载,例如:
- 预留节点给特定类型的应用(如专门用于 AI 训练的 GPU 计算节点)。
- 保护核心服务,防止不必要的 Pod 占用资源。
添加污点到节点
kubectl taint nodes node1 key=value:NoSchedule
说明:
-
key=value:污点的键值对。 -
NoSchedule:表示 K8s 不会调度新的 Pod 到该节点,除非 Pod 具有相应的toleration。
3.2 容忍(Tolerations)
容忍(Toleration)用于 允许 Pod 运行在带有特定污点的节点上。
示例:让 Pod 可以运行在 key=value:NoSchedule 的污点节点上
apiVersion: v1
kind: Pod
metadata:
name: toleration-example
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
containers:
- name: my-container
image: nginx
说明:
-
key: "key":指定容忍的污点键。 -
operator: "Equal":表示key必须匹配value。 -
effect: "NoSchedule":表示该 Pod 可以调度到带有NoSchedule污点的节点。
4. 相关配置参数说明
亲和性 & 反亲和性参数
| 参数 | 说明 |
|---|---|
key |
需要匹配的标签键 |
operator |
匹配运算符(In、NotIn、Exists、DoesNotExist) |
values |
需要匹配的值(仅 In 和 NotIn 适用) |
topologyKey |
影响调度的拓扑键(如 kubernetes.io/hostname) |
requiredDuringSchedulingIgnoredDuringExecution |
必须满足的硬性规则 |
preferredDuringSchedulingIgnoredDuringExecution |
尽量满足的软性规则 |
污点 & 容忍参数
| 参数 | 说明 |
|---|---|
key |
污点的键(Label Key) |
value |
污点的值 |
effect |
污点的影响(NoSchedule、PreferNoSchedule、NoExecute) |
operator |
匹配方式(Equal 或 Exists) |
5. 总结
- 亲和性和反亲和性 控制 Pod 选择哪些节点进行调度。
- 污点和容忍 允许管理员 限制某些 Pod 运行在特定的节点上,提高资源管理灵活性。
- 这些调度机制可以 结合使用,提高 Kubernetes 集群的稳定性和资源利用率。
在生产环境中,可以根据业务需求 合理设置亲和性、反亲和性、污点和容忍机制,以优化 Kubernetes 集群的调度策略。