概述
本文将通过配置和部署一个典型 Dubbo 项目 Q 云书城(Q Cloud Book Mall,QCBM)为例,详细介绍和展示如何在多云多集群场景下管理一个典型的微服务项目,通过简洁的操作实现多集群应用分发管理,调度和迁移,灰度更新等能力,最终搭建起具备多集群容灾能力的完整微服务业务。
前期准备
在开始部署服务前,请确认以下步骤已完成:
阅读 QCBM 项目,了解 Dubbo 微服务架构,详情可参见 QCBM 项目。
掌握容器服务基础知识,详情见 容器服务 TKE 介绍。
技术架构
本文将 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 注册集群
注意
部署多集群应用
创建分发策略
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 分发策略页面。
2. 单击新建,创建分发策略 "qcbm-subscription",在弹出的页面选择想要发布的目标集群,此处选择 "guangzhou-01" 集群。如下图所示:


3. 单击创建完成创建,查看 qcbm-subscription 分发策略创建成功。
创建 Namespace
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击命名空间 > 新建,创建名称为 qcbm 的命名空间 Namespace,分发策略选择 qcbm-subscription。


3. 单击创建完成创建,命名空间 qcbm 成功创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1kind: Namespacemetadata:name: qcbmspec:finalizers:- kubernetes
创建 ConfigMap
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击配置管理 > ConfigMap > 新建,创建名称为 qcbm-env 的 ConfigMap,分发策略选择 qcbm-subscription。


3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1data:MYSQL_HOST: ## 根据实际配置填写MYSQL_PORT: ## 根据实际配置填写NACOS_HOST: ## 根据实际配置填写NACOS_PORT: ## 根据实际配置填写REDIS_HOST: ## 根据实际配置填写REDIS_PORT: ## 根据实际配置填写SW_AGENT_COLLECTOR_BACKEND_SERVICES: ## 根据实际配置填写kind: ConfigMapmetadata:name: qcbm-envnamespace: qcbm
创建 Secret
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击配置管理 > Secret > 新建,创建名称为 qcbm-keys 的 Secret,分发策略选择 qcbm-subscription。
3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1kind: Secretmetadata:name: qcbm-keysnamespace: qcbmlabels:qcloud-app: qcbm-keysdata:# 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. 单击工作负载 > 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/v1kind: Deploymentmetadata:name: user-servicenamespace: qcbmlabels:app: user-serviceversion: v1spec:replicas: 1selector:matchLabels:app: user-serviceversion: v1template:metadata:labels:app: user-serviceversion: v1spec:containers:- name: user-serviceimage: ccr.ccs.tencentyun.com/qcbm/user-service:fdd3eddimagePullPolicy: Alwaysenv:- name: NACOS_HOST # dubbo 服务注册中心 nacos 的 IP 地址valueFrom:configMapKeyRef:key: NACOS_HOSTname: qcbm-envoptional: false- name: MYSQL_HOST # Mysql 地址valueFrom:configMapKeyRef:key: MYSQL_HOSTname: qcbm-envoptional: false- name: MYSQL_PORTvalueFrom:configMapKeyRef:key: MYSQL_PORTname: qcbm-envoptional: false- name: REDIS_HOST # Redis 的 IP 地址valueFrom:configMapKeyRef:key: REDIS_HOSTname: qcbm-envoptional: false- name: REDIS_PORTvalueFrom:configMapKeyRef:key: REDIS_PORTname: qcbm-envoptional: false- name: MYSQL_ACCOUNTvalueFrom:secretKeyRef:key: MYSQL_ACCOUNTname: qcbm-keysoptional: false- name: MYSQL_PASSWORDvalueFrom:secretKeyRef:key: MYSQL_PASSWORDname: qcbm-keysoptional: false- name: REDIS_PASSWORDvalueFrom:secretKeyRef:key: REDIS_PASSWORDname: qcbm-keysoptional: false- name: SW_AGENT_COLLECTOR_BACKEND_SERVICESvalueFrom:configMapKeyRef:key: SW_AGENT_COLLECTOR_BACKEND_SERVICESname: qcbm-envoptional: false- name: SW_AGENT_AUTHENTICATIONvalueFrom:secretKeyRef:key: SW_AGENT_AUTHENTICATIONname: qcbm-keysoptional: falseports:- containerPort: 20880 # dubbo 端口号protocol: TCPvolumeMounts:- name: dumpathmountPath: /app/dumps- name: logpathmountPath: /app/logsvolumes:- name: dumpathhostPath:path: /data/dumps/user-servicetype: DirectoryOrCreate- name: logpathhostPath:path: /data/logs/user-servicetype: DirectoryOrCreate
创建 Service
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击服务与路由 > Service > 新建,创建名称为 qcbm-front 和 api-gateway 的 Service,分发策略选择 qcbm-subscription。
3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: v1kind: Servicemetadata:name: qcbm-frontnamespace: qcbmspec:type: NodePortselector:app: qcbm-frontversion: v1ports:- name: httpport: 80targetPort: 80nodePort: 30080---apiVersion: v1kind: Servicemetadata:name: api-gatewaylabels:app: api-gatewaynamespace: qcbmannotations:service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: ## 根据实际配置填写spec:externalTrafficPolicy: Clusterports:- name: httpport: 8080targetPort: 8080protocol: TCPnodePort: 32500selector: # 将后端服务 qcbm-gateway 和该 Service 进行映射app: qcbm-gatewayversion: v1type: LoadBalancer
创建 Ingress
注意
创建流程与单集群下创建的过程一致,仅需在配置页面最后选择指定的分发策略,例如:qcbm-subscription。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击服务与路由 > Ingress > 新建,创建名称为 qcbm-ingress 的 Ingress,分发策略选择 qcbm-subscription。
3. 单击创建完成创建,查看配置成功的创建并分发至指定集群上。
1. 登录 云原生分布式云中心控制台,进入分布式应用管理 > 应用管理页面。
2. 单击 YAML 创建资源,输入以下 YAML 配置。
3. 单击创建完成创建,修改分发策略选择 qcbm-subscription。
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: qcbm-ingressnamespace: qcbmannotations:ingress.cloud.tencent.com/direct-access: "false"kubernetes.io/ingress.class: qcloudkubernetes.io/ingress.extensiveParameters: '{"AddressIPVersion":"IPV4"}'kubernetes.io/ingress.http-rules: '[{"host":"qcbm.com","path":"/","backend":{"serviceName":"qcbm-front","servicePort":"80"}}]'spec:rules:- host: qcbm.comhttp:paths:- path: /backend:serviceName: qcbm-frontservicePort: 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/v1alpha1kind: Localizationmetadata:name: qcbm-svc-gateway-overridenamespace: ## 根据实际配置填写spec:priority: 300feed:apiVersion: v1kind: Servicename: api-gatewaynamespace: qcbmoverrides:- name: svc-overridetype: JSONPatchvalue: |-[{"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 云书城的服务。
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 address129.226.x.x tke-demo.cn # guangzhou-02 ingress address
4. 重新打开浏览器访问 "tke-demo.cn",页面能够正常访问,工作正常。
按照以上步骤可以验证,通过 TDCC 分布式云中心部署的多活容灾 QCBM 业务,实现了多集群高可用容灾,保证了业务对灾难级别事件的保护的能力。更进一步按照同样的流程,可以将 QCBM 业务部署至本地集群、第三方云服务商集群、边缘集群上,实现跨云服务和容灾的能力。