MySQL Operator for Kubernetes部署与应用
这是 Oracle 官方推出的 Operator,底层基于成熟的 MySQL InnoDB Cluster 架构
-
架构特点: 基于 MySQL Group Replication(组复制)技术,结合 MySQL Router 负责路由分发。
-
优势: “原汁原味”的官方支持,紧跟 MySQL 新特性。
-
适用场景: 团队对官方 MySQL 生态有执念,且希望使用 InnoDB Cluster 的场景。
-
复杂度: 中等偏上。
前提环境:
k8s集群+sc存储
安装 MySQL Operator
在 Master 节点上执行以下命令安装官方的 CRD 和 Operator 组件:
# 1. 安装 Custom Resource Definitions (CRDs)
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml
# 2. 安装 Operator 控制器及相关 RBAC 权限
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-operator.yaml
第一阶段:部署 MySQL 3节点高可用集群
1. 创建数据库 Root 密码 Secret
kubectl create secret generic mypw \
--from-literal=rootUser=root \
--from-literal=rootHost=% \
--from-literal=rootPassword="Asd147258,"
2. 编写 mysql-cluster.yaml 并部署
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mycluster
spec:
instances: 3
router:
instances: 1
secretName: mypw
tlsUseSelfSigned: true
mycnf: |
[mysqld]
innodb_buffer_pool_size=512M
max_connections=100
datadirVolumeClaimTemplate:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: managed-nfs-storage
执行部署并观察:
kubectl apply -f mysql-cluster.yaml
kubectl get pods -l mysql.oracle.com/cluster=mycluster -o wide -w
等待 mycluster-0, 1, 2 以及 router 全部变成 Running。

第二阶段:部署 wordpress服务进行测试
1. 拉起临时客户端连入主库:
kubectl run -it --rm --image=mysql:8.0 mysql-client -- mysql -h mycluster -uroot -p
(输入你的 MySQL root 密码)
2. 在 mysql> 提示符下执行:
-- 创建 wordpress 数据库
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'WordPress123!';
-- 赋予权限并刷新
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
FLUSH PRIVILEGES;
-- 退出终端
exit
3. 创建文件 wordpress.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: "mycluster:6446" # 对接高可用 Router 端口
- name: WORDPRESS_DB_USER
value: "wordpress"
- name: WORDPRESS_DB_PASSWORD
value: "WordPress123!"
- name: WORDPRESS_DB_NAME
value: "wordpress"
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 依然使用 30080 端口暴露到宿主机
selector:
app: wordpress
4. 执行部署:
kubectl apply -f wordpress.yaml
打开浏览器访问:http://<你任意K8s节点的IP>:30080

-
安装成功后,进入 WordPress 后台,点击“写文章”。
-
回到你的终端,删掉当前的主节点:
kubectl delete pod mycluster-0
立刻切回浏览器,点击“发布”文章。


因为 WordPress 走的是 6446 端口,Router 会在底层瞬间把流量切换到新的主节点,你的文章依然可以丝滑发布成功,业务完全不中断,我在断开前写了个11标题文章,断开后写了个322标题的文章,结果就是没有问题

可以看到mycluster-1已经自动成为了PRIMARY主库
当mycluster-0恢复后就会自动加入集群成为从库

更多推荐




所有评论(0)