下面是使用 Kubernetes Operator 部署 MySQL 多云高可用架构的 两种模式配置模板和步骤:
✅ 一、基础前提
-
多云环境可以通过以下方式互通:
- 专线/VPN/VPC Peering
- DNS 全局解析或 Consul 服务发现
-
存储类建议使用区域可用的分布式存储(如 Longhorn, Ceph, EBS with replication)
✅ 二、方案一:1 套 Kubernetes 多云容灾(跨云节点)
特点: 同一个 K8s 集群中,有节点部署在不同云(通过 node affinity 调度)。
🔧 架构设计
Kubernetes 集群(混合云节点)
├── 云A Node
│ └── MySQL 主库 Pod(主节点调度)
├── 云B Node
│ └── MySQL 从库 Pod
├── Operator Pod(全局控制)
└── ProxySQL Pod(读写分离)
📦 配置模板(以 Bitnami MySQL Operator 为例)
1. 安装 Operator
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install mysql-operator bitnami/mysql-operator --namespace mysql-operator --create-namespace
2. 创建 MySQLCluster(含 NodeSelector)
apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
name: my-db
namespace: mysql
spec:
replicas: 3
secretName: my-db-secret
mysqlVersion: "8.0"
# 云A主库调度规则
podSpec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
topologyKey: "kubernetes.io/hostname"
labelSelector:
matchLabels:
app.kubernetes.io/name: my-db
nodeSelector:
cloud-provider: aliyun # 主库放阿里云节点
3. ProxySQL + Service 统一流量入口
apiVersion: v1
kind: Service
metadata:
name: mysql-router
spec:
selector:
app.kubernetes.io/name: mysql-router
ports:
- port: 3306
targetPort: 3306
type: LoadBalancer
4. 高可用策略(控制切换)
- Operator 内置支持检测主库状态、自动 Failover。
- 配合 Operator Metrics + Prometheus 可增强可观测性。
✅ 三、方案二:2 套 Kubernetes 集群(双云独立)
特点: 云 A、云 B 各自一套 K8s,通过 MySQL 复制、外部服务暴露,结合 Orchestrator 实现跨云同步与切换。
🔧 架构设计
[ 云A K8s ]
├── MySQL 主库(StatefulSet)
├── ProxySQL 服务
└── Orchestrator Agent(连云B)
⇅ binlog+GTID复制
[ 云B K8s ]
├── MySQL 备库(StatefulSet)
├── ProxySQL 服务
└── Orchestrator Agent(连云A)
📦 步骤详解
1️⃣ 各云部署 Operator 与 MySQL StatefulSet
helm install mysql-operator bitnami/mysql-operator --namespace mysql-operator
apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
name: mysql-cloudA
namespace: mysql
spec:
replicas: 1
secretName: mysql-secret
mysqlVersion: "8.0"
podSpec:
nodeSelector:
cloud: cloudA
2️⃣ 主库开启 binlog + GTID,备库配置外部 replication 连接
# 云B备库连接云A的主库(通过公网IP或专线域名)
replicationSource:
host: mysql.cloudA.example.com
user: repl
passwordSecretName: repl-secret
3️⃣ Orchestrator 独立部署(可混部也可自建 VM)
- 可将其部署为 K8s Deployment + PVC,连接两边数据库。
- 配置 failover webhook,将主库变化通知 ProxySQL、Consul、DNS 更新。
4️⃣ 跨集群 ProxySQL 统一接入层部署
apiVersion: v1
kind: Service
metadata:
name: mysql-gateway
spec:
type: LoadBalancer
ports:
- port: 3306
selector:
app: proxysql
通过主从角色切换,由 Operator + Orchestrator 协同更新 ProxySQL 后端。
✅ 四、差异对比总结
维度 | 1 套 K8s(混部) | 2 套 K8s(跨集群) |
---|---|---|
运维复杂度 | 较低 | 高 |
网络延迟 | 较低(内网) | 高(公网或专线) |
主从同步 | 本地同步(快) | 需公网访问或专线 |
切换机制 | Operator 自动 | Orchestrator + ProxySQL |
高可用性 | 容灾有限 | 更强(区域级) |
推荐场景 | 混合云 / 多 AZ | 跨云容灾,企业级要求 |