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