多集群高可用架构部署手册
核心目标:基于 Ubuntu 24.04 搭建 Platform、Middleware、Application 三个独立 k3s 集群,实现控制平面高可用、跨集群内网通信、外部流量隔离,集成 Calico、MetalLB、Ingress-nginx 及 Rancher 管理,适配 Ubuntu 系统包管理与配置特性。
第一章 集群角色与资源规划
1.1 节点角色与配置清单
| 节点类型 | 角色 | 数量 | 硬件配置(单台) | 节点IP | 核心功能 |
|---|---|---|---|---|---|
| 内部API LB | 主/备节点 | 2 | 2核CPU、4GB内存、50GB磁盘 | 10.1.10.5/6 | 转发各集群6443端口(apiserver) |
| 外部服务LB | 主/备节点 | 2 | 2核CPU、4GB内存、50GB磁盘 | 192.168.192.75/76(外网)、10.1.10.7/8(内网) | 仅转发外部80/443流量至Application集群Ingress |
| Platform集群 | master节点 | 2 | 4核CPU、8GB内存、100GB磁盘 | 10.1.10.60/61 | 控制面(etcd高可用) |
| worker节点 | 2 | 8核CPU、16GB内存、200GB磁盘 | 10.1.10.65/66 | 运行Rancher等运维工具 | |
| Middleware集群 | master节点 | 2 | 4核CPU、8GB内存、100GB磁盘 | 10.1.10.50/51 | 控制面(etcd高可用) |
| worker节点 | 2 | 8核CPU、16GB内存、200GB磁盘 | 10.1.10.55/56 | 运行Redis/MQ等中间件 | |
| Application集群 | master节点 | 2 | 4核CPU、8GB内存、100GB磁盘 | 10.1.10.40/41 | 控制面(etcd高可用) |
| worker节点 | 3 | 8核CPU、16GB内存、200GB磁盘 | 10.1.10.45/46/47 | 运行业务微服务/前端 | |
| 已有数据库 | 主库 | 1 | 4核CPU、8GB内存、200GB磁盘 | 192.168.192.175 | 存储集群控制面状态 |
1.2 网络规划(关键网段)
| 网段用途 | 网段地址 | 说明 |
|---|---|---|
| 管理网段(VLAN 10) | 10.1.10.0/24 | 节点IP、内部LB VIP(10.1.10.10/11/12) |
| 服务网段(VLAN 100) | 192.168.192.70/24 | 外部LB VIP(192.168.192.80),仅面向Application集群 |
| Platform Pod/Service | 10.42.0.0/16/10.43.0.0/16 | Calico分配的Pod/Service IP |
| Middleware Pod/Service | 10.44.0.0/16/10.45.0.0/16 | Calico分配的Pod/Service IP |
| Application Pod/Service | 10.46.0.0/16/10.47.0.0/16 | Calico分配的Pod/Service IP |
| MetalLB固定IP段 | 10.2.10.100-250 | 内网服务暴露IP(分三段:Platform 100-150;Middleware 151-200;Application 201-250) |
1.3 VIP规划
| VIP用途 | VIP地址 | 端口 | 说明 |
|---|---|---|---|
| Platform控制平面 | 10.1.10.12 | 6443 | Platform集群apiserver入口(内部LB转发) |
| Middleware控制平面 | 10.1.10.11 | 6443 | Middleware集群apiserver入口(内部LB转发) |
| Application控制平面 | 10.1.10.10 | 6443 | Application集群apiserver入口(内部LB转发) |
| 外部服务入口 | 192.168.192.80 | 80/443 | 外部用户访问入口(外部LB VIP) |
第二章 前期准备(所有节点执行)
2.1 操作系统初始化
sudo su -
# 更新系统包索引
sudo apt update && sudo apt upgrade -y
# 关闭防火墙(生产环境建议按需开放端口)
sudo systemctl stop ufw && sudo systemctl disable ufw # Ubuntu默认使用ufw防火墙
# 关闭Swap(k8s要求)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab # 永久禁用
# 配置内核参数(容器网络)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay && sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system # 生效内核参数
# 关闭IPv6(可选,避免网络冲突)
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
2.2 安装依赖工具
# 安装基础依赖(Ubuntu包名适配)
sudo apt install -y curl wget vim net-tools ipvsadm chrony apt-transport-https ca-certificates
sudo systemctl start chrony && sudo systemctl enable chrony # 时间同步
sudo chronyc sources # 验证时间同步状态
第三章 负载均衡器部署(HAProxy+Keepalived)
3.1 内部API LB部署(10.1.10.5/6节点)
用于转发各集群apiserver(6443端口)流量,实现控制平面高可用。
安装HAProxy+Keepalived:
sudo apt install -y haproxy keepalived # Ubuntu包管理安装
配置HAProxy:
sudo tee /etc/haproxy/haproxy.cfg <<EOF
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp # k3s 6443是TCP协议
option tcplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
# 监控页面(访问http://节点IP:9000,账号haproxy:haproxy)
listen stats
bind *:9000
mode http
stats enable
stats uri /
stats auth haproxy:haproxy
# 合并所有6443端口的流量处理(关键修改)
frontend k3s-api-front
bind *:6443 # 仅绑定一次6443端口
# 根据目标VIP区分不同集群
acl is_app_api dst 10.1.10.10 # 业务集群VIP
acl is_mid_api dst 10.1.10.11 # 中间件集群VIP
acl is_plat_api dst 10.1.10.12 # platform集群VIP(你的目标VIP)
# 匹配ACL后转发到对应的backend
use_backend app-api-backend if is_app_api
use_backend mid-api-backend if is_mid_api
use_backend plat-api-backend if is_plat_api
# 默认后端(可选,如无匹配则拒绝)
default_backend plat-api-backend # 可改为拒绝:default_backend reject-backend
# 业务集群后端
backend app-api-backend
balance roundrobin
server app-master-01 10.1.10.40:6443 check inter 2000 fall 3 rise 2
server app-master-02 10.1.10.41:6443 check inter 2000 fall 3 rise 2
# 中间件集群后端
backend mid-api-backend
balance roundrobin
server mid-master-01 10.1.10.50:6443 check inter 2000 fall 3 rise 2
server mid-master-02 10.1.10.51:6443 check inter 2000 fall 3 rise 2
# platform集群后端(你的目标后端)
backend plat-api-backend
balance roundrobin
server plat-master-01 10.1.10.60:6443 check inter 2000 fall 3 rise 2
server plat-master-02 10.1.10.61:6443 check inter 2000 fall 3 rise 2
# 可选:拒绝未匹配的流量
backend reject-backend
mode tcp
server reject 127.0.0.1:8080 disabled # 禁用的服务器,用于拒绝请求
EOF
配置Keepalived(主节点10.1.10.5):
sudo tee /etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id K3S_INNER_LB_MASTER
}
# 业务控制平面VIP(10.1.10.10)
vrrp_instance VI_APP_API {
state MASTER
interface ens18 # 替换为实际网卡名(如enp0s3)
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass appApi123
}
virtual_ipaddress {
10.1.10.10/24 dev ens18
}
}
# 中间件控制平面VIP(10.1.10.11)
vrrp_instance VI_MID_API {
state MASTER
interface ens18
virtual_router_id 11
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass midApi123
}
virtual_ipaddress {
10.1.10.11/24 dev ens18
}
}
# platform控制平面VIP(10.1.10.12)
vrrp_instance VI_PLAT_API {
state MASTER
interface ens18
virtual_router_id 12
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass platApi123
}
virtual_ipaddress {
10.1.10.12/24 dev ens18
}
}
EOF
备节点10.1.10.6配置:
sudo tee /etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id K3S_INNER_LB_BACKUP
}
# 业务控制平面VIP(10.1.10.10)
vrrp_instance VI_APP_API {
state BACKUP
interface ens18
virtual_router_id 10
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass appApi123
}
virtual_ipaddress {
10.1.10.10/24 dev ens18
}
}
# 中间件控制平面VIP(10.1.10.11)
vrrp_instance VI_MID_API {
state BACKUP
interface ens18
virtual_router_id 11
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass midApi123
}
virtual_ipaddress {
10.1.10.11/24 dev ens18
}
}
# platform控制平面VIP(10.1.10.12)
vrrp_instance VI_PLAT_API {
state BACKUP
interface ens18
virtual_router_id 12
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass platApi123
}
virtual_ipaddress {
10.1.10.12/24 dev ens18
}
}
EOF
启动服务并验证:
# 重启服务生效
sudo systemctl restart haproxy keepalived
sudo systemctl enable haproxy keepalived
# 验证VIP绑定(主节点应显示10.1.10.10/11/12)
ip addr show ens18
# 验证HAProxy状态
sudo systemctl status haproxy
3.2 外部服务LB部署(192.168.192.75/76节点)
仅用于转发外部用户流量至Application集群的Ingress-nginx(10.2.10.201)。
安装HAProxy+Keepalived:
sudo apt install -y haproxy keepalived
允许 HAProxy 绑定到尚未分配给当前节点的 VIP:
# 临时生效(立即生效)
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
# 永久生效(重启后保留)
echo "net.ipv4.ip_nonlocal_bind=1" | tee -a /etc/sysctl.conf
sysctl -p # 加载配置
配置HAProxy:
cat <<EOF | tee /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
# 监控页面(绑定节点内网IP,不依赖VIP,方便内部访问)
listen stats
bind 10.1.10.7:9000 # 主LB内网IP(10.1.10.7);备LB改为10.1.10.8
mode http
stats enable
stats uri /
stats auth haproxy:haproxy
# HTTP服务(绑定VIP的80端口)
frontend http-front
bind 192.168.199.80:80 # VIP地址
mode tcp
default_backend ingress-http-back
# HTTPS服务(绑定VIP的443端口)
frontend https-ingress-front
bind 192.168.199.80:443 # VIP地址
mode tcp
default_backend ingress-https-back
# 后端配置(与之前一致)
backend ingress-http-back
mode tcp
balance roundrobin
server ingress-nginx 10.2.10.201:80 check inter 2000 fall 3 rise 2
backend ingress-https-back
mode tcp
balance roundrobin
server ingress-nginx 10.2.10.201:443 check inter 2000 fall 3 rise 2
EOF
配置Keepalived(主节点192.168.192.75):
cat <<EOF | tee /etc/keepalived/keepalived.conf
global_defs {
router_id K3S_OUTER_LB_MASTER
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens19
virtual_router_id 52 # 与内部LB不同ID
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 654321
}
virtual_ipaddress {
192.168.199.80/24 dev ens19 # 外部服务VIP
}
track_script {
check_haproxy
}
}
EOF
备节点192.168.192.76配置:
cat <<EOF | tee /etc/keepalived/keepalived.conf
global_defs {
router_id K3S_OUTER_LB_MASTER
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens19
virtual_router_id 52 # 与内部LB不同ID
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 654321
}
virtual_ipaddress {
192.168.199.80/24 dev ens19 # 外部服务VIP
}
track_script {
check_haproxy
}
}
EOF
启动服务并验证:
sudo systemctl restart haproxy keepalived
sudo systemctl enable haproxy keepalived
ip addr show ens19 # 验证VIP 192.168.192.80是否绑定(主节点)
第四章 数据库准备(外部独立MySQL)
所有集群的etcd数据通过外部MySQL存储(示例使用已有MySQL 192.168.192.175),Ubuntu节点连接MySQL无需额外配置,确保网络可达即可。
4.1 创建数据库与用户(MySQL服务器执行)
-- platform集群数据库及用户
CREATE DATABASE IF NOT EXISTS k3s_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'plat_db_user'@'10.1.10.60' IDENTIFIED BY 'K3s@Db2024';
CREATE USER IF NOT EXISTS 'plat_db_user'@'10.1.10.61' IDENTIFIED BY 'K3s@Db2024';
GRANT ALL PRIVILEGES ON k3s_platform.* TO 'plat_db_user'@'10.1.10.60';
GRANT ALL PRIVILEGES ON k3s_platform.* TO 'plat_db_user'@'10.1.10.61';
-- 中间件集群数据库及用户
CREATE DATABASE IF NOT EXISTS k3s_middleware CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'mid_db_user'@'10.1.10.50' IDENTIFIED BY 'K3s@Db2024';
CREATE USER IF NOT EXISTS 'mid_db_user'@'10.1.10.51' IDENTIFIED BY 'K3s@Db2024';
GRANT ALL PRIVILEGES ON k3s_middleware.* TO 'mid_db_user'@'10.1.10.50';
GRANT ALL PRIVILEGES ON k3s_middleware.* TO 'mid_db_user'@'10.1.10.51';
-- 业务集群数据库及用户
CREATE DATABASE IF NOT EXISTS k3s_application CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'app_db_user'@'10.1.10.40' IDENTIFIED BY 'K3s@Db2024';
CREATE USER IF NOT EXISTS 'app_db_user'@'10.1.10.41' IDENTIFIED BY 'K3s@Db2024';
GRANT ALL PRIVILEGES ON k3s_application.* TO 'app_db_user'@'10.1.10.40';
GRANT ALL PRIVILEGES ON k3s_application.* TO 'app_db_user'@'10.1.10.41';
FLUSH PRIVILEGES;
4.2 验证Ubuntu节点连接(各集群master节点执行)
# 安装MySQL客户端验证连接
sudo apt install -y mysql-client
mysql -u k3s_admin -p'K3s@Db2024' -h 192.168.192.175 # 成功登录即正常
第五章 Helm工具安装(所有集群master节点)
Helm是Kubernetes的包管理工具,用于简化Ingress-nginx、Rancher等组件部署。
5.1 安装Helm
# 下载Helm 3(Ubuntu与CentOS通用下载方式)
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod +x get_helm.sh
sudo ./get_helm.sh
# 验证安装
helm version # 应显示版本信息,如v3.14.0+g...
5.2 Helm基本操作与仓库配置
# 添加常用仓库(国内网络建议替换为镜像源)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add jetstack https://charts.jetstack.io
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update # 更新仓库索引
第六章 k3s集群部署
k3s在Ubuntu 24.04上的部署命令与CentOS一致,仅需确保依赖已安装。
- 下载离线安装包
wget https://get.k3s.io -O install.sh
wget https://github.com/k3s-io/k3s/releases/download/v1.33.5%2Bk3s1/k3s -O k3s
wget https://github.com/k3s-io/k3s/releases/download/v1.33.5%2Bk3s1/k3s-airgap-images-amd64.tar -O k3s-airgap-images-amd64.tar
备用地址:
https://wengtx.cn/scripts/k3s/v1.33.5+k3s1/install.sh
https://wengtx.cn/scripts/k3s/v1.33.5+k3s1/k3s
https://wengtx.cn/scripts/k3s/v1.33.5+k3s1/k3s-airgap-images-amd64.tar
- 复制
install.sh、k3s-airgap-images-amd64.tar和k3s到所有k3s节点的用户目录下并添加权限:
# 将 tar 文件放在images目录下
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
# 将 k3s 二进制文件放在 /usr/local/bin/k3s路径下
sudo cp ./k3s /usr/local/bin/
sudo chmod +x /usr/local/bin/k3s
chmod +x install.sh k3s