有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 云原生分布式云中心 > 最佳实践 > 多集群应用和高可用容灾实践

概述

本文将通过配置和部署一个典型 Dubbo 项目 Q 云书城(Q Cloud Book Mall,QCBM)为例,详细介绍和展示如何在多云多集群场景下管理一个典型的微服务项目,通过简洁的操作实现多集群应用分发管理,调度和迁移,灰度更新等能力,最终搭建起具备多集群容灾能力的完整微服务业务。

前期准备

在开始部署服务前,请确认以下步骤已完成:
阅读 QCBM 项目,了解 Dubbo 微服务架构,详情可参见 QCBM 项目
阅读 Dubbo 应用托管到 TKE,了解 QCBM 项目如何能够部署在 TKE 集群上。
掌握容器服务基础知识,详情见 容器服务 TKE 介绍

技术架构

QCBM 是采用微服务架构,并使用 dubbo 框架开发的一个网上书城 Demo 项目,详情可参见 QCBM 项目
本文将 QCBM 扩展至多集群上统一管理,在整体架构上主要划分为接入层,应用层和数据层,配合相应管控和监控组件,实现多集群管理和多活容灾能力。
整体架构图如下:


接入层使用腾讯云 CLB 或其他云厂商 LB 产品结合 K8s ingress 和 service 实现流量接入和转发,也支持配置 Nginx 实现。本文以 腾讯云负载均衡 CLB 为例。
数据层使用腾讯云数据库 MYSQL 和 Redis,或使用其他云厂商的数据库产品,同时也支持对接自建的 MySQL 和 Redis。本文以 腾讯云数据库 MYSQL腾讯云数据库 Redis 为例说明。
应用层由以下微服务应用组成,通过 应用治理 向多集群快速部署发布,并支持根据集群差异化配置进行灰度更新。
QCBM-Front :使用 react 开发的前端项目,基于 Nginx 官方提供的 1.19.8 docker 镜像构建和部署。
QCBM-Gateway :API 网关,接受前端的 http 请求,并转化为后台的 dubbo 请求。
User-Service :基于 dubbo 的微服务,提供用户注册、登录、鉴权等功能。
Favorites-Service :基于 dubbo 的微服务,提供用户图书收藏功能。
Order-Service :基于 dubbo 的微服务,提供用户订单生成和查询等功能。
Store-Service :基于 dubbo 的微服务,提供图书信息的存储等功能。

操作步骤

基础环境

1. 参考 搭建基础服务集群,分别在平台部署所需的基础服务,包括:Mysql、Redis、CLB、Nacos、TSW 等。
2. 准备 QCBM 服务所运行的集群,本文以 TKE 集群为例进行演示,参考 创建集群两个不同地域创建 TKE 集群。
注意
在实际生产环境中,多个集群可位于不同地域、可用区、甚至不同云服务商,实现可控的基础设施故障域。

在 TDCC 注册集群

参考 创建注册集群,将集群注册至分布式云中心。例如,注册 "guangzhou-01" 和 "guangzhou-02" 集群,完成后查看集群状态正常。


注意
首次进入分布式云中心控制台,需要开通云原生分布式云中心 TDCC 服务,详情见 云原生分布式云中心快速入门

部署多集群应用

参考 应用管理 创建和管理多集群的应用,快速的将 QCBM 应用部署到多集群上。

创建分发策略

1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 分发策略页面。
2. 单击新建,创建分发策略 "qcbm-subscription",在弹出的页面选择想要发布的目标集群,此处选择 "guangzhou-01" 集群。如下图所示:


3. 单击创建完成创建,查看 qcbm-subscription 分发策略创建成功。

创建 Namespace

参考 QCBM 项目,创建 qcbm 命名空间,根据分发策略发布至指定集群。
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
方式 1:使用控制台
方式 2:使用 YAML 部署
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击命名空间 > 新建,创建名称为 qcbm 的命名空间 Namespace,分发策略选择 qcbm-subscription。


3. 单击创建完成创建,命名空间 qcbm 成功创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1
kind: Namespace
metadata:
name: qcbm
spec:
finalizers:
- kubernetes

创建 ConfigMap

参考 QCBM 项目,创建名称为 qcbm-env 的 ConfigMap 用于存放相关配置,根据分发策略发布至指定集群。
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
方式 1:使用控制台
方式 2:使用 YAML 部署
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击配置管理 > ConfigMap > 新建,创建名称为 qcbm-env 的 ConfigMap,分发策略选择 qcbm-subscription。


3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1
data:
MYSQL_HOST: ## 根据实际配置填写
MYSQL_PORT: ## 根据实际配置填写
NACOS_HOST: ## 根据实际配置填写
NACOS_PORT: ## 根据实际配置填写
REDIS_HOST: ## 根据实际配置填写
REDIS_PORT: ## 根据实际配置填写
SW_AGENT_COLLECTOR_BACKEND_SERVICES: ## 根据实际配置填写
kind: ConfigMap
metadata:
name: qcbm-env
namespace: qcbm

创建 Secret

参考 QCBM 项目,创建名称为 qcbm-keys 的 Secret 用于存放相关配置,根据分发策略发布至指定集群。
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
方式 1:使用控制台
方式 2:使用 YAML 部署
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击配置管理 > Secret > 新建,创建名称为 qcbm-keys 的 Secret,分发策略选择 qcbm-subscription。
3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1
kind: Secret
metadata:
name: qcbm-keys
namespace: qcbm
labels:
qcloud-app: qcbm-keys
data:
# echo -n xxx | base64 , 加 -n 去掉 echo 默认加的换行
MYSQL_ACCOUNT: ## 根据实际配置填写
MYSQL_PASSWORD: ## 根据实际配置填写
REDIS_PASSWORD: ## 根据实际配置填写
SW_AGENT_AUTHENTICATION: ## 根据实际配置填写
type: Opaque

创建 Deployment

参考 QCBM 项目,创建 user-service、store-service、qcbm-gateway、qcbm-front、order-service、favorites-service 工作负载,根据分发策略发布至指定集群。
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
方式 1:使用控制台
方式 2:使用 YAML 部署
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击工作负载 > Deployment > 新建,创建名称为 user-service、store-service、qcbm-gateway、qcbm-front、order-service、favorites-service deployment 工作负载,分发策略选择 qcbm-subscription。


3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
namespace: qcbm
labels:
app: user-service
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: user-service
version: v1
template:
metadata:
labels:
app: user-service
version: v1
spec:
containers:
- name: user-service
image: ccr.ccs.tencentyun.com/qcbm/user-service:fdd3edd
imagePullPolicy: Always
env:
- name: NACOS_HOST # dubbo 服务注册中心 nacos 的 IP 地址
valueFrom:
configMapKeyRef:
key: NACOS_HOST
name: qcbm-env
optional: false
- name: MYSQL_HOST # Mysql 地址
valueFrom:
configMapKeyRef:
key: MYSQL_HOST
name: qcbm-env
optional: false
- name: MYSQL_PORT
valueFrom:
configMapKeyRef:
key: MYSQL_PORT
name: qcbm-env
optional: false
- name: REDIS_HOST # Redis 的 IP 地址
valueFrom:
configMapKeyRef:
key: REDIS_HOST
name: qcbm-env
optional: false
- name: REDIS_PORT
valueFrom:
configMapKeyRef:
key: REDIS_PORT
name: qcbm-env
optional: false
- name: MYSQL_ACCOUNT
valueFrom:
secretKeyRef:
key: MYSQL_ACCOUNT
name: qcbm-keys
optional: false
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: MYSQL_PASSWORD
name: qcbm-keys
optional: false
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
key: REDIS_PASSWORD
name: qcbm-keys
optional: false
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
valueFrom:
configMapKeyRef:
key: SW_AGENT_COLLECTOR_BACKEND_SERVICES
name: qcbm-env
optional: false
- name: SW_AGENT_AUTHENTICATION
valueFrom:
secretKeyRef:
key: SW_AGENT_AUTHENTICATION
name: qcbm-keys
optional: false
ports:
- containerPort: 20880 # dubbo 端口号
protocol: TCP
volumeMounts:
- name: dumpath
mountPath: /app/dumps
- name: logpath
mountPath: /app/logs
volumes:
- name: dumpath
hostPath:
path: /data/dumps/user-service
type: DirectoryOrCreate
- name: logpath
hostPath:
path: /data/logs/user-service
type: DirectoryOrCreate

创建 Service

参考 QCBM 项目,创建名称为 qcbm-front 和 api-gateway 的 Service,根据分发策略发布至指定集群。
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
方式 1:使用控制台
方式 2:使用 YAML 部署
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击服务与路由 > Service > 新建,创建名称为 qcbm-front 和 api-gateway 的 Service,分发策略选择 qcbm-subscription。
3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。

  apiVersion: v1
  kind: Service
  metadata:
    name: qcbm-front
    namespace: qcbm
  spec:
    type: NodePort
    selector:
      app: qcbm-front
      version: v1
    ports:
      - name: http
        port: 80
        targetPort: 80
        nodePort: 30080
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: api-gateway
    labels:
      app: api-gateway
    namespace: qcbm
    annotations:
      service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: ## 根据实际配置填写
  spec:
    externalTrafficPolicy: Cluster
    ports:
      - name: http
        port: 8080
        targetPort: 8080
        protocol: TCP
        nodePort: 32500
    selector:  # 将后端服务 qcbm-gateway 和该 Service 进行映射
      app: qcbm-gateway
      version: v1
    type: LoadBalancer




创建 Ingress

参考 QCBM 项目,创建名称为 qcbm-ingress 的 Ingress,根据分发策略发布至指定集群。
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
方式 1:使用控制台
方式 2:使用 YAML 部署
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击服务与路由 > Ingress > 新建,创建名称为 qcbm-ingress 的 Ingress,分发策略选择 qcbm-subscription。
3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: qcbm-ingress
namespace: qcbm
annotations:
ingress.cloud.tencent.com/direct-access: "false"
kubernetes.io/ingress.class: qcloud
kubernetes.io/ingress.extensiveParameters: '{"AddressIPVersion":"IPV4"}'
kubernetes.io/ingress.http-rules: '[{"host":"qcbm.com","path":"/","backend":{"serviceName":"qcbm-front","servicePort":"80"}}]'
spec:
rules:
- host: qcbm.com
http:
paths:
- path: /
backend:
serviceName: qcbm-front
servicePort: 80

查看部署结果

至此,您已完成 QCBM 在 "guangzhou-01" 集群上的部署,可通过以下步骤查看部署结果:
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击服务与路由 > Ingress 进入 Ingress 页面,可查看到创建的 qcbm-ingress。单击进入详情 > 实例管理


3. 通过 Ingress 的 VIP 即可访问 Q 云书城页面。



多集群调度管理

新增集群发布

根据业务发展和容灾保障的需求,需要将 QCBM 应用部署至另外一个集群,可以通过编辑分发策略快速地实现。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 分发策略页面。
2. 选择分发策略 qcbm-subscription,单击关联集群,添加 "guangzhou-02" 集群。
3. 单击确定,分布式云中心将自动将所有 QCBM 应用分发至两个集群上。单击名称进入详情页面可查看详情信息和拓扑图。



差异化配置集群下实例

QCBM 应用已部署在两个集群上,由于不同集群间环境的差异,QCBM 应用需要在不同集群上有差异化的配置,可以通过差异化策略实现。 例如 api-gateway Service 需要为 "guangzhou-02" 集群指定 subnet-id,可通过以下步骤实现:
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 进入服务与路由 > Service,单击 api-gateway 名称进入详情 > 实例管理页面,选择 "guangzhou-02" 集群下的实例,新建差异化策略。
apiVersion: apps.clusternet.io/v1alpha1
kind: Localization
metadata:
name: qcbm-svc-gateway-override
namespace: ## 根据实际配置填写
spec:
priority: 300
feed:
apiVersion: v1
kind: Service
name: api-gateway
namespace: qcbm
overrides:
- name: svc-override
type: JSONPatch
value: |-
[
{
"op": "replace",
"path": "/metadata/annotations/service.kubernetes.io~1qcloud-loadbalancer-internal-subnetid",
"value": "" ## 根据实际配置填写
}
]
3. 单击确定保存,分布式云中心将根据该差异化策略自动调整对应集群下的配置。
4. 进入 "guangzhou-02" 集群的 Ingress 页面,找到 qcbm-ingress 地址,通过该地址即可访问 "guangzhou-02" 集群下的 Q 云书城页面。



多活容灾能力验证

按照以上云原生分布式云中心 TDCC 多集群应用管理的操作,QCBM 业务应用分别部署在 "guangzhou-01" 和 "guangzhou-02" 集群上,对外暴露 ingress 地址提供 Q 云书城的服务。
此时可以使用已有或 新申请域名,添加 ingress 地址解析,实现基本的多活容灾能力。例如参考以下步骤验证多集群高可用:
1. 配置本地 hosts 域名 "tke-demo.cn",默认访问 "guangzhou-01" 集群的 ingress 地址,页面能够正常访问,工作正常。
2. 手动驱逐该集群的节点或停止应用,模拟环境故障,此时访问 "tke-demo.cn" 返回错误。
3. 通过修改 hosts 配置来模拟 DNS 切换。
# /etc/hosts
#1.14.x.x tke-demo.cn # guangzhou-01 ingress address
129.226.x.x tke-demo.cn # guangzhou-02 ingress address
4. 重新打开浏览器访问 "tke-demo.cn",页面能够正常访问,工作正常。
按照以上步骤可以验证,通过 TDCC 分布式云中心部署的多活容灾 QCBM 业务,实现了多集群高可用容灾,保证了业务对灾难级别事件的保护的能力。更进一步按照同样的流程,可以将 QCBM 业务部署至本地集群、第三方云服务商集群、边缘集群上,实现跨云服务和容灾的能力。