CKA [Workoad] – 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评论