k8s 亲和性之Affinity

文章目录

      • [1. Node Affinity(节点亲和性)](#1. Node Affinity(节点亲和性))
      • [2. Pod Affinity 和 Pod Anti-Affinity](#2. Pod Affinity 和 Pod Anti-Affinity)
        • [Pod Affinity 配置示例](#Pod Affinity 配置示例)
        • [Pod Anti-Affinity 配置示例](#Pod Anti-Affinity 配置示例)
        • 常见场景:
      • [3. 亲和性规则概述](#3. 亲和性规则概述)
      • [4. 亲和性和反亲和性的细节](#4. 亲和性和反亲和性的细节)
      • [5. 亲和性配置的示例](#5. 亲和性配置的示例)
        • [Pod 与 Node Affinity](#Pod 与 Node Affinity)
        • [Pod 与 Pod Affinity](#Pod 与 Pod Affinity)
      • 总结

在 Kubernetes 中,亲和性(Affinity)是一个强大的调度机制,用于控制 Pod 调度到哪些节点或与哪些其他 Pods 一起运行。亲和性帮助你在 Kubernetes 集群中实现更灵活、更高效的资源调度,支持多种不同的场景,如负载均衡、资源隔离、容错等。

亲和性有两种类型:

  1. Node Affinity(节点亲和性)
  2. Pod Affinity 和 Pod Anti-Affinity(Pod 亲和性与反亲和性)

1. Node Affinity(节点亲和性)

Node Affinity 用于约束 Pod 可以调度到哪些节点。它是 nodeSelector 的扩展,提供了更灵活的匹配机制。通过设置节点亲和性,Pod 可以根据节点的标签来选择适合的节点进行调度。

节点亲和性类型

Node Affinity 分为两种类型:

  • requiredDuringSchedulingIgnoredDuringExecution:在调度时必须满足的条件,意味着如果节点不满足这些条件,Pod 就无法调度到该节点。
  • preferredDuringSchedulingIgnoredDuringExecution:调度时尽量满足的条件,但如果无法满足条件,Pod 仍然会被调度到其他节点。
配置示例
yaml 复制代码
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: "kubernetes.io/hostname"
              operator: In
              values:
                - node-1
                - node-2
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
            - key: "disk"
              operator: In
              values:
                - ssd
  • requiredDuringSchedulingIgnoredDuringExecution:指定节点必须满足的条件。在这个例子中,Pod 只能调度到 node-1node-2 节点上。
  • preferredDuringSchedulingIgnoredDuringExecution:表示推荐的调度优先条件。在这个例子中,节点如果具有 disk=ssd 标签,会更倾向于调度,但不是强制要求。
常见场景:
  • 资源约束:需要特定硬件(例如 GPU 或 SSD 硬盘)的 Pod 必须调度到支持该硬件的节点。
  • 环境隔离:将某些 Pods 部署到特定的可用区或区域,例如将数据库 Pod 放到具有高内存节点的区域。

2. Pod Affinity 和 Pod Anti-Affinity

Pod AffinityPod Anti-Affinity 控制 Pod 如何与其他 Pods 一起调度。它们允许你根据其他 Pods 的位置来影响当前 Pod 的调度。

  • Pod Affinity(Pod 亲和性):表示你希望某个 Pod 与其他特定 Pod 在同一节点上调度。例如,如果你希望某些 Pods 共享同一个节点,以便它们之间有低延迟的通信,可以使用 Pod 亲和性。

  • Pod Anti-Affinity(Pod 反亲和性):与 Pod 亲和性相反,表示你希望某些 Pod 不与其他特定 Pod 在同一节点上调度。例如,如果你希望某些 Pod 避免在同一节点上运行,以确保高可用性或隔离性,可以使用 Pod 反亲和性。

Pod Affinity 配置示例
yaml 复制代码
affinity:
  podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: myapp
        topologyKey: "kubernetes.io/hostname"

这个例子表示,如果节点上有 app=myapp 标签的 Pod,则会优先调度当前 Pod 到同一节点上。topologyKey 是用来定义约束的范围,kubernetes.io/hostname 表示节点级别的约束。

Pod Anti-Affinity 配置示例
yaml 复制代码
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: myapp
        topologyKey: "kubernetes.io/hostname"

这个例子表示,如果节点上已经有 app=myapp 标签的 Pod,新的 Pod 就不会被调度到该节点上。

常见场景:
  • Pod Affinity

    • 将需要高频通信的 Pods 部署到同一节点,以减少网络延迟。例如,在微服务架构中,前端和后端服务可以被调度到相同节点上以提高通信效率。
  • Pod Anti-Affinity

    • 确保多个副本的 Pods 不会被调度到同一节点,以避免单点故障。例如,确保多个数据库副本的 Pods 分布在不同的节点上,以提高容错性。

3. 亲和性规则概述

亲和性规则的配置可以在 Pod 的 affinity 字段中指定,通常包括以下几个部分:

  • requiredDuringSchedulingIgnoredDuringExecution :表示在 Pod 调度时必须满足的条件。可以用 nodeAffinitypodAffinitypodAntiAffinity 来定义。
  • preferredDuringSchedulingIgnoredDuringExecution:表示尽量满足的条件,如果不满足,也不会阻止调度,但会影响调度优先级。
  • topologyKey :用于定义约束的范围,例如使用 kubernetes.io/hostname 来指定节点级别的约束,或者使用可用区等来实现跨区域调度。

4. 亲和性和反亲和性的细节

  • topologyKey :决定了亲和性约束的范围。常见的 topologyKey 值有:

    • kubernetes.io/hostname:表示节点级别的亲和性。
    • failure-domain.beta.kubernetes.io/zone:表示区域级别的亲和性,用于跨区域调度。
    • topology.kubernetes.io/region:表示区域级别的亲和性,用于跨区域调度。
  • operator:用于匹配条件的操作符,常见的有:

    • In:匹配指定的值。
    • NotIn:排除指定的值。
    • Exists:仅匹配标签存在的节点或 Pod。
    • DoesNotExist:仅匹配标签不存在的节点或 Pod。

5. 亲和性配置的示例

Pod 与 Node Affinity

将一个 Pod 调度到具有特定标签的节点上:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
            - key: "disktype"
              operator: In
              values:
                - ssd

这个例子要求 Pod 被调度到 disktype=ssd 的节点上。

Pod 与 Pod Affinity

将某个 Pod 调度到有特定标签的 Pod 所在的节点:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app: myapp
          topologyKey: "kubernetes.io/hostname"

这个配置要求将 Pod 调度到与标签为 app=myapp 的 Pod 相同节点上。

总结

Kubernetes 中的亲和性(Affinity)机制提供了灵活的调度策略,帮助我们实现更高效的资源利用、负载均衡、故障隔离等。通过结合 Node AffinityPod Affinity/Anti-Affinity,你可以精细地控制 Pod 的调度行为,满足不同应用场景的需求。

相关推荐
啟明起鸣1 分钟前
【Go 与云原生】先从 Go 对与云原生的依赖关系讲起,再讲讲 一个简单的 Go 项目热热身
开发语言·云原生·golang
@不会写代码的小张38 分钟前
传统的企业服务如何部署在k8s集群中
云原生·容器·kubernetes
Juchecar3 小时前
超越经典23种设计模式:新模式、反模式与函数式编程
设计模式·云原生·函数式编程
深蓝电商API4 小时前
云原生爬虫:使用Docker和Kubernetes部署与管理分布式爬虫集群
docker·kubernetes
啟明起鸣5 小时前
【Go 与云原生】让一个 Go 项目脱离原生的操作系统——我们开始使用 Docker 制造云容器进行时
docker·云原生·golang
橙色云-智橙协同研发11 小时前
【PLM实施专家宝典】离散制造企业MBD与无纸化制造实施方案:从“图纸驱动”到“数据驱动”的革命
云原生·解决方案·数字化转型·plm·国产plm·专家经验·无纸化
victory043112 小时前
K8S重启之后无法启动故障排查 与 修复
云原生·容器·kubernetes
研究司马懿14 小时前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
java_logo14 小时前
SGLANG Docker容器化部署指南
linux·运维·docker·容器·eureka·1024程序员节
Qayrup15 小时前
各个系统的 docker安装
运维·docker·容器