AWS EKS运行有状态应用Mysql8.0集(读写分离)
编写:袁泽龙 时间:2022.3.23
阅读本文时,我认为你已经具备kubernets基础,已经创建好了AWS EKS集,并且能够使用kubectl管理集。
1、概述
一般我们采用mysq作为数据库时,常用的是mysql5.x或mysql8.x版本。
数据库实例类型有单机版、高可用版、读写分离集版。 前两种都比较容易实现。
今天我们来实现mysql8.0.26版本的读写分离,并且同步复制时采用密码方式。
为了更好地适应生产环境,以及后续的便利性,我们需要用到namespace(ns)、Configmap(cm),Secret,Service(svc),StatefulSet(sts)。
首先,描述一下我们想要部署的“有状态应用”。
1.是一个“主从复制”(Maser-Slave Replication)的 MySQL 集;
2.有 1 个主节点(Master);有多个从节点(Slave);从节点需要能水平扩展;
3.所有的写操作,只能在主节点上执行;读操作可以在所有节点上执行。
这个主从模式的 MySQL 集非常典型。我们通过一张图来表示。
2、存储
如果是自建kubernetes集,你不懂golang开发的话,很难编写出CSI存储插件,存储类型可能会是你非常头疼的事情,但我们采用AWS EKS,这会让我们非常省心,因为AWS EKS已经帮我们做好了storageClass。采用storageClass,能够自动创建相应的pv和pvc,非常方便。
运行有状态应用Mysql,我们需要用到块存储,即AWS EBS。
AWS EBS存储类型有:io1,gp2,gp3,sc1,st1。默认值:gp2。
通过如下命令,可以查看AWS EKS帮我们做好的storageClass。默认只有gp2类型的,我们可以直接使用。
$ kubectl get storageclass #或 $kubectl get sc
#会输出如下内容
NAME PROVISIONER AGE
gp2 (default) kubernetes.io/aws-ebs 37m
这个storageClass非常容易实现,它是由gp2-storage-class.yaml这个文件生成的,内容如下:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2
annotations: storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
如果,你想用其它类型的StorageClass,可以将配置文件中的type,更改为其它,如gp3。通过如下命令,即可创建。
$ kubectl create -f gp2-storage-class.yaml
3、命名空间namespace
配置文件中,如果没有指定namespace,默认会自动使用default,在生产环境中,最好是单独创建个命名空间,创建方法
mysql-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mysql
接下来使用如下命令创建namespace
$kubectl create -f mysql-ns.yaml
记得在secret、statufulset文件中,加上如下一行。
metadata
namespace: mysql
4、密钥Secret
我们将数据库的帐号密码存在Secret中。
Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码的安全隐患。这个转码操作也很简单,比如:
$ echo -n 'root' |base64
cm9vdA==
$ echo -n '123456' |base64
MTIzNDU2
然后使用如下文件如 mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: prod-db-secret
namespace: mysql
type: Opaque
data:
password: MTIzNDU2
username: cm9vdA==
接下来,我们尝试一下创建这个 Secret:
$ kubectl create -f mysql-secret.yaml
5、配置ConfigMap
可能以前我们习惯在Deployment或Statufulset中写配置文件,我建议生产环境中,配置文件采用configmap。
做mysql读写分离时,Master 节点和 Slave 节点需要有不同的配置文件。
内容如下mysql-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
data:
masterf: |
[mysqld]
log-bin
slavef: |
[mysqld]
super-read-only
relay_log_info_repository=table
master_info_repository=table
relay_log_recovery = 1
接下来,我们尝试一下创建这个 configmap:
$ kubectl create -f mysql-configmap.yaml
如果你的程序是之前一直是在mysql5.7上运行,你可能会用到如下configMap
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论