用 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 埠即可。(防火牆記得開)