浅聊 Affinity,就这么点东西
在 Kubernetes 中,Affinity 是指用于控制 Pod 调度的策略,包括亲和性(Affinity)和反亲和性(Anti-Affinity)2种。
亲和性(Affinity)包括 NodeAffinity 和 PodAffinity 2种。
- 亲和性(Affinity)表示 Pod 需要部署在哪些节点上,比如需要部署在某些特定的节点或者跟其他某些节点上的 Pod 在同一个节点上。
- NodeAffinity:用于将 Pod 调度到特定的节点上,可以指定 Pod 可调度的节点的标签要求。nodeAffinity 又包含以下两个方面:
-
硬亲和 requiredDuringSchedulingIgnoredDuringExecution:表示 Pod 只能调度到满足指定标签要求的节点上。
- 软亲和 preferredDuringSchedulingIgnoredDuringExecution:表示如果有多个节点同时满足指定标签要求,优先调度 Pod 到这些节点上。
-
- PodAffinity:用于将 Pod 部署到与其他 Pod 所在节点相同的节点上,可以指定其他 Pod 的标签要求。podAffinity 包含以下三个方面:
-
requiredDuringSchedulingIgnoredDuringExecution:表示 Pod 只能调度到其他 Pod 所在节点上,这些节点需要满足指定标签的要求。
-
preferredDuringSchedulingIgnoredDuringExecution:表示 Pod 优先调度到其他 Pod 所在节点上,这些节点需要满足指定标签的要求。
- requiredDuringSchedulingRequiredDuringExecution:表示 Pod 必须调度到与其他 Pod 所处节点相同的节点上
-
- NodeAffinity:用于将 Pod 调度到特定的节点上,可以指定 Pod 可调度的节点的标签要求。nodeAffinity 又包含以下两个方面:
- 反亲和性(Anti-Affinity)与亲和性则相反,表示 Pod 不能部署在哪些节点上,如不能与某些特定的节点或者跟某些 Pod 在同一个节点上。
nodeAffinity 中的硬亲和和反亲和分别表示要求 Pod 与指定标签的节点具有亲和或反亲和关系,简单来说,要求 Pod 部署在哪个 Node 上。
具体来说,硬亲和性要求 Pod 必须部署到具有指定标签的节点上。可以通过 nodeSelector 和 nodeSelectorTerms 字段来实现节点的标记和选择,以满足硬亲和关系的要求。
反亲和性则是要求 Pod 不能部署到一些指定的节点上(即与这些节点具有反亲和关系)。这一方面可以通过 nodeSelector 和 nodeSelectorTerms 字段实现标记和选择,另一方面也可以使用 requiredDuringSchedulingIgnoredDuringExecution 字段,来具体指定不能部署的节点。
需要注意的是,硬亲和性要求必须严格满足,否则 Pod 无法运行。而反亲和性的要求可以松散,即如果没有指定标签的节点可用,Pod 仍可部署到该节点上。