前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Operator在K8S部署MySQL

使用Operator在K8S部署MySQL

作者头像
运维部落
发布2022-01-18 10:45:03
5.3K1
发布2022-01-18 10:45:03
举报
文章被收录于专栏:运维部落运维部落

使用Operator在K8S部署MySQL

  • 一. 本文概述
    • 1.1 技术选型
    • 1.2 全文实操内容如下
  • 二. 本文主要术语及工具版本
  • 三. 添加Bitpoke源及安装Operator
  • 四. MySQL单实例安装
    • 4.1 自动备份及恢复验证
    • 4.2 NFS存储验证
  • 五. MySQL集群安装
    • 5.1 高可用及主从复制验证
  • 六. 参考资料

一. 本文概述

目前研究如何在K8S上使用MySQL Operator对MySQL进行部署及管理,汇总研究过程形成此文,分享出来希望能对学习者提供帮助,若有建议请不吝指出。

1.1 技术选型

当前主要有Oracle MySQL Operator和Presslabs MySQL Operator两种方案,前者由Oracle官方发布,使用MGR架构,目前仅支持MySQL 8.0+且缺少维护;后者则由Bitpoke进行维护,支持MySQL 5.7 、提供备份恢复和基于Orchestrator实现高可用等功能,本文基于后者编写。

1.2 全文实操内容如下

  1. MySQL单实例上基于Amazon s3定时进行云端备份,利用备份的数据进行恢复验证备份有效性。
  2. 部署MySQL单实例 + NFS存储,当Pod故障且无法被拉起时,在新Node启动的Pod借助NFS可读取原主实例写入的数据。
  3. 部署MySQL集群,一主两从架构,验证高可用及主从复制的有效性。

二. 本文主要术语及工具版本

  1. Kubernetes Operator: 是一种封装、部署和管理 Kubernetes 应用的方法。我们使用 Kubernetes API(应用编程接口)和 kubectl 工具在 Kubernetes 上部署并管理 Kubernetes 应用。
  2. Helm:是Kubernetes的包管理器,类似于Centos的yum,主要用来管理 Charts。
  3. Helm Charts: 是用来封装Kubernetes原生应用程序的一系列YAML文件,可在部署应用时自定义应用程序的Metadata。
  4. Helm version : v3.2.4
  5. Kubernetes version: v1.19.12
  6. MySQL version: v5.7.31
  7. 系统版本:CentOS Linux release 7.9.2009 (Core)

三. 添加Bitpoke源及安装Operator

  1. 此PV用于安装Bitpoke MySQL Operator
代码语言:javascript
复制
[root@65-89-master]# cat pv.yaml 

apiVersion: v1

kind: PersistentVolume

metadata:

 name: pv-normal0

 labels:

  type: local

spec:

 capacity:

  storage: 10Gi

 accessModes:

  - ReadWriteOnce

 hostPath:

path: "/data/pv0"
  1. 创建PV
代码语言:javascript
复制
[root@65-89-master]# kubectl apply -f pv.yaml

persistentvolume/pv-normal0 created
  1. 确认PV已创建
代码语言:javascript
复制
[root@65-89-master ~]# kubectl get pv

NAME CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS   CLAIM  STORAGECLASS  REASON  AGE

pv-normal0  10Gi    RWO       Retain      Available                                 39h
  1. 添加helm repo进行并update
代码语言:javascript
复制
helm repo add bitpoke https://helm-charts.bitpoke.io

helm update
  1. 安装mysql-operator,以下根据helm版本二选一,本文为v3
代码语言:javascript
复制
# helm v2

helm install bitpoke/mysql-operator --name mysql-operator --create-namespace

# helm v3 

helm install mysql-operator bitpoke/mysql-operator -n mysql-operator --create-namespace
  1. 确认mysql-operator状态为Running
代码语言:javascript
复制
[root@65-89-master ~]# kubectl get pod -n mysql-operator

NAME              READY  STATUS  RESTARTS  AGE

mysql-operator-0   2/2   Running  0        39h

四. MySQL单实例安装

  1. 将明文密码进行base64格式编码
代码语言:javascript
复制
[root@65-89-master single]# echo -n 'ZZQzzq123' | base64

WlpRenpxMTIz
  1. 将编码后的字符设置为MySQL中root用户的密码
代码语言:javascript
复制
[root@65-89-master single]# cat secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: my-secret

namespace: mysql-operator

type: Opaque

data:

ROOT_PASSWORD: WlpRenpxMTIz
  1. 创建MySQL secret
代码语言:javascript
复制
[root@65-89-master single]# kubectl apply -f secret.yaml

secret/my-secret created
  1. 查看Amazon s3 secret
代码语言:javascript
复制
[root@65-89-master single]# cat example-backup-secret.yaml 

apiVersion: v1

kind: Secret

metadata:

name: my-cluster-backup-secret

namespace: mysql-operator

type: Opaque

data:

AWS_ACCESS_KEY_ID: QU************************

AWS_SECRET_ACCESS_KEY: ME9B****************
  1. 创建Amazon s3 secret
代码语言:javascript
复制
[root@65-89-master single]# kubectl apply -f example-backup-secret.yaml

secret/my-cluster-backup-secret created
  1. 确认secret已创建
代码语言:javascript
复制
NAME                         TYPE                                    DATA  AGE

default-token-b5jbh          kubernetes.io/service-account-token     3    4d18h

my-cluster-backup-secret     Opaque                                  2    99m

my-secret                    Opaque                                  1    3d3h 
  1. 查看PV,使用此前已创建的NFS服务
代码语言:javascript
复制
[root@65-89-master single]# cat pv-nfs.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-nfs0

spec:

capacity:

storage: 10Gi

volumeMode: Filesystem

accessModes:

ReadWriteOnce

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /nfs/mysql

server: 10.186.65.89
  1. 创建PV
代码语言:javascript
复制
[root@65-89-master single]# kubectl apply -f pv-nfs.yaml

persistentvolume/mysql-nfs0 created
  1. 确认PV就绪
代码语言:javascript
复制
NAME  CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS   CLAIM  STORAGECLASS  REASON  AGE

mysql-nfs0  10Gi    RWO      Retain     Available                 nfs                12s

pv-normal0  10Gi    RWO      Retain     Bound  mysql-operator/data-mysql-operator-0   40h
  1. 查看MySQL单实例配置文件
  • 每天15:46自动生成s3备份
代码语言:javascript
复制
[root@65-89-master single]# cat single.yaml

apiVersion: mysql.presslabs.org/v1alpha1

kind: MysqlCluster

metadata:

name: single

namespace: mysql-operator

spec:

mysqlVersion: "5.7"

replicas: 1

secretName: my-secret

backupSchedule: "46 15 * * *"   

backupURL: s3://evan-zheng-***************************  

backupSecretName: my-cluster-backup-secret 

backupRemoteDeletePolicy: retain  

mysqlConf:

max_allowed_packet: "512M" 

volumeSpec:

persistentVolumeClaim:

storageClassName: nfs

accessModes:

ReadWriteOnce

resources:

requests:

storage: 10Gi
  1. 创建MySQL单实例
代码语言:javascript
复制
[root@65-89-master single]# kubectl apply -f single.yaml

mysqlcluster.mysql.presslabs.org/single created
  1. 查看pod状态为Running
代码语言:javascript
复制
[root@65-89-master single]# kubectl get pod -n mysql-operator

NAME        READY  STATUS  RESTARTS  AGE

mysql-operator-0  2/2   Running  0     39h

single-mysql-0    4/4   Running  0     5m15s
  1. 确认MySQL状态为True
代码语言:javascript
复制
[root@65-89-master single]# kubectl get mysql -n mysql-operator

NAME   READY  REPLICAS  AGE

single    True    1     5m35s
  1. 进入MySQL 的pod,创建库表并插入数据。
代码语言:javascript
复制
[root@65-89-master single]# kubectl exec -it single-mysql-0 -n mysql-operator /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulting container name to mysql.
Use 'kubectl describe pod/single-mysql-0 -n mysql-operator' to see all of the containers in this pod.
bash-4.2$ mysql -uroot -p'ZZQzzq123'

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 485

Server version: 5.7.31-34-log Percona Server (GPL), Release 34, Revision 2e68637

Copyright (c) 2009-2020 Percona LLC and/or its affiliates

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database quan;

Query OK, 1 row affected (0.05 sec)

mysql> use quan

Database changed

mysql> create table test(id int);

Query OK, 0 rows affected (0.15 sec)

mysql> insert into test values(1),(2),(3);

Query OK, 3 rows affected (0.01 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> 

mysql> select * from test;

+------+

| id  |

+------+

|  1 |

|  2 |

|  3 |

+------+

3 rows in set (0.00 sec)

4.1 自动备份及恢复验证

  1. 确认自动自动备份已生成
代码语言:javascript
复制
[root@65-89-master s3-bak]# kubectl get mysqlbackup -n mysql-operator

NAME                              AGE

single-auto-2021-12-29t08-15-46   28m
  1. 登录Amazon s3确认bucket已生成备份文件
  1. 复制备份文件S3 URI
  1. 基于云端备份恢复实例
代码语言:javascript
复制
[root@65-89-master single]# cat recovery.yaml 

apiVersion: mysql.presslabs.org/v1alpha1

kind: MysqlCluster

metadata:

 name: rec-cluster

 namespace: mysql-operator

spec:

 secretName: my-secret

 initBucketURL: s3://evan-zheng-bucket/single-auto-2021-12-29t08-15-46.xbackup.gz

 initBucketSecretName: my-cluster-backup-secret
  1. 创建“恢复”实例
代码语言:javascript
复制
[root@65-89-master s3-bak]# kubectl apply -f recovery.yaml

mysqlbackup.mysql.presslabs.org/rec-cluster created
  1. 确认实例状态为Running
代码语言:javascript
复制
[root@65-89-master single]# kubectl get pod -n mysql-operator

NAME                               READY  STATUS   RESTARTS  AGE

rec-cluster-mysql-0                4/4    Running   0        2m16s
  1. 验证恢复数据
代码语言:javascript
复制
[root@65-89-master single]#  kubectl exec -it rec-cluster-mysql-0 -n mysql-operator /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

Defaulting container name to mysql.

Use 'kubectl describe pod/rec-cluster-mysql-0 -n mysql-operator' to see all of the containers in this pod.

bash-4.2$ 

bash-4.2$ mysql -uroot -p'ZZQzzq123' -e 'use quan; select * from test;'

mysql: [Warning] Using a password on the command line interface can be insecure.

+------+

| id  |

+------+

|  1 |

|  2 |

|  3 |

+------+

4.2 NFS存储验证

  1. 查看当前pod所在node为65-37
代码语言:javascript
复制
[root@65-89-master single]# kubectl describe pod single-mysql-0 -n mysql-operator | grep node

Node:     65-37-node2/10.186.65.37
  1. 使65-37不参与调度
代码语言:javascript
复制
[root@65-89-master single]# kubectl cordon 65-37-node2

node/65-37-node2 cordoned
  1. 确认65-37不参与调度
代码语言:javascript
复制
[root@65-89-master single]# kubectl get node

NAME          STATUS                    ROLES           AGE     VERSION

65-37-node2   Ready,SchedulingDisabled  worker           2d17h  v1.19.16

65-70-node1   Ready                     worker           2d17h  v1.19.16

65-89-master  Ready           controlplane,etcd,worker   2d17h  v1.19.16
  1. 删除MySQL当前pod
代码语言:javascript
复制
[root@65-89-master single]# kubectl delete pod single-mysql-0 -n mysql-operator

pod "single-mysql-0" deleted
  1. 查看pod已自动重新初始化
代码语言:javascript
复制
[root@65-89-master single]# kubectl get pod -n mysql-operator

NAME             READY  STATUS           RESTARTS    AGE

mysql-operator-0  2/2   Running           0          40h

single-mysql-0    0/4   PodInitializing   0          16s
  1. 查看当前pod所在node已变更为65-70
代码语言:javascript
复制
[root@65-89-master single]# kubectl describe pod single-mysql-0 -n mysql-operator | grep node

Node:     65-70-node1/10.186.65.70
  1. 进入pod并确认此前插入的数据仍旧存在
代码语言:javascript
复制
[root@65-89-master single]# kubectl exec -it single-mysql-0 -n mysql-operator /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

Defaulting container name to mysql.

Use 'kubectl describe pod/single-mysql-0 -n mysql-operator' to see all of the containers in this pod.

bash-4.2$ 

bash-4.2$ mysql -uroot -p'ZZQzzq123' -e 'select * from quan.test;'

mysql: [Warning] Using a password on the command line interface can be insecure.

+------+

| id  |

+------+

|  1 |

|  2 |

|  3 |

+------+
  1. 使65-37参与调度
代码语言:javascript
复制
[root@65-89-master single]# kubectl uncordon 65-37-node2

node/65-37-node2 uncordoned
  1. 确认65-37可参与调度
代码语言:javascript
复制
[root@65-89-master single]# kubectl get node

NAME          STATUS   ROLES                   AGE      VERSION

65-37-node2   Ready    worker                  2d17h    v1.19.16

65-70-node1   Ready    worker                  2d17h    v1.19.16

65-89-master  Ready  controlplane,etcd,worker  2d17h    v1.19.16

五. MySQL集群安装

  1. 查看MySQL集群PV文件
代码语言:javascript
复制
[root@65-89-master cluster]# cat pv-manu.yaml 

apiVersion: v1

kind: PersistentVolume

metadata:

 name: pv-mysql1

 labels:

  type: local

spec:

 storageClassName: manual

 capacity:

  storage: 10Gi

 accessModes:

  - ReadWriteOnce

 hostPath:

  path: "/data/mydata"

 
---

apiVersion: v1

kind: PersistentVolume

metadata:

 name: pv-mysql2

 labels:

  type: local

spec:

 storageClassName: manual

 capacity:

  storage: 10Gi

 accessModes:

  - ReadWriteOnce

 hostPath:

  path: "/data/mydata"
 

---

apiVersion: v1

kind: PersistentVolume

metadata:

 name: pv-mysql3

 labels:

  type: local

spec:

 storageClassName: manual

 capacity:

  storage: 10Gi

 accessModes:

  - ReadWriteOnce

 hostPath:

path: "/data/mydata"
  1. 创建及确认PV状态不再赘述
  2. 查看MySQL集群配置文件
代码语言:javascript
复制
[root@65-89-master cluster]# cat clu.yaml 

apiVersion: mysql.presslabs.org/v1alpha1

kind: MysqlCluster

metadata:

 name: mysql-cluster

 namespace: mysql-operator

spec:

 mysqlVersion: "5.7"

 replicas: 3

 secretName: my-secret

 mysqlConf:

  max_allowed_packet: "512M" 

 volumeSpec:

  persistentVolumeClaim:

   storageClassName: manual

   accessModes:

   - ReadWriteOnce

   resources:

     requests:

      storage: 10Gi
  1. 创建MySQL集群
代码语言:javascript
复制
[root@65-89-master cluster]# kubectl apply -f clu.yaml

mysqlcluster.mysql.presslabs.org/mysql-cluster created
  1. 确认pod均已Running
代码语言:javascript
复制
[root@65-89-master cluster]# kubectl get pod -n mysql-operator

NAME                     READY  STATUS   RESTARTS  AGE

mysql-cluster-mysql-0    4/4    Running   0        17m

mysql-cluster-mysql-1    4/4    Running   0        36m

mysql-cluster-mysql-2    4/4    Running   0        35m

mysql-operator-0         2/2    Running   0        40h
  1. 进入pod mysql-cluster-mysql-0确认其为Master
代码语言:javascript
复制
root@65-89-master cluster]# kubectl exec -it mysql-cluster-mysql-0 -n mysql-operator /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

Defaulting container name to mysql.

Use 'kubectl describe pod/mysql-cluster-mysql-0 -n mysql-operator' to see all of the containers in this pod.

bash-4.2$

bash-4.2$ mysql -uroot -p'ZZQzzq123' -e 'show slave status\G'

mysql: [Warning] Using a password on the command line interface can be insecure.

bash-4.2$ 

5.1 高可用及主从复制验证

  1. 删除Master引发主从切换,验证高可用有效性
代码语言:javascript
复制
[root@65-89-master cluster]# kubectl delete pod mysql-cluster-mysql-0 -n mysql-operator | grep mysql

pod "mysql-cluster-mysql-0" deleted
  1. 此时mysql-cluster-mysql-1已成为Master,在其创建库表并插入数据。
代码语言:javascript
复制
[root@65-89-master ~]# kubectl exec -it mysql-cluster-mysql-1 -n mysql-operator /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

Defaulting container name to mysql.

Use 'kubectl describe pod/mysql-cluster-mysql-1 -n mysql-operator' to see all of the containers in this pod.

bash-4.2$  

bash-4.2$ mysql -uroot -p'ZZQzzq123' -e 'show slave status\G'

mysql: [Warning] Using a password on the command line interface can be insecure.

bash-4.2$ 

bash-4.2$ mysql -uroot -p'ZZQzzq123' -e 'create database cluster; use cluster; create table demo(id int); insert into demo values(4),(5),(6);select * from demo;'

mysql: [Warning] Using a password on the command line interface can be insecure.

+------+

| id  |

+------+

|  4 |

|  5 |

|  6 |

+------+

bash-4.2$
  1. 进入Slave mysql-cluster-mysql-2查询主库创建的数据
代码语言:javascript
复制
[root@65-89-master ~]# kubectl exec -it mysql-cluster-mysql-2 -n mysql-operator /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

Defaulting container name to mysql.

Use 'kubectl describe pod/mysql-cluster-mysql-2 -n mysql-operator' to see all of the containers in this pod.

bash-4.2$

bash-4.2$ mysql -uroot -p'ZZQzzq123' -e 'select * from cluster.demo;'

mysql: [Warning] Using a password on the command line interface can be insecure.

+------+

| id  |

+------+

|  4 |

|  5 |

|  6 |

+------+
  1. 结论:高可用有效,且主从复制正常。

六. 参考资料

https://github.com/mysql/mysql-operator

https://github.com/bitpoke/mysql-operator

https://www.bitpoke.io/docs/mysql-operator/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Operator在K8S部署MySQL
    • 一. 本文概述
      • 1.1 技术选型
      • 1.2 全文实操内容如下
    • 二. 本文主要术语及工具版本
      • 三. 添加Bitpoke源及安装Operator
        • 四. MySQL单实例安装
          • 4.1 自动备份及恢复验证
          • 4.2 NFS存储验证
        • 五. MySQL集群安装
          • 5.1 高可用及主从复制验证
        • 六. 参考资料
        相关产品与服务
        云数据库 SQL Server
        腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档