“域”是一组主机节点。
没那么简单,如果你说“‘域’是资源的逻辑分组”会更准确。
要正确理解它,您必须首先孤立地理解大多数组件。我首先推荐这些读物:
那么,我们可以从中得出几点:
-
节点不是虚拟机,节点运行在 azure 虚拟机之上。
它们通常具有 1:1 映射,但在某些情况下您可以具有 5:1 节点/VM 映射,例如当您安装本地开发集群时。
-
Azure 虚拟机具有更新域和故障域,Service Fabric 节点具有升级域和故障域
尽管它们看起来相同,但它们也有不同:
故障域:
- VM 故障域是用于物理部署的隔离插槽,这意味着:电源、网络、磁盘等...它们受区域限制。
- SF 故障域是用于应用程序部署的逻辑节点槽,这意味着,当 SF 将应用程序部署到节点时,它将分布在不同的故障域上,为了使它们可靠,大部分时间 FD 将映射到 VM 故障域,但在复杂的场景中,您可以将其映射到任何东西,例如,您可以将整个区域映射到单个 SF FD。
.
更新\升级域:
- VM 更新域是关于 OS\Hardware 补丁和更新,单独的更新域将单独处理,不会同时更新,因此,当需要更新 OS 以关闭您的 VM 时,它们将更新域按域。更新域数量越少意味着更新期间将关闭更多机器。
- SF 升级域使用与虚拟机更新域类似的方法,但侧重于服务和集群升级本身,每次降低每个 UD 的 UD,并在前一个 UD 成功时转移到下一个。
- 在这两种情况下,您都可以将 Update\Upgrade 调整为在升级期间可以关闭多少个 vm\nodes\services 实例 (%)。因此,例如,如果您的服务在具有 5 个 UD 的集群上有 100 个实例,那么 SF 将一次更新 20 个服务,如果您将 UD 的数量增加到 10 个,例如,下降的实例数量将减少到 10 个实例,但是部署应用程序的时间会以同样的比例增加。
基于此,您可以将 FD 和 UP 视为可靠部署插槽的矩阵,您拥有的越多,可靠性就会越高(通过权衡取舍,例如所需的更新时间)。以下示例取自 SF 文档:
Service Fabric,开箱即用会尽最大努力将您的服务实例放在不同的 FD\UD 上,这意味着,如果可能,它们将位于不同的 FD\UD 上,否则它将找到另一个实例数量最少的实例正在部署的服务。
关于 Kubernetes:
在 Kubernetes 上,这些功能并不是开箱即用的,k8s 有zones 的概念,但是根据文档,它们受区域限制,不能跨区域。
Kubernetes 会自动将复制控制器或服务中的 pod 分散到单区域集群中的节点(以减少故障的影响)。对于多区域集群,这种传播行为可以跨区域扩展(以减少区域故障的影响)。这是通过 SelectorSpreadPriority 实现的。
这是一个尽力而为的布局,因此如果集群中的区域是异构的(例如,不同数量的节点、不同类型的节点或不同的 pod 资源要求),这可能会阻止您的 pod 跨区域均匀分布.如果需要,您可以使用同质区域(相同数量和类型的节点)来减少不均等传播的可能性。
与FD不同,但概念非常相似。
要实现与 SF 类似的结果,需要跨区域部署集群或将节点映射到 VM FD\UD,以便它们在 SF 上表现为节点。将标签添加到节点以识别这些域。您还需要在不同 FD 上的节点上创建 NodeType 标签,以便您可以将 pod 部署在分隔节点上。
例如:
-
Node01: FD01 : NodeType=FrontEnd
-
Node02: FD02 : NodeType=FrontEnd
-
Node03: FD03 : NodeType=FrontEnd
-
Node04:FD01:NodeType=BackEnd
-
Node05:FD02:NodeType=BackEnd
当您部署应用程序时,您应该使用affinity 功能将 POD 分配给节点,在这种情况下,您的服务将具有:
-
NodeType=FrontEnd 的必需的相似性
-
首选 AntiAfinity 优于 ContainerName=[itself]
通过这些设置,使用亲和和反亲和 k8s 将尝试将容器的副本\实例放在单独的节点上,并且节点将已经被 NoteType 标签分隔的 FD\zone 分隔,然后 k8s 将像 SF 一样处理滚动更新。
因为优先考虑反亲和性规则,k8s 将尽力平衡这些节点,如果没有可用的有效节点,它将开始在已经包含相同容器实例的节点上添加更多实例,
结论
这是一些额外的工作,但与目前在其他解决方案中使用的没有太大区别。
这里主要关注的是在 FD\Zones 上配置节点,在您将节点放置在正确的 FD 上之后,其余的将顺利进行。
在 SF 上,您在 Azure 上部署集群时不必担心这一点,但如果您从头开始,这是一项艰巨的工作,甚至比 k8s 还要大。
注意:如果您使用 AKS,它将跨可用性集(指定 VM 容错域和更新域的集)分布节点。目前,根据this post,AKS 不为您提供区域分发,因此如果您需要此级别的分发,则必须从头开始。