CKA – NodeAffinity的使用
在 Kubernetes 中,nodeSelector
与 nodeAffinity
(节点亲和性)都属于将 Pod 调度到特定节点的手段,但它们在表达能力、灵活性和调度策略上存在显著差异。下面先给出一个概要,然后从概念、语法、软/硬约束、使用场景和示例五个方面详细对比,并给出最佳实践建议。
nodeAffinity
:可选硬约束(requiredDuringSchedulingIgnoredDuringExecution
)和软约束(preferredDuringSchedulingIgnoredDuringExecution
)。
以下是nodeSelector和nodeAffinity的区别

表达能力
nodeSelector
:最简单的键-值严格匹配。只能做 “等于” 判断。nodeAffinity
:支持多种操作符(In、NotIn、Exists、DoesNotExist、Gt、Lt),并可组合多条规则。
约束强度
nodeSelector
:仅有硬约束,若节点不满足,Pod 会一直 Pending。nodeAffinity
:可选硬约束(requiredDuringSchedulingIgnoredDuringExecution
)和软约束(preferredDuringSchedulingIgnoredDuringExecution
)。
应用场景
- 简单场景:节点只有少量标签,且只需单一条件时,用
nodeSelector
足矣。 - 复杂场景:需要多个条件组合、偏好但不强制时,用
nodeAffinity
。
NodeAffinity的2大部署策略
硬约束(Required):requiredDuringSchedulingIgnoredDuringExecution
,不满足则调度失败且不断重试。
软约束(Preferred):preferredDuringSchedulingIgnoredDuringExecution
,调度器会尽量满足,但不满足时仍可调度。
不同策略的使用场景
- 硬约束:安全、合规或硬件依赖场景(如 GPU)。
- 软约束:性能优化或成本权衡(如“尽量跑在空闲节点”)。
使用案例
硬约束和软约束可以同时使用
硬约束:节点 region
必须在 us-west1
或 us-west2
,且 disktype
不能是 hdd
;
软约束:优先选择 CPU 数量大于 4 的节点。
apiVersion: v1
kind: Pod
metadata:
name: analytics
spec:
affinity:
nodeAffinity:
# 硬约束:必须满足
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: region
operator: In
values:
- us-west1
- us-west2
- key: disktype
operator: NotIn
values:
- hdd
# 软约束:优先满足
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 5
preference:
matchExpressions:
- key: cpu
operator: Gt
values:
- "4"
Facebook评论