Kubernetes 是一个容器编排平台,可以部署和管理大规模容器应用。而亲和性策略(Affinity)则是 Kubernetes 调度器(Scheduler)的一个功能,允许你控制 Pod 在哪些节点上运行。本文将介绍 Kubernetes 中亲和性策略的使用方法和指导意义,并提供示例代码供读者使用。
亲和性策略介绍
亲和性策略是一种调度策略,控制 Pod 应该被调度到哪些节点上。它可以被用于解决高可用性和负载均衡的问题。亲和性策略分为软亲和性和硬亲和性两种类型。软亲和性表示比较喜欢调度到指定的节点上,但不是必须的,硬亲和性则表示必须调度到指定的节点上。
在 Kubernetes 中,亲和性策略可以通过 nodeSelector 和 affinity 两个字段来指定。其中,nodeSelector 更为简单,只能用于硬亲和性,而 affinity 则可以更加自由的指定亲和性策略,包括软硬亲和性、反亲和性和拒绝亲和性等策略。
nodeSelector
nodeSelector 是最基础的节点选择器。它可以用于限制 Pod 的调度只在一个特定的节点上运行。下面是一个 nodeSelector 的示例代码:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ------------------ ----- ----------- - ----- ------------------ ------ ------- ------------- ----- -----
上述代码中,Pod 被调度到了 nodeSelector 中 type 属性为 hello 的节点上。
affinity
affinity 具有比 nodeSelector 更丰富的功能。affinity 可以用多种方式创建亲和性策略,包括 nodeAffinity、podAffinity 和 podAntiAffinity 三个属性。其中,nodeAffinity 可以控制节点的亲和性,podAffinity 和 podAntiAffinity 可以控制 Pod 之间的亲和性。
nodeAffinity
nodeAffinity 可以分为 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两大类。其中,required 表示必须运行在符合条件的节点上,而 preferred 表示优先运行在符合条件的节点上,但没有符合条件的节点时尝试在其他节点上运行。下面是一个 nodeAffinity 的示例代码:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------------------ ----- --------- - --------- ------------ ---- ------------------ --------- --------- ------- ---- ------------------ ----- --------- ------------- ----------------------------------------------- ------------------ - ----------------- - ---- ---------------------- --------- -- ------- - -----
上述代码中,Pod 被调度到了 kubernetes.io/hostname 为 node1 的节点上。如果没有符合条件的节点,Pod 将无法启动。
podAffinity
podAffinity 能够作用于同一个 Pod。即,可以让同一个 Pod 的部分容器运行在同一个节点上。可以通过 preferredDuringSchedulingIgnoredDuringExecution 或 requiredDuringSchedulingIgnoredDuringExecution 指定 Pod 的亲和性策略。下面是一个 podAffinity 的示例代码:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ----------------- ----- --------- - --------- ------------ ---- ----------------- --------- --------- ------- ---- ----------------- ----- --------- ------------ ----------------------------------------------- - -------------- ----------------- - ---- --- --------- -- ------- - ------------------ ------------ ---------------------- ----------- - ----- ----------------- ------ -------
上述代码中,Pod 被调度到了与 labelSelector 匹配的 Pod 的节点上。换句话说,就是与 labelSelector 匹配的 Pod 尽量在同一个节点上。
podAntiAffinity
podAntiAffinity 则与 podAffinity 相反,表示不能让同一个 Pod 的部分容器运行在同一个节点上。也可以通过 preferredDuringSchedulingIgnoredDuringExecution 或 requiredDuringSchedulingIgnoredDuringExecution 指定 Pod 的亲和性策略。下面是一个 podAntiAffinity 的示例代码:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- --------------------- ----- --------- - --------- ------------ ---- --------------------- --------- --------- ------- ---- --------------------- ----- --------- ---------------- ----------------------------------------------- - -------------- ----------------- - ---- --- --------- -- ------- - ------------------ ------------ ---------------------- ----------- - ----- --------------------- ------ -------
上述代码中,Pod 被调度到了不与 labelSelector 匹配的 Pod 的节点上。换句话说,就是不能与 labelSelector 匹配的 Pod 在同一个节点上运行。
总结
在 Kubernetes 中,亲和性策略是一种非常灵活和重要的调度策略。它可以用于优化 Pod 的调度和部署,提升应用的高可用性和负载均衡性。通过熟练掌握亲和性策略的用法并灵活应用,可以大大提高 Kubernetes 的工作效率。
示例代码
示例代码已在文章中给出。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6455f9c6968c7c53b094b371