使用集群联邦实现应用多活容灾
应用场景
为了应对云单点宕机故障,UCS的集群联邦提供多云多活应用、秒级流量接管能力。业务应用的实例可以多云多活的部署在不同云上的容器服务中,当云单点宕机故障发生时,集群联邦可以秒级自动完成应用实例的弹性迁移以及流量的切换,业务的可靠性大大提升。
多活容灾方案示意如图1所示,通过创建域名访问规则,将应用分发到3个Kubernetes集群,包括两个华为云CCE集群(部署在不同Region)和一个其他云的Kubernetes集群,实现应用的多活容灾。
准备工作
- 准备应用所运行的集群,本文以CCE集群为例进行演示,参考购买CCE集群在两个不同区域(如:华南-广州和华东-上海一)创建CCE集群,要求Kubernetes版本为1.19及以上,并且各个集群中至少拥有一个可用节点。
在实际生产环境中,多个集群可位于不同区域、可用区,甚至不同云服务商,实现应用的多活容灾。
- 已购买公网域名,并添加至华为云云解析(DNS)服务,具体操作请参考快速添加网站域名解析。
基础环境搭建
- 将集群注册到UCS并接入网络。具体操作请参见注册集群。
例如,将集群“ccecluster01”、“ccecluster02”注册到UCS的“ucs-group”容器舰队,并查看集群是否处于正常运行状态。
- 为集群所在舰队开通集群联邦,并确保集群已成功接入集群联邦。具体操作请参见集群联邦。
图2 集群管理
- 创建联邦工作负载。
为展示流量切换的效果,本文中两个集群的容器镜像版本不同(实际生产环境中并不会存在此差异)。
- 集群ccecluster01:示例应用使用nginx:gz镜像,返回“ccecluster01 is in Guangzhou.”。
- 集群ccecluster02:示例应用使用nginx:sh镜像,返回“ccecluster02 is in Shanghai.”。
在开始操作之前,您需要将示例应用的镜像上传到对应集群所在区域的SWR镜像仓库中(也就是说,nginx:gz镜像需要上传至华南-广州,nginx:sh镜像上传至华东-上海一),否则联邦工作负载会因拉取不到镜像而异常。
本文中的应用仅作示例,在实际生产环境中需替换为您的自有应用,且对集群的云服务商、区域、数量不作限制。
- 登录UCS控制台,选择左侧导航栏中的“容器舰队”。
- 单击已开通集群联邦的舰队名称,进入详情页面。
- 在左侧导航栏选择“联邦管理 > 工作负载”,单击右上角“镜像创建”。
- 填写基本信息并配置容器参数,镜像可以任意设置,单击“下一步:调度与差异化”。
- 设置集群调度策略,完成集群差异化配置,单击“创建工作负载”。
- 调度方式:选择“集群权重”,并设置两个集群的权重为1:1。
- 差异化配置:单击集群左侧的图标开启差异化配置,设置集群ccecluster01的镜像名称为“swr.cn-south-1.myhuaweicloud.com/kubernetes-test2/nginx:gz”(nginx:gz镜像在SWR镜像仓库中的地址),集群ccecluster02的镜像名称为“swr.cn-east-3.myhuaweicloud.com/kubernetes-test2/nginx:sh”。
图3 调度与差异化
- 创建LoadBalancer访问。
- 登录华为云UCS控制台,选择左侧导航栏中的“容器舰队”。
- 单击已开通集群联邦的舰队名称,进入详情页面。
- 在左侧导航栏选择“联邦管理 > 服务与路由”,单击右上角“创建服务”。
- 完成参数填写,单击“确认”。
- 访问类型:选择“负载均衡”。
- 端口配置:选择TCP协议,填写服务端口、容器端口,如8800、80。
- 部署集群:单击,依次添加ccecluster01和ccecluster02集群,负载均衡器选择共享型ELB实例,且必须和集群处于相同VPC中,如果列表中无可用ELB实例,单击“创建负载均衡器”前往ELB控制台进行创建。其他参数保持默认即可。
- 选择器:服务通过选择器与负载标签关联,这里通过引用负载标签的方式来添加标签。
图4 创建服务
- 创建域名访问。
- 登录华为云UCS控制台,选择左侧导航栏中的“容器舰队”。
- 单击已开通集群联邦的舰队名称,进入详情页面。
- 在左侧导航栏选择“联邦管理 > 域名访问”,添加根域名。
- 单击右上角“创建域名访问”,完成参数填写。
图5 配置流量配比
多活容灾场景验证
按照上述集群应用部署操作,示例应用分别部署在集群“ccecluster01”和“ccecluster02”中,并以“负载均衡”类型的服务对外提供访问。5中的域名访问创建成功后,系统自动为所选择的根域名添加解析记录,并且在UCS侧生成一个统一的对外访问路径(域名地址),因此,我们通过访问这个域名地址就可以验证流量的分配情况。
- 获取域名访问地址。
- 登录UCS控制台,选择左侧导航栏中的“容器舰队”。
- 单击已开通集群联邦的舰队名称,进入详情页面。
- 在左侧导航栏选择“联邦管理 > 域名访问”,列表中的“域名地址”即为域名访问地址。
图7 域名地址
- 在一台已连接公网的机器上执行如下命令,持续访问域名地址,查看集群应用处理状态。
- 正常情况下,两个集群上的应用均接收流量,并且各处理50%流量。
while true;do wget -q -O- helloworld.default.mcp-xxx.svc.xxx.co:8800; done ccecluster01 is in Guangzhou. ccecluster02 is in Shanghai. ccecluster01 is in Guangzhou. ccecluster02 is in Shanghai. ccecluster01 is in Guangzhou. ccecluster02 is in Shanghai. ...
- 当集群ccecluster01上的应用异常时(通过集群节点关机来模拟应用异常),系统将所有的流量路由到ccecluster02集群处理,用户感知不到异常。
while true;do wget -q -O- helloworld.default.mcp-xxx.svc.xxx.co:8800; done ccecluster02 is in Shanghai. ccecluster02 is in Shanghai. ccecluster02 is in Shanghai. ccecluster02 is in Shanghai. ccecluster02 is in Shanghai. ccecluster02 is in Shanghai. ...
返回UCS控制台,可以看到域名列表中的集群流量比例发生变化,由ccecluster02集群接管100%的流量,这与我们配置的流量配比模式以及观测到的现象均吻合。
图8 域名列表
- 正常情况下,两个集群上的应用均接收流量,并且各处理50%流量。