# Pod亲和性和反亲和性:优化调度与提高可用性
# 简介
在Kubernetes集群中,Pod亲和性(Affinity)和反亲和性(Anti-Affinity)是强大的调度策略,它们帮助管理员控制Pod的分布,从而优化资源使用、提高服务的可靠性,并满足不同应用需求。
# 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。
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 # 拓扑域,同一个节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23