小伙伴们好呀,我是 小羊,上文分享了 《用 k8s+Ingress+Traefik 搭建一个外网可以访问的 Web 服务》
这次来分享下 用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问
简单回忆下这个运行环境 👇(很烦,感觉给自己挖了个大坑🕳/(ㄒoㄒ)/~~)
宿主机 > Traefik > Minikube > Ingress > Service > Pod
官网快速上手👉 https://helm.sh/zh/docs/intro/quickstart/
下载地址 : https://github.com/helm/helm/releases
tar -zxvf helm-v3.10.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/helm
简单了解这几个概念后,我们先来添加官方的 Repository
helm repo add bitnami https://charts.bitnami.com/bitnami
这一步,就是在安装 Chart 了,运行起来后,就变成 Release 了。
helm install mysql bitnami/mysql
到了这里,MySQL 已经运行在 k8s 上了。
可以通过 k8s 的 dashboard 查看。
使用体验真的非常好!之前使用 k8s 时,经常得创建各种 deployment,service,statefulSet 等等,会有很多 yaml 文件,管理起来也比较难。而这个包管理器中,有很多大佬配置好的案例,我们可以直接拿过来用,根据自己的需要稍微改下配置就可以了。
https://github.com/bitnami/charts
这里,我们找到相应的 chart 后,看看它的 README.md 介绍,里面有很多配置项的介绍,
这里,我就不细说了,直接给大家看我的配置了。
一主一从
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 服务器
#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
这里 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
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
参考 https://blog.csdn.net/skh2015java/article/details/109228364
有三种类型
用这个就可以生成
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: ***
helm uninstall 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 进行转发,从外部调试了🐖(后面有时间再来研究下这个网络了 /(ㄒoㄒ)/~~ )
kubectl port-forward --address 0.0.0.0 service/mysql-primary 8006:3306 -n prod
最后利用 SQL工具连接宿主机的 8006 端口即可。(防火墙记得开)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。