在 Kubernetes 集群中,Pod 亲和性(Affinity)和反亲和性(Anti-Affinity)是高级调度策略,用于精细控制 Pod 的分布,从而优化资源使用、降低延迟并提升服务可靠性。本文系统讲解两者的概念、应用场景与核心配置参数。Pod 亲和性(靠近运行)包括节点亲和性(根据节点标签调度)和 Pod 亲和性(与特定 Pod 共同部署),适用于需要低延迟协作的服务(如数据库与 Web 服务器)。Pod 反亲和性(远离运行)避免同类 Pod 集中于同一节点,适用于高可用部署,防止单点故障。核心配置参数详解:requiredDuringSchedulingIgnoredDuringExecution(硬性要求,不满足则无法调度)、preferredDuringSchedulingIgnoredDuringExecution(软性偏好,优先尝试但不强制)、topologyKey(定义拓扑域,如 kubernetes.io/hostname、failure-domain.beta.kubernetes.io/zone)、labelSelector(通过 matchLabels 匹配目标 Pod 标签)。
本文适用于需要深入理解 Kubernetes 调度策略的运维与开发人员。
Pod亲和性允许你指定规则,使Pod更倾向于调度到满足特定条件的节点或与其他Pod共同部署。它包括:
应用场景:
麻瓜说法:
Pod反亲和性是指Pod与其他不符合特定条件的Pod避免同一节点部署。这通常用于提高系统的高可用性,防止Pod因节点故障或资源竞争而影响服务。
应用场景:
麻瓜说法:
硬性要求:必须满足的条件,否则 Pod 无法调度。Pod必须与目标pod部署在同一个拓扑域,否则无法调度
软性偏好:调度器会优先尝试将Pod与目标pod部署在同一个拓扑域,但不强制。
yamlapiVersion: 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 # 拓扑域,同一个节点


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