目录

  • 一、亲和性(Affinity)
    • 1. 节点亲和性(Node Affinity)
    • 2. Pod 亲和性(Pod Affinity/Anti-Affinity)
  • 二、反亲和性(Anti-Affinity)

在 Kubernetes (k8s) 中,亲和性和反亲和性(有时统称为“节点亲和性”)是一种高级调度策略,用于控制 Pod 在集群内的节点分布。通过定义亲和性和反亲和性规则,管理员可以确保Pod被调度到符合特定条件的节点上,或者避免调度到不符合条件的节点,从而实现资源优化、性能提升、故障隔离以及满足特定的合规或业务需求。

一、亲和性(Affinity)

亲和性是指在调度过程中,Pod 倾向于被安排到符合特定条件的节点上。这些条件可以基于节点的标签(label)、拓扑属性(如区域、可用区、机架等)、以及其他 Pod 的存在状态等因素。Kubernetes 提供了两种类型的亲和性规则:

1. 节点亲和性(Node Affinity)

  • 必需的节点亲和性(RequiredDuringSchedulingIgnoredDuringExecution)
    这种规则是硬性约束,如果集群内没有满足条件的节点,Pod 将不会被调度,而是保持在待调度(Pending)状态。例如,确保某个应用的 Pod 必须部署在标记有特定标签(如node-type=high-memory)的节点上。

  • 首选的节点亲和性(PreferredDuringSchedulingIgnoredDuringExecution)
    这种规则是软性偏好,调度器会尽可能地满足,但即使没有符合规则的节点,Pod 仍可能被安排到其他节点上。例如,优先将某个服务的 Pod 调度到具有特定标签(如location=us-west)的节点,但在该区域节点资源不足时,允许调度到其他区域。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
            - key: node-type
              operator: In
              values:
                - high-memory
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          preference:
            matchExpressions:
              - key: location
                operator: In
                values:
                  - us-west

2. Pod 亲和性(Pod Affinity/Anti-Affinity)

  • Pod 亲和性使得一个 Pod 倾向于与其具有相同标签选择器的其他 Pod 安排在同一节点(或同一拓扑域),或者与具有特定标签的已运行 Pod 靠近。这有助于保持相关工作负载的紧密耦合,比如将微服务的多个组件部署在一起以减少网络延迟。

  • Pod 反亲和性则相反,它确保一个 Pod 不与具有特定标签的已运行 Pod 安排在同一节点(或同一拓扑域),从而实现故障隔离或资源分散。例如,避免在同一节点上部署两个消耗大量内存的应用实例。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: app
                operator: In
                values:
                  - my-app
          topologyKey: kubernetes.io/hostname
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: app
                  operator: NotIn
                  values:
                    - my-other-app
            topologyKey: kubernetes.io/zone

二、反亲和性(Anti-Affinity)

反亲和性则是指在调度过程中,Pod 偏好于被安排到不符合特定条件的节点上,即避免与某些节点或已运行的 Pod 放置在一起。反亲和性通常用于实现以下目的:

  • 故障隔离:避免将所有副本或相关服务的实例部署在同一节点或同一可用区,以降低单点故障的风险。
  • 资源隔离或竞争:防止资源消耗相似的 Pod 集中在一个节点上,导致资源争抢或过度使用。
  • 数据本地化:对于依赖特定硬件设备或需要低延迟访问共享存储的应用,确保它们分布在不同节点上以避免资源冲突。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐