二十四、企业落地异地多活、异地容灾架构
- 二十四、企业落地异地多活、异地容灾架构
- 1、K8s企业级两地三中心、异地多活、智能DNS落地
- 1.1 两地三中心架构解析
- 1.2 什么是异地多活?
- 1.3 异地多活架构
- 1.4 异地多活、两地三中心核心技术
- 1.5 智能DNS和GTM详解
- 1.6 智能DNS工作原理
- 1.7 K8s多集群异地多活架构
- 2、异地多活 K8s 集群部署
- 2.1 集群规划
- 2.2 华北地区服务器创建
- 2.3 华北地区 K8s 集群搭建
- 2.4 华北地区 Ingress Controller 部署
- 2.5 华北地区部署测试服务
- 2.6 华北地区使用负载均衡发布服务
- 3、智能 DNS 配置
- 3.1 登录及注册
- 3.2 注册域名
- 3.3 试用 DNSPod 专业版
- 3.4 创建 GTM 实例
- 3.5 监控器配置
- 3.6 地址池配置
- 3.7 异地多活 DNS 配置
- 3.8 域名解析
- 4、异地多活故障自动切换
- 1、K8s企业级两地三中心、异地多活、智能DNS落地
1、K8s企业级两地三中心、异地多活、智能DNS落地
1.1 两地三中心架构解析

1.2 什么是异地多活?
异地多活(Multi - Site Active/Active)是两地三中心架构的更高级形态,可以实现在不同城市建立独立数据中心的高可用架构。区别在于两地三中心,异地多活的每个中心均在承载业务流量,并且每个中心之间相互同步数据。
- 异地:指多个地理上的城市,不仅仅是两个
- 多活:多个中心同时对外提供服务,共同承担用户流量,没有主备之分
核心:多个中心共同承载流量,使用智能DNS分发就近分发流量
1.3 异地多活架构

1.4 异地多活、两地三中心核心技术
- 智能DNS/GTM:根据用户位置、各个中心的健康状态,将流量分发到最合适的机房,比如华北用户访问北京机房,联通用户访问联通入口等
- 多集群管理工具:ArgoCD、Karmada,用于统一管理分布在各个中心的K8s集群,实现全局的服务部署、配置分发等
- 多集群监控平台:Thanos、VictoriaMetrics,用于接收来自于各个中心的监控数据,实现全局的业务监控等
- 分布式数据库:TiDB、CockroachDB,原生支持跨区域部署的数据库,支持多活写入,自动处理冲突等
- 单元化/数据分片:每个中心是一个独立的单元,实现业务闭环,防止跨中心数据读取和写入
1.5 智能DNS和GTM详解
智能DNS(也称动态DNS、地理DNS、基于策略的DNS、全局流量管理GTM)是一种高级域名解析技术,和普通DNS相比,智能DNS不再简单地将一个域名解析到固定的IP地址,而是根据访问者的来源信息(如地理位置、运营商、网络延迟、服务健康状态等)动态返回最合适的IP地址。
应用场景:
- CDN加速:根据用户位置返回最近的CDN边缘节点
- 异地多活:用户访问归属地单元(如北京用户→北京集群)
- 全球化部署:海外用户访问海外服务器,国内用户访问国内机房
- 负载均衡:多个数据中心之间按权重或健康状态分发流量
- 容灾切换:主中心故障自动切换到备用中心
- 运营商择优:避免跨运营商访问,提升速度
- 灰度发布:北京用户先用新版本,上海用户用旧版本
1.6 智能DNS工作原理

1.7 K8s多集群异地多活架构

2、异地多活 K8s 集群部署
2.1 集群规划
| 区域 | 主机名称 | 内网IP | 备注 |
|---|---|---|---|
| 华东-南京 | k8s-nj-master01 | 172.16.0.4 | 实际(生产)上该地区要安装完整的k8s集群,这里仅测试单实例 |
| 华南-广州 | k8s-gz-master01 | 10.206.0.17 | 实际(生产)上该地区要安装完整的k8s集群,这里仅测试单实例 |
| 华北-北京 | k8s-bj-master01 | 172.21.0.6 | 实际(生产)上该地区要安装完整的k8s集群,这里仅测试单实例 |
多中心区域:
- 华东:山东省、江苏省、安徽省、上海市、浙江省、江西省、福建省和台湾省及其钓鱼岛等
- 华西:新疆、内蒙古西部、青海、甘肃、宁夏、陕西、西藏、四川、重庆、云南、贵州、广西(西部及西南部)
- 华南:广东省、广西壮族自治区、海南省、福建省中南部、台湾、香港特别行政区、澳门特别行政区等
- 华北:北京、天津、河北、山西和内蒙古自治区
2.2 华北地区服务器创建
首先需要在不同的区域或者不同的云厂商购买云服务器,之后搭建多个测试的 K8s 集群,搭建完成后,部署测试服务及 Ingress Controller 对外发布。
我们这里选择 腾讯云,也可以选择阿里云、华为云。
以腾讯云为例,点击立即购买:

选择自定义配置—按量计费:

测试环境,选择 2C4G 就可以

选择镜像

网络与带宽默认选择即可:

配置安全组:

设置密码

接下来开通即可

创建成功后,即可通过公网 IP 链接至该主机

接下来以通用的方式购买广州、南京的虚拟机即可。
2.3 华北地区 K8s 集群搭建
所有节点依次修改主机名称
[root@VM-0-6-rockylinux ~]# hostnamectl set-hostname k8s-bj-master01
所有节点关闭防火墙、selinux、dnsmasq、swap:
# 关闭防火墙
[root@k8s-bj-master01 ~]# systemctl disable --now firewalld
[root@k8s-bj-master01 ~]# systemctl disable --now dnsmasq# 关闭selinux
[root@k8s-bj-master01 ~]# setenforce 0
[root@k8s-bj-master01 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
[root@k8s-bj-master01 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config# 关闭 swap 分区
[root@k8s-bj-master01 ~]# swapoff -a && sysctl -w vm.swappiness=0
[root@k8s-bj-master01 ~]# sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
配置阿里云镜像源
[root@k8s-bj-master01 ~]# sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' -i.bak /etc/yum.repos.d/*.repo[root@k8s-bj-master01 ~]# dnf makecache
必备工具安装:
[root@k8s-bj-master01 ~]# yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y
Runtime 安装:
[root@k8s-bj-master01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-bj-master01 ~]# yum install containerd.io -y
# 配置内核
[root@k8s-bj-master01 ~]# cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
[root@k8s-bj-master01 ~]# modprobe overlay
[root@k8s-bj-master01 ~]# modprobe br_netfilter[root@k8s-bj-master01 ~]# cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
[root@k8s-bj-master01 ~]# sysctl --system
# 创建配置文件目录
[root@k8s-bj-master01 ~]# mkdir -p /etc/containerd# 生成配置文件
[root@k8s-bj-master01 ~]# containerd config default | sudo tee /etc/containerd/config.toml# 修改配置文件
[root@k8s-bj-master01 ~]# sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
[root@k8s-bj-master01 ~]# sed -i 's#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
[root@k8s-bj-master01 ~]# sed -i 's#registry.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
[root@k8s-bj-master01 ~]# sed -i 's#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml# 启动 Containerd
[root@k8s-bj-master01 ~]# systemctl daemon-reload
[root@k8s-bj-master01 ~]# systemctl enable --now containerd
K8s 安装:
# 配置源
[root@k8s-bj-master01 ~]# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/repodata/repomd.xml.key
EOF# 安装k8s
[root@k8s-bj-master01 ~]# yum install kubeadm-1.34.* kubelet-1.34.* kubectl-1.34.* -y
[root@k8s-bj-master01 ~]# systemctl enable --now kubelet
# 提前下载镜像
[root@k8s-bj-master01 ~]# kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version 1.34.1
# 初始化集群(注意每个地区集群的ip不同)
[root@k8s-bj-master01 ~]# kubeadm init --apiserver-advertise-address 172.21.0.6 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --cri-socket "unix:///var/run/containerd/containerd.sock" --kubernetes-version 1.34.1# 如果有其他工作节点加入即可
配置 KUBECONFIG:
[root@k8s-bj-master01 ~]# mkdir -p $HOME/.kube
[root@k8s-bj-master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-bj-master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
必备 Addons 安装:
# 拉取包
[root@k8s-bj-master01 ~]# git clone https://gitee.com/dukuan/k8s-ha-install.git
[root@k8s-bj-master01 ~]# cd k8s-ha-install/# 切换到对应的分支
[root@k8s-bj-master01 k8s-ha-install]# git checkout manual-installation-v1.34.x# 安装
[root@k8s-bj-master01 k8s-ha-install]# cd single/
[root@k8s-bj-master01 single]# kubectl apply -f .
去除污点(由于我们是测试创建的单实例,所以要去除下污点):
[root@k8s-bj-master01 single]# kubectl taint node k8s-bj-master01 node-role.kubernetes.io/control-plane-
查看 Pod 启动状态:
[root@k8s-bj-master01 single]# kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-79d54b5d57-rptjw 1/1 Running 0 7m51s
calico-node-dlrxb 1/1 Running 0 7m51s
coredns-7ddb67b59b-hmbbn 1/1 Running 0 11m
coredns-7ddb67b59b-snt8b 1/1 Running 0 11m
etcd-k8s-bj-master01 1/1 Running 0 11m
kube-apiserver-k8s-bj-master01 1/1 Running 0 11m
kube-controller-manager-k8s-bj-master01 1/1 Running 0 11m
kube-proxy-pvxmd 1/1 Running 0 11m
kube-scheduler-k8s-bj-master01 1/1 Running 0 11m
metrics-server-7d8bbc797d-p8mh5 1/1 Running 0 7m51s
2.4 华北地区 Ingress Controller 部署
[root@k8s-gz-master01 single]# kubectl label node k8s-gz-master01 ingress=true
[root@k8s-bj-master01 ~]# kubectl create -f ingress-nginx-daemonset.yaml[root@k8s-bj-master01 ~]# kubectl get po -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-4cv8v 0/1 Completed 0 14s
ingress-nginx-admission-patch-t9f4w 0/1 Completed 1 14s
ingress-nginx-controller-cvbd4 0/1 Running 0 14s
2.5 华北地区部署测试服务
部署服务:
[root@k8s-bj-master01 ~]# kubectl create deploy krm --image=registry.cn-beijing.aliyuncs.com/dotbalo/krm:demo[root@k8s-bj-master01 ~]# kubectl expose deploy krm --port 80
访问测试:
[root@k8s-bj-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
krm-978cdf5dd-nfmc8 1/1 Running 0 29s 192.168.2.11 k8s-bj-master01 <none> <none>[root@k8s-bj-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
krm ClusterIP 10.100.210.10 <none> 80/TCP 6s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25m[root@k8s-bj-master01 ~]# curl 10.100.210.10
创建 Ingress,使用域名发布:
[root@k8s-bj-master01 ~]# vim krm-ingress.yaml
[root@k8s-bj-master01 ~]# cat krm-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: krmnamespace: default
spec:rules:- host: www.kubeasy.onlinehttp:paths:- backend:service:name: krmport:number: 80path: /pathType: PrefixingressClassName: nginx
创建后,配置 hosts 进行测试:
[root@k8s-bj-master01 ~]# kubectl create -f krm-ingress.yaml
[root@k8s-bj-master01 ~]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
krm nginx www.kubeasy.online 172.21.0.6 80 57s

2.6 华北地区使用负载均衡发布服务
华北地区使用负载均衡发布服务通常情况下,不会使用服务器的 IP 直接对外发布服务,而是采用公有云的 LB 进行发布,比如腾讯云的 CLB,阿里云的 SLB 等。接下来购买 LB 实例,对外发布服务:
接下来以腾讯云为例:


公网实例规格选择性能容量型

生产环境流量建议10M以上

接下来开通即可

购买成功后,配置监听器:






这里如果有多台服务器,可以勾选多台(如果有多个端口,就需要创建一个新的监控器)


配置此IP -> 域名 到host

接下来以通用的方式配置广州、南京的负载均衡即可。
3、智能 DNS 配置
目前已经有了多个中心的环境,以及入口的负载均衡,接下来即可使用腾讯云的 IGTM 实现智能 DNS。
产品介绍:https://cloud.tencent.com/document/product/1551/84512
产品功能:https://cloud.tencent.com/document/product/1551/84513
应用场景:https://cloud.tencent.com/document/product/1551/84514
3.1 登录及注册
首先访问腾讯云 IGTM 官网
直接登录并注册腾讯云账户,登录后的页面如下:

生产环境要选择旗舰版,我们这边学习测试选择标准版即可

注意:探测任务额度和探测点、地址池数量、IP 地址数量有关系,生产环境建议购买 50 个以上

购买后可以在套餐管理查看 IGTM 套餐:

3.2 注册域名
购买 GTM 套餐后,接下来购买一个域名进行测试,域名管理地址:,注意域名注册一般需要实名认证,如果购买域名时提示实名认证,请自行完成实名注册,同时可能需要进行备案才能正常使用:

随便输入一个域名,找一个最便宜的即可:


需要自己做下实名验证

接下来完成支付即可,购买后即可在域名列表查看(新建域名同样需要审核,大概 1 个小时左右,审核通过后,可能也需要一段时间才能被正常解析):



3.3 试用 DNSPod 专业版
由于智能 DNS 需要基于地域进行动态 DNS 解析,所以需要购买腾讯云的 DNSPod 专业版,学习环境可以申请一个月试用。
首先登录到腾讯云管理后台,打开控制台,之后点击我的试用:


3.4 创建 GTM 实例
GTM 实例可以理解为对外发布的域名,比如 www.kubeasy.online(和Ingress 配置保持一致,或者修改 Ingress 配置),如果需要针对多个域名配置智能 DNS,那么需要创建多个实例,同时也意味着需要购买多个套餐。
接下来创建 IGTM 实例:


接下来点击立即创建即可:

- 域名:业务域名,即用户访问的域名,比如
www.kubeasy.online,该域名可以和 CNAME 域名不同,同样也可以不是腾讯云的域名- 实例名称:用于区分不同实例,一般和子域名或者域名保持一致
- TTL:域名对应 IP 地址信息在运营商的 DNS 系统内的缓存生效时间
- CNAME 域名:GTM 接入的域名,后续需要把
www.kubeasy.online业务域名 CNAME 到该域名
3.5 监控器配置
监控器可对地址池中地址进行健康检查,开启后可监测应用服务的可用性状态,并最终帮助企业实现自动故障隔离和自动故障切换的功效。健康检查可选的类型包括:PING 监控、TCP 监控、HTTP(S)监控等。
接下来创建一个 http 类型的监控器(根据公司真实对外可被请求的类型配置):




注意:上述的节点,每勾选一个,就需要一个探测额度
3.6 地址池配置
地址池是 IGTM 智能全局流量管理对应用服务的地址进行管理的功能。一个地址池,代表一组提供相同应用服务 IP 地址或域名,一般为不同机房或者不同中心的流量入口。
接下来创建地址池:


接下来以通用的方式创建广州、南京的地址池即可

3.7 异地多活 DNS 配置
一个智能全局流量管理实例可以创建多个访问策略,可为不同运营商、地区、云厂商、搜索引擎来源的流量设置不同的解析响应地址池,以实现就近访问接入和故障自动切换效果。
接下来配置调度策略:


首先为华北用户添加调度策略,让其访问华北的机房:

选择其他机房作为兜底地址池:

配置监控器,之前已经配置过,此处无需配置

确认配置:

上述已经针对不同地区配置了智能 DNS 策略,接下来可以创建一个默认的策略,让其他地域的用户走默认策略:




最终创建完毕

- 线路类型:设置用户的解析请求线路来源,该策略仅负责调度对应线路的流量管理,对其他线路不影响(大区划分可能需要专业版 DNSPod)
- 故障切换策略:设置地址池发生故障时的切换策略
- 一级地址池(主要地址池):匹配该策略的流量主要分配的地址
- 二次地址池:调度策略进行故障切换时,将按照地址池集合优先级进行切换
- 兜底地址池:当所有主力地址池都不可用时,流量将切换至兜底地址池,兜底地址池将默认返回全部地址
3.8 域名解析
智能 DNS 配置结束后,接下来把域名 www.kubeasy.online 解析到 igtm.kubeasy.online(非腾讯云域名也可以配置):



配置完成后,测试解析,处于华北的用户解析的 IP 为
[root@k8s-bj-master01 ~]# nslookup www.kubeasy.online
Server: 183.60.83.19
Address: 183.60.83.19#53Non-authoritative answer:
www.kubeasy.online canonical name = igtm.kubeasy.online.
Name: igtm.kubeasy.online
Address: 82.157.159.27
华东的用户解析地址为:
[root@k8s-gz-master01 ~]# nslookup www.kubeasy.online
Server: 183.60.83.19
Address: 183.60.83.19#53Non-authoritative answer:
www.kubeasy.online canonical name = igtm.kubeasy.online.
Name: igtm.kubeasy.online
Address: 119.91.184.151
华南的用户解析地址为:
[root@k8s-nj-master01 ~]# nslookup www.kubeasy.online
Server: 183.60.83.19
Address: 183.60.83.19#53Non-authoritative answer:
www.kubeasy.online canonical name = igtm.kubeasy.online.
Name: igtm.kubeasy.online
Address: 1.13.10.128
4、异地多活故障自动切换
配置完 GTM 之后,可以尝试关停某个地区的服务器,之后查看智能 DNS 是否会自动切换。关闭华北的服务器:


关闭后,查看地址池:

故障后,由于 DNS 具有缓存有限期,所以华北用户可能需要过一段时间才能正常使用

切换后访问正常:
