前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问

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

原创
作者头像
Java4ye
发布2024-02-05 09:52:55
6900
发布2024-02-05 09:52:55
举报
文章被收录于专栏:云原生云原生

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

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

核心一览

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

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

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

helm

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

安装

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

代码语言:sh
复制
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

代码语言:sh
复制
helm repo add bitnami https://charts.bitnami.com/bitnami

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

代码语言:sh
复制
helm install  mysql bitnami/mysql

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

可以通过 k8s 的 dashboard 查看。

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

charts

https://github.com/bitnami/charts

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

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

MySQL config.yaml

一主一从

代码语言: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 服务器

代码语言:sh
复制
#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 路径需要手动创建

代码语言:yaml
复制
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
代码语言:yaml
复制
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

代码语言:yaml
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: prod
spec:
  storageClassName: "nfs-mysql"
  accessModes:
    - ReadWriteMany
  volumeName: "mysql-pv"
  resources:
    requests:
      storage: 10Gi
代码语言:yaml
复制
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

参考 https://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的认证信息。

用这个就可以生成

代码语言:sh
复制
echo -n '123456' | base64
代码语言:yaml
复制
apiVersion: v1
kind: Secret
metadata: 
  name: mysql-secret
  namespace: prod
type: Opaque
data:  
  mysql-root-password: ***
  mysql-password: ***
  mysql-replication-password: ***

删除 MySQL

代码语言:sh
复制
helm uninstall mysql

启动 MySQL

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

代码语言:sh
复制
helm install  mysql bitnami/mysql --namespace prod -f config.yaml

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

代码语言:sh
复制
helm get all mysql --namespace prod

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

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

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

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

port-forward

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

代码语言:sh
复制
kubectl port-forward --address 0.0.0.0 service/mysql-primary  8006:3306 -n prod

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

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 核心一览
  • helm
    • 安装
      • 三大概念
        • charts
        • MySQL config.yaml
        • nfs
        • pv
        • pvc
        • secret
        • 删除 MySQL
        • 启动 MySQL
        • port-forward
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档