编辑
2025-04-14
云计算-Kubernetes
00
请注意,本文编写于 360 天前,最后修改于 0 天前,其中某些信息可能已经过时。

目录

Pod亲和性(Affinity)==> 靠近运行
Pod反亲和性(Pod Anti-Affinity)==> 远离运行
亲和性案例
软策略(核心配置参数)有哪些?
requiredDuringSchedulingIgnoredDuringExecution
preferredDuringSchedulingIgnoredDuringExecution
topologyKey:定义Pod分布的颗粒度,节点机器的标签的key和value都相等的机器,就是同一个拓扑域。
labelSelector
示例:选择带有 app=myapp 标签的 Pod。

在 Kubernetes 集群中,Pod 亲和性(Affinity)和反亲和性(Anti-Affinity)是高级调度策略,用于精细控制 Pod 的分布,从而优化资源使用、降低延迟并提升服务可靠性。本文系统讲解两者的概念、应用场景与核心配置参数。Pod 亲和性(靠近运行)包括节点亲和性(根据节点标签调度)和 Pod 亲和性(与特定 Pod 共同部署),适用于需要低延迟协作的服务(如数据库与 Web 服务器)。Pod 反亲和性(远离运行)避免同类 Pod 集中于同一节点,适用于高可用部署,防止单点故障。核心配置参数详解:requiredDuringSchedulingIgnoredDuringExecution(硬性要求,不满足则无法调度)、preferredDuringSchedulingIgnoredDuringExecution(软性偏好,优先尝试但不强制)、topologyKey(定义拓扑域,如 kubernetes.io/hostnamefailure-domain.beta.kubernetes.io/zone)、labelSelector(通过 matchLabels 匹配目标 Pod 标签)。

本文适用于需要深入理解 Kubernetes 调度策略的运维与开发人员。

Pod亲和性(Affinity)==> 靠近运行

Pod亲和性允许你指定规则,使Pod更倾向于调度到满足特定条件的节点或与其他Pod共同部署。它包括:

  • 节点亲和性(Node Affinity):根据节点标签调度Pod,可以控制Pod部署到特定硬件配置、区域位置等符合条件的节点上。
  • Pod亲和性(Pod Affinity):允许Pod与满足特定标签的其他Pod共同调度到同一节点或拓扑域,如机架、可用区等。

应用场景:

  • 需要特定硬件资源(如GPU或高CPU)的Pod调度。
  • 高效协作的服务,如数据库与Web服务器,应该放在同一节点,减少通信延迟。

麻瓜说法:

  • 将同一服务的多个 Pod 调度到同一区域(减少网络延迟)

Pod反亲和性(Pod Anti-Affinity)==> 远离运行

Pod反亲和性是指Pod与其他不符合特定条件的Pod避免同一节点部署。这通常用于提高系统的高可用性,防止Pod因节点故障或资源竞争而影响服务。

应用场景:

  • 高可用性部署,确保同类型的服务Pod分布在不同节点或可用区。
  • 防止资源拥挤,保证系统容错性。

麻瓜说法:

  • 避免同一服务的 Pod 集中在同一节点(提高容灾能力)。

亲和性案例

  • 通过Pod亲和性,避免数据库服务实例,分布在多个节点上,减少通信延迟。
  • 通过Pod反亲和性,避免同一节点上的多个Web服务实例,保证高可用性。

软策略(核心配置参数)有哪些?

requiredDuringSchedulingIgnoredDuringExecution

硬性要求:必须满足的条件,否则 Pod 无法调度。Pod必须与目标pod部署在同一个拓扑域,否则无法调度

preferredDuringSchedulingIgnoredDuringExecution

软性偏好:调度器会优先尝试将Pod与目标pod部署在同一个拓扑域,但不强制。

topologyKey:定义Pod分布的颗粒度,节点机器的标签的key和value都相等的机器,就是同一个拓扑域。

  • 拓扑域:定义调度的作用范围(如 zone、rack、hostname)。常见取值范围:
    • kubernetes.io/hostname:同一物理节点。
    • failure-domain.beta.kubernetes.io/zone:同一云服务区域(AWS 的 AZ、GCP 的 Zone)。
    • failure-domain.beta.kubernetes.io/region:同一云服务地区(如 us-east)。
    • 自定义标签:如 rack(机架)、cluster(集群)。

labelSelector

  • 标签选择器:匹配目标 Pod 的标签。

示例:选择带有 app=myapp 标签的 Pod。

yaml
apiVersion: v1 kind: Pod metadata: name: example-pod labels: app: myapp spec: containers: - name: mysql image: mysql:5.7 imagePullPolicy: IfNotPresent ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: Mysql@123456! affinity: podAffinity: # pod的亲和性 requiredDuringSchedulingIgnoredDuringExecution: # 硬亲和 - labelSelector: # pod的标签选择器 matchLabels: # 匹配相应标签 app: myapp # 指定要匹配目标pod的标签 topologyKey: kubernetes.io/hostname # 拓扑域,同一个节点
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Odboy

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC 4.0 BY-SA 许可协议。转载请注明出处!