在 Kubernetes 中,亲和力(Affinity)和非亲和力(Anti-Affinity)是用于控制 Pod 调度策略的机制,它们可以帮助优化资源利用率、提高应用性能和可用性。以下是亲和力和非亲和力的详细解释:
亲和力(Affinity)
亲和力允许用户定义规则,指定 Pod 应该被调度到哪些节点上。亲和力分为两种类型:
节点亲和力(Node Affinity)
定义:节点亲和力允许用户通过节点的标签来指定 Pod 应该被调度到哪些节点上。
作用:可以提高资源利用率、优化性能。
Node亲和力允许你指定Pod应该被调度到具有特定标签的节点上。它分为两种类型:
requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则,否则Pod不会被调度。
preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则,但不是必须的。
示例:
bash
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: color
operator: In
values:
- blue
- green
这个例子表示 Pod 只会被调度到标签为 color=blue 或 color=green 的节点上。
Pod 亲和力(Pod Affinity)
定义:Pod 亲和力允许用户通过其他 Pod 的标签来指定 Pod 应该被调度到哪些节点上。
作用:可以确保相关 Pod 被调度到同一节点或相近的节点上,从而减少网络延迟。
Pod亲和力允许你指定Pod应该与其他具有特定标签的Pod共同部署在同一个节点上。它同样分为两种类型:
requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则。
preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则。
示例:
bash
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname
这个例子表示 Pod 只会被调度到已经运行了标签为 app=web 的其他 Pod 的节点上。
详细解释
1.affinity
含义:定义 Pod 的亲和力和非亲和力策略。
作用:用于控制 Pod 的调度行为,确保 Pod 被调度到满足特定条件的节点上。
- podAffinity
含义:定义 Pod 的亲和力策略。
作用:确保 Pod 与某些其他 Pod 调度到同一节点或相近的节点上。
- requiredDuringSchedulingIgnoredDuringExecution
含义:表示这个亲和力规则在调度期间是必须满足的,但在执行期间可能会被忽略。
作用:确保在调度时,Pod 只会被调度到满足条件的节点上。如果节点上的条件在运行时发生变化,这个规则可能会被忽略。
- labelSelector
含义:定义标签选择器,用于选择其他 Pod。
作用:通过标签选择器,指定哪些 Pod 是我们关心的。
- matchExpressions
含义:定义匹配表达式,用于选择满足特定条件的 Pod。
作用:通过匹配表达式,指定哪些 Pod 是我们想要与当前 Pod 调度到同一节点上的。
- key 和 operator
key:标签的键。
operator:匹配操作符,可以是 In、NotIn、Exists、DoesNotExist 等。
values:标签的值列表。
- topologyKey
含义:定义拓扑域的键。
作用:指定在哪个拓扑域内应用亲和力策略。常见的拓扑键包括:
kubernetes.io/hostname:表示节点的主机名。
failure-domain.beta.kubernetes.io/zone:表示可用区。
failure-domain.beta.kubernetes.io/region:表示区域。
非亲和力(Anti-Affinity)
非亲和力允许用户定义规则,指定 Pod 不应该被调度到哪些节点上。非亲和力也分为两种类型:
节点非亲和力(Node Anti-Affinity)
定义:节点非亲和力允许用户通过节点的标签来指定 Pod 不应该被调度到哪些节点上。
作用:可以提高容错性、确保资源隔离。
Node亲和力允许你指定Pod应该被调度到具有特定标签的节点上。它分为两种类型:
requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则,否则Pod不会被调度。
preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则,但不是必须的。
示例:
bash
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: color
operator: NotIn
values:
- yellow
这个例子表示 Pod 不会被调度到标签为 color=yellow 的节点上。
Pod 非亲和力(Pod Anti-Affinity)
定义:Pod 非亲和力允许用户通过其他 Pod 的标签来指定 Pod 不应该被调度到哪些节点上。
作用:可以确保相关 Pod 不被调度到同一节点或相近的节点上,从而提高可用性。
Pod亲和力允许你指定Pod应该与其他具有特定标签的Pod共同部署在同一个节点上。它同样分为两种类型:
requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则。
preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则。
示例:
bash
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- db
topologyKey: kubernetes.io/hostname
这个例子表示 Pod 不会被调度到已经运行了标签为 app=db 的其他 Pod 的节点上。
详细解释
1.affinity
含义:定义 Pod 的亲和力和非亲和力策略。
作用:用于控制 Pod 的调度行为,确保 Pod 被调度到满足特定条件的节点上,或者避免被调度到某些节点上。
2.podAntiAffinity
含义:定义 Pod 的非亲和力策略。
作用:确保 Pod 不与某些其他 Pod 调度到同一节点或相近的节点上。
3.requiredDuringSchedulingIgnoredDuringExecution
含义:表示这个非亲和力规则在调度期间是必须满足的,但在执行期间可能会被忽略。
作用:确保在调度时,Pod 不会被调度到不符合条件的节点上。如果节点上的条件在运行时发生变化,这个规则可能会被忽略。
4.labelSelector
含义:定义标签选择器,用于选择其他 Pod。
作用:通过标签选择器,指定哪些 Pod 是我们关心的。
5.matchExpressions
含义:定义匹配表达式,用于选择满足特定条件的 Pod。
作用:通过匹配表达式,指定哪些 Pod 是我们想要避免与当前 Pod 调度到同一节点上的。
6.key 和 operator
key:标签的键。
operator:匹配操作符,可以是 In、NotIn、Exists、DoesNotExist 等。
values:标签的值列表。
7.topologyKey
含义:定义拓扑域的键。
作用:指定在哪个拓扑域内应用非亲和力策略。常见的拓扑键包括:
kubernetes.io/hostname:表示节点的主机名。
failure-domain.beta.kubernetes.io/zone:表示可用区。
failure-domain.beta.kubernetes.io/region:表示区域。
查看亲和力设置
要查看Pod的亲和力设置,可以使用kubectl describe pod 命令。这将显示Pod的详细信息,包括其亲和力规则。