接上文写的Node亲和性调度https://blog.youkuaiyun.com/soso678/article/details/144777397
Pod 间的亲和性和反亲和性(Affinity/AntiAffinity)调度
Pod 间亲和性与反亲和性使你可以基于已经在节点上运行的 Pod 的标签来约束 Pod 可以调度到的节点,而不是基于节点上的标签。
2.1.Pod 亲和性核心概念
Pod 亲和性用于定义 Pod 之间的调度规则,确保某些 Pod 靠近运行(亲和性)或远离运行(反亲和性)。典型场景包括:
- 亲和性:将同一服务的多个 Pod 调度到同一区域(减少网络延迟)。
- 反亲和性:避免同一服务的 Pod 集中在同一节点(提高容灾能力)。
2.1.1核心配置参数
-
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。
2.2.pod的亲和性
Pod亲和性场景,k8s集群的节点分布在不同的区域或者不同的机房,当服务A和服务B要求部署在同一个区域或者同一机房的时候,我们就需要亲和性调度了
[root@master nodeaffinity]# cd ..
[root@master Affinity]# mkdir podaffinity
[root@master Affinity]# cd podaffinity/
[root@master podaffinity]# cat pod-required-affinity.yaml
apiVersion: v1 #先创建一个pod,随机调度
kind: Pod
metadata:
name: pod-1
labels:
app: myapp
tier: frontend
spec:
containers:
- name: redis
image: redis
imagePullPolicy: IfNotPresent
ports:
- containerPort: 637