联邦集群实现Kubernetes零停机
内容提要
本文介绍如何在三个GKE集群上部署Linkerd多集群扩展,实现联邦、扁平镜像和网关镜像三种模式共存。通过共享信任锚、全网格链接和标签配置,联邦服务自动故障转移,扁平镜像支持客户端选择特定集群,网关镜像适用于无扁平网络场景。混沌测试验证了集群故障时联邦服务自动重新平衡,而镜像服务需客户端处理。文章提供完整脚本和操作指南。
延伸解读
三种模式如何共存
文章强调,Linkerd多集群扩展的三种模式(网关、扁平、联邦)并非互斥,而是通过服务上的标签(label)按需选择。同一组集群上,不同服务可以分别使用不同模式,例如联邦服务用于自动故障转移,扁平镜像用于客户端指定集群,网关镜像用于无扁平网络场景。这种灵活性使得平台团队可以根据每个服务的实际需求混合使用,而不必为所有服务统一选择一种模式。
联邦与镜像的取舍
联邦服务(federated)自动将同名的服务合并为一个端点,跨集群负载均衡,并在集群故障时自动重新分配流量,无需应用改动。而镜像服务(mirrored)则暴露为带集群后缀的独立服务,客户端必须显式选择目标集群,故障时需自行处理(如重试或切换)。文章通过混沌测试展示了这一差异:联邦服务在集群故障后自动恢复均衡,而镜像服务则返回错误,需要客户端介入。
网络要求与配置陷阱
扁平模式和联邦模式要求集群间有扁平网络(pod IP可直接路由),而网关模式只需网关IP可达。在GCP上,通过VPC对等连接和自定义路由导出/导入可实现扁平网络。文章提醒了几个关键陷阱:必须显式设置非重叠的CIDR,否则对等连接会静默失败;区域集群默认会在多个可用区部署节点,导致成本增加;每个消费集群需要为每个链接配置对应的控制器,否则镜像不会生效。
生产环境建议
文章末尾给出了生产环境检查清单,包括:使用共享CA和每集群独立的签发证书(便于隔离轮换)、配置网络策略和Linkerd授权策略限制跨集群流量、监控联邦服务的端点数量变化、将多集群配置纳入GitOps管理,并定期进行故障演练(如将集群缩容至零)以验证故障转移能力。这些建议旨在帮助团队在生产环境中可靠地运行多集群Linkerd。
Q&A
Linkerd多集群扩展支持哪三种模式?它们之间有什么区别?
Linkerd多集群扩展支持三种模式:层级(网关)镜像、扁平(pod到pod)镜像和联邦。层级镜像通过网关路由流量,只需网关IP可达;扁平镜像直接路由到远程pod,需要扁平网络;联邦将所有同名服务联合成一个负载均衡端点,也需要扁平网络。模式通过服务标签选择,可共存。
如何在三个GKE集群上部署Linkerd多集群扩展并实现联邦、扁平镜像和网关镜像共存?
部署步骤包括:1) 配置环境变量;2) 运行基础设施脚本创建三个VPC和GKE集群,并设置VPC对等;3) 安装Linkerd并共享信任锚;4) 安装多集群组件并创建全网格链接,其中east集群启用网关;5) 部署服务并分别打标签:frontend打federated=member,api打exported=remote-discovery,analytics打exported=true;6) 验证流量。
联邦服务在集群故障时如何自动故障转移?
联邦服务通过将多个集群中的同名服务联合成一个负载均衡端点,当某个集群故障时,Linkerd的负载均衡器会自动将流量重新分配到剩余的健康pod上,无需应用更改。例如,在混沌测试中,east集群故障后,frontend-federated的流量从33/33/33自动变为50/50,零错误。
扁平镜像和网关镜像在集群故障时表现如何?
扁平镜像和网关镜像在目标集群故障时不会自动故障转移,因为客户端明确指定了要访问的远程服务。例如,api-east在east故障后返回503,analytics-east-gw返回502。客户端需要自行处理故障转移,例如切换到api-west或使用TrafficSplit。
在GKE上实现扁平网络需要满足什么条件?
需要三个VPC的pod和service CIDR不重叠,并设置VPC对等时使用--export-custom-routes和--import-custom-routes来通告路由。GKE VPC原生集群配合对等VPC可以提供扁平网络。
部署Linkerd多集群时有哪些常见的坑?
常见坑包括:VPC对等时未导出/导入自定义路由导致连接挂起;区域集群默认每个区域三个节点导致成本增加;CIDR重叠导致对等失败;每个消费集群需要为每个链接配置一个service-mirror控制器,否则镜像不工作;联邦服务命名固定为<svc>-federated;网关和扁平不能共享一个链接,需要分别创建。
如何选择适合的Linkerd多集群模式?
如果客户端不需要关心集群位置,选择联邦模式;如果客户端需要指定特定集群,选择扁平镜像;如果没有扁平网络,选择网关镜像;如果需要自动故障转移且无需应用更改,选择联邦;如果需要流量拆分,使用扁平镜像加TrafficSplit;如果服务是单例,使用镜像(扁平或网关)。