用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问
theme: v-green
本文正在参加「金石计划」
小伙伴们好呀,我是 4ye,上文分享了 《用 k8s+Ingress+Traefik 搭建一个外网可以访问的 Web 服务》
这次来分享下 用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问
文章内容比较简单,主要是记录搭建的步骤和一些配置文件(转眼就忘,只能写写先了 😱)
核心一览
- Helm 的使用
- NFS 搭建
- 配置文件
- 一点心得
简单回忆下这个运行环境 👇(很烦,感觉给自己挖了个大坑🕳/(ㄒ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 端口即可。(防火墙记得开)