CKA – NodeAffinity的使用

在 Kubernetes 中,nodeSelectornodeAffinity(节点亲和性)都属于将 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-west1us-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"

Loading

Facebook评论