Kubernetes节点亲和性
外观
Kubernetes节点亲和性[编辑 | 编辑源代码]
节点亲和性(Node Affinity)是Kubernetes中一种调度机制,允许用户指定Pod应该运行在哪些节点上。它通过定义规则来匹配节点的标签(Labels),从而影响Pod的调度决策。节点亲和性提供了比传统的nodeSelector更灵活、更强大的控制方式,支持复杂的逻辑表达式和软性约束(preferred)与硬性约束(required)。
基本概念[编辑 | 编辑源代码]
节点亲和性通过两种主要方式实现:
- requiredDuringSchedulingIgnoredDuringExecution(硬性规则):Pod必须部署在满足条件的节点上,否则无法调度。
- preferredDuringSchedulingIgnoredDuringExecution(软性规则):调度器优先选择满足条件的节点,但不强制。
节点亲和性 vs. nodeSelector[编辑 | 编辑源代码]
特性 | nodeSelector | 节点亲和性 |
---|---|---|
语法复杂度 | 简单键值匹配 | 支持复杂表达式(In、NotIn、Exists等) |
约束类型 | 仅硬性约束 | 支持硬性和软性约束 |
灵活性 | 低 | 高 |
语法与示例[编辑 | 编辑源代码]
节点亲和性规则在Pod的spec.affinity.nodeAffinity字段中定义。
硬性约束示例[编辑 | 编辑源代码]
以下示例要求Pod必须运行在带有标签disktype=ssd的节点上:
apiVersion: v1
kind: Pod
metadata:
name: nginx-ssd
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
软性约束示例[编辑 | 编辑源代码]
以下示例优先选择带有gpu=true标签的节点,但不强制:
apiVersion: v1
kind: Pod
metadata:
name: nginx-gpu-preferred
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: gpu
operator: In
values:
- "true"
containers:
- name: nginx
image: nginx
运算符说明[编辑 | 编辑源代码]
Kubernetes支持以下运算符:
- In:标签值在指定列表中
- NotIn:标签值不在指定列表中
- Exists:节点必须包含该标签(不检查值)
- DoesNotExist:节点不得包含该标签
- Gt、Lt:数值比较(适用于整数标签)
实际案例[编辑 | 编辑源代码]
场景:混合环境调度[编辑 | 编辑源代码]
假设集群中有以下节点:
- 节点A:env=prod, zone=us-east-1
- 节点B:env=dev, zone=us-west-2
需要将生产环境的Pod调度到env=prod且区域为us-east-1或us-east-2的节点:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values: ["prod"]
- key: zone
operator: In
values: ["us-east-1", "us-east-2"]
权重分配示例[编辑 | 编辑源代码]
对应YAML配置:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80
preference:
matchExpressions:
- key: gpu
operator: In
values: ["true"]
- weight: 20
preference:
matchExpressions:
- key: ssd
operator: In
values: ["true"]
数学表达[编辑 | 编辑源代码]
软性约束的最终节点评分计算公式: 其中:
- 为1(匹配)或0(不匹配)
- 是用户定义的权重值
最佳实践[编辑 | 编辑源代码]
1. 硬性约束可能导致Pod无法调度,建议与软性约束结合使用 2. 避免过度使用节点亲和性,可能降低集群利用率 3. 结合Pod间亲和性(Pod Affinity)实现更复杂的调度策略 4. 使用kubectl describe nodes查看节点标签
常见问题[编辑 | 编辑源代码]
Q:节点亲和性与污点/容忍度有什么区别?
- 节点亲和性是"吸引"Pod到特定节点
- 污点/容忍度是"排斥"Pod从特定节点
Q:如何检查节点标签?
kubectl get nodes --show-labels