前言
本文使用helm啟動mysql-ha
*我的其他相關(guān)文章:
《docker-compose啟動mysql》
《k8s啟動單點mysql》
《helm啟動單節(jié)點mysql》
《k8s啟動phpmyadmin》
1. 下載cart包
- 查找可用chart
# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
aliyuncs/mysql 6.8.0 8.0.19 Chart to create a Highly available MySQL cluster
aliyuncs/mysqldump 2.6.0 2.4.1 A Helm chart to help backup MySQL databases usi...
aliyuncs/mysqlha 1.0.0 5.7.13 MySQL cluster with a single master and zero or ...
說明: aliyuncs/mysql 這個是單機的能岩, aliyuncs/mysqlha 這個是HA的
- 下載chart
# helm fetch aliyuncs/mysqlha --untar --untardir ./
說明:加了兩個參數(shù)源请,不下載tar包喊暖,直接是目錄殖告。
2. 修改配置文件
按需求修改 values.yaml
即可笔咽。
2.1 修改鏡像(離線部署需要)
如果不能連接公網(wǎng)敲长,將鏡像下載后上傳私有倉庫砰逻,在配置文件中修改如下兩處為私有倉庫鏡像乘陪。
mysqlImage: harbocto.xxx.com.cn/public/mysql:5.7.13
xtraBackupImage: harbocto.xxx.com.cn/public/gcr-xtrabackup:1.0
2.2 用戶名密碼
本次只修改了root密碼,其他見下文說明
mysqlha:
replicaCount: 3
## Password for MySQL root user
##
# mysqlRootPassword: ## Default: random 10 character string
mysqlRootPassword: Bxx888888
## Username/password for MySQL replication user
##
mysqlReplicationUser: repl
# mysqlReplicationPassword:
## Create a database user
##
# mysqlUser:
# mysqlPassword: ## Default: random 10 character string
## Allow unauthenticated access, uncomment to enable
##
# mysqlAllowEmptyPassword: true
## Create database with name and grant all permissions to user on startup, if needed
# mysqlDatabase:
## Configuration files for the master and slaves
說明:上邊配置文件可見
- root密碼: mysqlRootPassword:
- 普通用戶: mysqlUser:
- 普通用戶密碼: mysqlPassword
- 新建數(shù)據(jù)庫:mysqlDatabase:
2.3 修改存儲大小
默認10g奄容,此處修改為300g
persistence:
enabled: true
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, azure-disk on
## Azure, standard on GKE, AWS & OpenStack)
##
# storageClass: "-"
accessModes:
- ReadWriteOnce
size: 300Gi
說明:因為我的k8s集群設(shè)定了默認storageclass冰更,所以此處不用指定
3. 創(chuàng)建msyql集群
3.1 創(chuàng)建
[root@DoM01 mysqlha]# kubectl create namespace mysql
[root@DoM01 mysqlha]# cd mysqlha
[root@DoM01 mysqlha]# helm install mysqlha -n mysql ./
3.2 輸出說明
創(chuàng)建完成輸出如下:
NAME: mysqlha
LAST DEPLOYED: Mon Aug 16 17:16:16 2021
NAMESPACE: mysql
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The MySQL cluster is comprised of 3 MySQL pods: 1 master and 2 slaves. Each instance is accessible within the cluster through:
<pod-name>.mysqlha
`mysqlha-0.mysqlha` is designated as the master and where all writes should be executed against. Read queries can be executed against the `mysqlha-readonly` service which distributes connections across all MySQL pods.
To connect to your database:
1. Obtain the root password:
kubectl get secret --namespace mysql mysqlha -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
2. Run a pod to use as a client:
kubectl run mysql-client --image=harbocto.boe.com.cn/public/mysql:5.7.13 -it --rm --restart='Never' --namespace mysql -- /bin/sh
3. To connect to Master service (read/write):
mysql -h mysqlha-0.mysqlha -u root -p
4. To connect to slave service (read-only):
mysql -h mysqlha-readonly -u root -p
從輸出我么可以看到如下幾點:
- 查看密碼使用這個命令
kubectl get secret --namespace mysql mysqlha -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
寫連接
mysqlha-0.mysqlha
從“3.2 查看”中,我們可以知道這是一個Handless的service
因此"pod_name"."service_name"
可以直接訪問到后端的指定pod
我們這里的mysql-ha-mysqlha-0 即是我們的主庫(寫庫)讀連接
mysqlha-readonly
3.3 查看
- 查看pod
[root@DoM01 ~]# kubectl get pod -n mysql
NAME READY STATUS RESTARTS AGE
mysqlha-0 2/2 Running 0 81m
mysqlha-1 2/2 Running 0 80m
mysqlha-2 2/2 Running 0 80m
從 3.2的輸出可以看到昂勒,mysqlha0是我們的master蜀细,其它兩個是slave。
- 查看service
[root@DoM01 ~]# kubectl get service -n mysql
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysqlha ClusterIP None <none> 3306/TCP 81m
mysqlha-readonly NodePort 10.1.61.20 <none> 3306:30006/TCP 81m
- mysqlha-readonly: 連接讀庫
- mysqlha:
經(jīng)測試戈盈,如果直接連接奠衔,會隨機分給后邊的任何一個pod(一會兒master一會slave)- 連接寫庫:
同namespace中的服務(wù)谆刨,連接mysqlha-0.mysqlha:3306
,
如果是其它namespace中的服務(wù)归斤,需要訪問mysqlha-0.mysqlha.mysql:3306
- 查看PVC
[root@DoM01 mysqlha]# kubectl get pvc -n mysql
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mysqlha-0 Bound pvc-1b5b3e8d-3106-4f87-a33e-18c36342f2ef 300Gi RWO nfs-client 89m
data-mysqlha-1 Bound pvc-5ab9d655-0f20-4d17-80df-b25e0b58aabd 300Gi RWO nfs-client 88m
data-mysqlha-2 Bound pvc-002914c3-d55c-42fd-bde7-a5aed1da3417 300Gi RWO nfs-client 88m
4. 修改端口
如果一開始你在value.yaml里修改了痊夭,這里就不用修改了。
4.1 修改只讀端口
用edit命令修改即可
# kubectl get service -n mysql
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-ha-mysqlha ClusterIP None <none> 3306/TCP 74m
mysql-ha-mysqlha-readonly NodePort 172.21.12.189 <none> 3306:31008/TCP 74m
4.2 映射寫庫端口
mysql-ha-mysqlha 是一個Headless類型的service脏里,我們可以通過它直接映射到后端的master她我,但是他不可以直接修改成NodePort,因此需要自己重新寫了一個service
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql-ha-mysqlha-m
name: mysql-ha-mysqlha-m
namespace: mysql
spec:
ports:
- name: mysql-ha-mysqlha-m
nodePort: 31009
port: 3306
protocol: TCP
targetPort: 3306
selector:
app: mysql-ha-mysqlha
type: NodePort
查看結(jié)果如下
# kubectl get service -n mysql
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-ha-mysqlha ClusterIP None <none> 3306/TCP 74m
mysql-ha-mysqlha-m NodePort 172.21.13.8 <none> 3306:31009/TCP 4m46s
mysql-ha-mysqlha-readonly NodePort 172.21.12.189 <none> 3306:31008/TCP 74m