用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问

语言: CN / TW / HK

theme: v-green

本文正在参加「金石计划」

小伙伴们好呀,我是 4ye,上文分享了 《用 k8s+Ingress+Traefik 搭建一个外网可以访问的 Web 服务》

这次来分享下 用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问

文章内容比较简单,主要是记录搭建的步骤和一些配置文件(转眼就忘,只能写写先了 😱)

核心一览

  1. Helm 的使用
  2. NFS 搭建
  3. 配置文件
  4. 一点心得

简单回忆下这个运行环境 👇(很烦,感觉给自己挖了个大坑🕳/(ㄒoㄒ)/~~)

宿主机 > Traefik > Minikube > Ingress > Service > Pod

helm

官网快速上手👉 http://helm.sh/zh/docs/intro/quickstart/

安装

下载地址 : http://github.com/helm/helm/releases

tar -zxvf helm-v3.10.1-linux-amd64.tar.gz cp linux-amd64/helm /usr/local/bin/helm

安装成功

三大概念

  • Chart 代表着 Helm 包。
  • Repository(仓库)是用来存放和共享 charts 的地方
  • Release 是运行在 Kubernetes 集群中的 chart 的实例

简单了解这几个概念后,我们先来添加官方的 Repository

helm repo add bitnami http://charts.bitnami.com/bitnami

这一步,就是在安装 Chart 了,运行起来后,就变成 Release 了。

helm install mysql bitnami/mysql

到了这里,MySQL 已经运行在 k8s 上了。

可以通过 k8s 的 dashboard 查看。

使用体验真的非常好!之前使用 k8s 时,经常得创建各种 deployment,service,statefulSet 等等,会有很多 yaml 文件,管理起来也比较难。而这个包管理器中,有很多大佬配置好的案例,我们可以直接拿过来用,根据自己的需要稍微改下配置就可以了。

charts

http://github.com/bitnami/charts

这里,我们找到相应的 chart 后,看看它的 README.md 介绍,里面有很多配置项的介绍,

这里,我就不细说了,直接给大家看我的配置了。

MySQL config.yaml

一主一从

namespaceOverride: "prod" architecture: "replication" auth: createDatabase: true database: "prod_db" username: "java4ye" existingSecret: "mysql-secret" primary: service: type: NodePort persistence: storageClass: "nfs-mysql" size: "10Gi" accessModes: - "ReadWriteMany" extraEnvVars: - name: TZ value: "Asia/Shanghai" secondary: name: slave extraEnvVars: - name: TZ value: "Asia/Shanghai" service: type: NodePort replicaCount: 1 persistence: storageClass: "nfs-mysql-slave" size: "10Gi" accessModes: - "ReadWriteMany" resources: limits: cpu: 1000m memory: 1Gi requests: cpu: 500m memory: 512Mi

这里还要去创建 pv,pvc 和 secret 。

我并没有去创建 storageClass,都是使用静态的 pv 和 pvc,目前还很正常,如果有坑的话。。再来填了🐖

为了将数据持久化到宿主机,还得简单搭建下这个 nfs 服务器。

nfs

搭建 NFS 服务器

```

master节点安装nfs

yum -y install nfs-utils

创建nfs目录

mkdir -p /home/yang4ye/nfs

修改权限

chmod -R 777 /home/yang4ye/nfs

编辑export文件

vim /etc/exports /nfs/data *(rw,no_root_squash,sync)

配置生效

exportfs -r

查看生效

exportfs

启动rpcbind、nfs服务

systemctl restart rpcbind && systemctl enable rpcbind systemctl restart nfs-server && systemctl enable nfs-server

查看 RPC 服务的注册状况

rpcinfo -p localhost

showmount测试

showmount -e

至此 NFS 服务器搭建完成,目录为 /home/yang4ye/nfs ```

pv

这里 nfs 路径需要手动创建

apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv namespace: prod labels: storage: pv spec: storageClassName: "nfs-mysql" accessModes: - ReadWriteMany capacity: storage: 10Gi persistentVolumeReclaimPolicy: Recycle nfs: path: /home/yang4ye/nfs/mysql server: 10.0.8.8

apiVersion: v1 kind: PersistentVolume metadata: name: mysql-slave-pv namespace: prod labels: storage: pv spec: storageClassName: "nfs-mysql-slave" accessModes: - ReadWriteMany capacity: storage: 10Gi persistentVolumeReclaimPolicy: Recycle nfs: path: /home/yang4ye/nfs/mysql-slave server: 10.0.8.8

pvc

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc namespace: prod spec: storageClassName: "nfs-mysql" accessModes: - ReadWriteMany volumeName: "mysql-pv" resources: requests: storage: 10Gi

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc namespace: prod spec: storageClassName: "nfs-mysql-slave" accessModes: - ReadWriteMany volumeName: "mysql-salve-pv" resources: requests: storage: 10Gi

secret

参考 http://blog.csdn.net/skh2015java/article/details/109228364

有三种类型

  • Opaque:base64 编码格式的 Secret
  • Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
  • kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息。

用这个就可以生成

echo -n '123456' | base64

apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: prod type: Opaque data: mysql-root-password: *** mysql-password: *** mysql-replication-password: ***

删除 MySQL

helm uninstall mysql

启动 MySQL

指定配置文件,启动即可。

helm install mysql bitnami/mysql --namespace prod -f config.yaml

可以通过该命令再次获取详细信息

helm get all mysql --namespace prod

到这里,MySQL 主从集群就搭建好了。

启动成功后会有提示的,可以根据命令简单测试下。

接着,就是将服务暴露出去,方便我们用其他 sql 工具连接操作。

这一步,卡了我好些天了,我到现在也不确定是 Traefik 的 tcp 代理有问题呢。。还是 MySQL 的一个老 bug,还是说我搭建的这个网络环境比较复杂,毕竟 Minikube 上还有个 Ingress 。

port-forward

只能先退一步,用 port-forward 进行转发,从外部调试了🐖(后面有时间再来研究下这个网络了 /(ㄒoㄒ)/~~ )

kubectl port-forward --address 0.0.0.0 service/mysql-primary 8006:3306 -n prod

最后利用 SQL工具连接宿主机的 8006 端口即可。(防火墙记得开)