Kubernetes中亲和性(Affinity)和反亲和性(Anti-Affinity)介绍
在 Kubernetes (k8s) 中,亲和性和反亲和性(有时统称为“节点亲和性”)是一种高级调度策略,用于控制 Pod 在集群内的节点分布。通过定义亲和性和反亲和性规则,管理员可以确保Pod被调度到符合特定条件的节点上,或者避免调度到不符合条件的节点,从而实现资源优化、性能提升、故障隔离以及满足特定的合规或业务需求。
目录
- 一、亲和性(Affinity)
- 1. 节点亲和性(Node Affinity)
- 2. Pod 亲和性(Pod Affinity/Anti-Affinity)
- 二、反亲和性(Anti-Affinity)
在 Kubernetes (k8s) 中,亲和性和反亲和性(有时统称为“节点亲和性”)是一种高级调度策略,用于控制 Pod 在集群内的节点分布。通过定义亲和性和反亲和性规则,管理员可以确保Pod被调度到符合特定条件的节点上,或者避免调度到不符合条件的节点,从而实现资源优化、性能提升、故障隔离以及满足特定的合规或业务需求。
一、亲和性(Affinity)
亲和性是指在调度过程中,Pod 倾向于被安排到符合特定条件的节点上。这些条件可以基于节点的标签(label)、拓扑属性(如区域、可用区、机架等)、以及其他 Pod 的存在状态等因素。Kubernetes 提供了两种类型的亲和性规则:
1. 节点亲和性(Node Affinity)
-
必需的节点亲和性(RequiredDuringSchedulingIgnoredDuringExecution)
这种规则是硬性约束,如果集群内没有满足条件的节点,Pod 将不会被调度,而是保持在待调度(Pending)状态。例如,确保某个应用的 Pod 必须部署在标记有特定标签(如node-type=high-memory
)的节点上。 -
首选的节点亲和性(PreferredDuringSchedulingIgnoredDuringExecution)
这种规则是软性偏好,调度器会尽可能地满足,但即使没有符合规则的节点,Pod 仍可能被安排到其他节点上。例如,优先将某个服务的 Pod 调度到具有特定标签(如location=us-west
)的节点,但在该区域节点资源不足时,允许调度到其他区域。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values:
- high-memory
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: location
operator: In
values:
- us-west
2. Pod 亲和性(Pod Affinity/Anti-Affinity)
-
Pod 亲和性使得一个 Pod 倾向于与其具有相同标签选择器的其他 Pod 安排在同一节点(或同一拓扑域),或者与具有特定标签的已运行 Pod 靠近。这有助于保持相关工作负载的紧密耦合,比如将微服务的多个组件部署在一起以减少网络延迟。
-
Pod 反亲和性则相反,它确保一个 Pod 不与具有特定标签的已运行 Pod 安排在同一节点(或同一拓扑域),从而实现故障隔离或资源分散。例如,避免在同一节点上部署两个消耗大量内存的应用实例。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: NotIn
values:
- my-other-app
topologyKey: kubernetes.io/zone
二、反亲和性(Anti-Affinity)
反亲和性则是指在调度过程中,Pod 偏好于被安排到不符合特定条件的节点上,即避免与某些节点或已运行的 Pod 放置在一起。反亲和性通常用于实现以下目的:
- 故障隔离:避免将所有副本或相关服务的实例部署在同一节点或同一可用区,以降低单点故障的风险。
- 资源隔离或竞争:防止资源消耗相似的 Pod 集中在一个节点上,导致资源争抢或过度使用。
- 数据本地化:对于依赖特定硬件设备或需要低延迟访问共享存储的应用,确保它们分布在不同节点上以避免资源冲突。
更多推荐
所有评论(0)