当前位置: 首页 > 科技观察

《容器云架构》K8s多区域部署

时间:2023-03-12 14:03:58 科技观察

背景Kubernetes的设计使得单个Kubernetes集群可以跨多个故障区域运行,通常在称为区域的逻辑分组中。主要的云提供商将区域定义为一组故障区域(也称为可用性区域),它们提供一组一致的功能:在一个区域内,每个区域都提供相同的API和服务。典型的云架构旨在最大限度地降低一个区域的故障同时损害另一个区域的服务的可能性。控制平面行为支持所有控制平面组件作为可交换资源池运行,每个组件复制一个。部署集群控制平面时,将控制平面组件的副本放置在多个故障区域中。如果可用性是一个重要问题,请选择至少三个故障区域并在至少三个故障区域中复制每个单独的控制平面组件(API服务器、调度程序、etcd、集群控制器管理器)。如果您正在运行云控制器管理器,那么您还应该在您选择的所有故障区域中复制它。注意:Kubernetes不为API服务器端点提供跨区域弹性。您可以使用各种技术来提高集群API服务器的可用性,包括DNS循环、SRV记录或带有健康检查的第三方负载平衡解决方案。节点行为Kubernetes自动将工作负载资源(例如部署或状态集)的pod分布到集群中的不同节点。这种传播有助于减少故障的影响。当一个节点启动时,每个节点上的kubelet会自动为节点对象添加一个标签,在KubernetesAPI中代表一个特定的kubelet。这些标签可以包含区域信息。如果您的集群跨越多个可用区或区域,您可以将节点标签与Pod拓扑扩展约束结合使用,以控制Pod如何跨集群跨故障域(可用区、区域甚至特定节点)扩展。这些提示使调度程序能够放置pod以获得更好的预期可用性,从而降低影响整个工作负载的相关故障的风险。例如,你可以设置一个约束来确保StatefulSet的3个副本都在彼此不同的区域运行,只要这是可行的。您可以以声明方式定义它,而无需明确定义每个工作负载使用哪个可用区。跨区域分布节点Kubernetes的核心不会为您创建节点;您需要自己创建节点,或者使用集群API之类的工具来代表您管理节点。使用ClusterAPI等工具,您可以定义作为集群的工作节点运行的机器集,这些机器跨多个故障域,以及在整个区域停止服务时自动修复集群的规则。Pod的手动区域分配可以将节点选择器约束应用于创建的Pod,以及工作负载资源(如部署、状态集或作业)中的Pod模板。区域的存储访问创建持久卷时,PersistentVolumeLabel准入控制器会自动将区域标签添加到链接到特定区域的任何持久卷。然后,调度程序通过其NoVolumeZoneConflict谓词确保声明给定PersistentVolume的pod仅放置在与该卷相同的区域中。您可以为PersistentVolumeClaimes指定一个StorageClass,它指定该类中的存储可能使用的故障域(区域)。要了解如何配置故障域或区域感知的StorageClass,请参阅允许的拓扑。网络Kubernetes本身不包括区域感知网络。您可以使用网络插件配置集群网络,网络解决方案可能具有特定于区域的元素。例如,如果您的云提供商支持type=LoadBalancer的服务,则负载均衡器可能只会将流量发送到与处理给定连接的负载均衡器元素在同一区域中运行的pod。有关详细信息,请查看您的云提供商的文档。对于自定义或内部部署,需要考虑类似的问题。服务和入口行为(包括处理不同的故障区域)确实会根据集群的设置方式而有所不同。故障恢复在设置集群时,您可能还需要考虑如果一个区域中所有故障区域同时离线,设置是否以及如何恢复服务。例如,您是否依赖于一个区域中至少一个能够运行Pod的节点?确保任何集群关键修复不依赖于集群中至少有一个健康节点。例如:如果所有节点都不健康,则可能需要运行具有特殊容差的修复作业,以便修复能够完成到足以使至少一个节点投入服务。Kubernetes没有回答这个挑战,但是,它值得考虑。