helm 安裝 MySQL 主從
阿新 • • 發佈:2022-05-09
資源清單
本文安裝
MySQL 1主2從
依賴K8S叢集
和helm
,本文不提供K8S叢集
和helm
安裝方式
使用此文件部署,需要自行解決 storageClass 問題 ( NFS, ceph, openebs等 )
軟體 | 版本 |
---|---|
chart | 4.5.2 |
mysql | 5.7.26 |
kubernetes | v1.19.3 |
helm | v3.8.1 |
helm
安裝 MySQL 1主2從
1. 新增 bitnami
的倉庫
$ helm repo add bitnami https://charts.bitnami.com/bitnami
2. 查詢 MySQL
資源
$ helm repo update $ helm search repo mysql NAME CHART VERSION APP VERSION DESCRIPTION bitnami/mysql 8.9.6 8.0.29 MySQL is a fast, reliable, scalable, and easy t... bitnami/phpmyadmin 10.0.1 5.1.3 phpMyAdmin is a free software tool written in P... bitnami/mariadb 11.0.2 10.6.7 MariaDB is an open source, community-developed ... bitnami/mariadb-cluster 1.0.2 10.2.14 DEPRECATED Chart to create a Highly available M... bitnami/mariadb-galera 7.1.8 10.6.7 MariaDB Galera is a multi-primary database clus...
3. 拉取 MySQL chart
到本地
$ mkdir /root/mysql && cd /root/mysql # 拉取 chart 到本地 /root/mysql 目錄 $ helm pull bitnami/mysql --version 4.5.2 $ tar -xvf mysql-4.5.2.tgz $ cp mysql/values.yaml ./value-test.yaml # 檢視當前目錄層級 $ tree -L 2 . ├── mysql │ ├── Chart.yaml │ ├── files │ ├── README.md │ ├── templates │ ├── values-production.yaml │ └── values.yaml ├── mysql-4.5.2.tgz └── value-test.yaml
4. 對本地 valuse-test.yaml
修改
- 檢視叢集
storageclasses
$ kubectl get storageclasses.storage.k8s.io
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
openebs-device openebs.io/local Delete WaitForFirstConsumer false 34d
openebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 34d
openebs-jiva-default jiva.csi.openebs.io Delete Immediate true 33d
- 修改配置
$ cat values-test.yaml
## 全域性配置定義 storageClass: "",會使用叢集配置的 openebs 提供的 storageClass,
## 使用此文件部署,需要自行解決 storageClass 問題 (ceph, nfs, 公有云提供的 nfs)
service:
## Kubernetes service type
# nodePort:
type: ClusterIP
port: 3306
root:
## MySQL admin password
## ref: https://github.com/bitnami/bitnami-docker-mysql#setting-the-root-password-on-first-run
##
password: root123 # 設定 MySQL root密碼
replication:
## Enable replication. This enables the creation of replicas of MySQL. If false, only a
## master deployment would be created
enabled: true
user: replicator
password: replicator # 設定 MySQL 主從同步使用者密碼
master:
persistence:
storageClass: "openebs-jiva-default" # 設定 storageClass
slave:
replicas: 2
persistence:
storageClass: "openebs-jiva-default" # 設定 storageClass
5. 對本地 templates 模板
修改
# k8s v1.19.3 版本中,statefulsets 版本為:apps/v1 而不是模板中 apps/v1beta1 的版本,
# 因此需要替換 master-statefulset.yaml 和 slave-statefulset.yaml 模板
$ sed -i "s#apps/v1beta1#apps/v1#" mysql/templates/master-statefulset.yaml
$ sed -i "s#apps/v1beta1#apps/v1#" mysql/templates/slave-statefulset.yaml
- 未替換模板中 statefulsets 版本,直接安裝服務會報錯
$ helm install mysql-cluster mysql -f value-test.yaml
Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta1"
6. 安裝 MySQL 叢集
# 建立 test-middleware 名稱空間
$ kubectl create ns test-middleware
# 安裝 MySQL 叢集
$ helm -n test-middleware install mysql-cluster mysql -f value-test.yaml
## helm -n NAMESAPCE install SERVER_NAME FILE_NAME -f CONFIG_FILE
-n 指定 kubernetes 叢集名稱空間
-f 指定使用的配置檔案,檔案中定義的配置可以覆蓋 mysql/values.yaml 檔案中配置
helm -n test-middleware install mysql-cluster mysql -f value-test.yaml
NAME: mysql-cluster
LAST DEPLOYED: Mon May 9 01:54:38 2022
NAMESPACE: test-middleware
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please be patient while the chart is being deployed
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace test-middleware
Services:
echo Master: mysql-cluster-mysql.test-middleware.svc.cluster.local:3306
echo Slave: mysql-cluster-mysql-slave.test-middleware.svc.cluster.local:3306
Administrator credentials:
echo Username: root
echo Password : $(kubectl get secret --namespace test-middleware mysql-cluster-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run mysql-cluster-mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:5.7.26 --namespace test-middleware --command -- bash
2. To connect to master service (read/write):
mysql -h mysql-cluster-mysql.test-middleware.svc.cluster.local -uroot -p my_database
3. To connect to slave service (read-only):
mysql -h mysql-cluster-mysql-slave.test-middleware.svc.cluster.local -uroot -p my_database
To upgrade this helm chart:
1. Obtain the password as described on the 'Administrator credentials' section and set the 'root.password' parameter as shown below:
ROOT_PASSWORD=$(kubectl get secret --namespace test-middleware mysql-cluster-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode)
helm upgrade mysql-cluster bitnami/mysql --set root.password=$ROOT_PASSWORD
7. 檢視部署的 MySQL
叢集
$ helm -n test-middleware list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysql-cluster test-middleware 1 2022-05-09 01:54:38.848559008 -0400 EDT deployed mysql-4.5.2 5.7.26
$ kubectl -n test-middleware get pods -l app=mysql
NAME READY STATUS RESTARTS AGE
mysql-cluster-mysql-master-0 1/1 Running 0 16m
mysql-cluster-mysql-slave-0 1/1 Running 0 16m
mysql-cluster-mysql-slave-1 1/1 Running 0 14m
> mysql-cluster-mysql-master-0 為主,mysql-cluster-mysql-slave-0 和 mysql-cluster-mysql-slave-1 為從
> default名稱空間如何訪問此 MySQL 叢集
> MySQL主節點:mysql-cluster-mysql.test-middleware
> MySQL從節點0:mysql-cluster-mysql-slave-0.mysql-cluster-mysql-slave.test-middleware
> MySQL從節點1:mysql-cluster-mysql-slave-1.mysql-cluster-mysql-slave.test-middleware
- 檢視服務使用的
storageclass
# 檢視 pvc
$ kubectl -n test-middleware get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mysql-cluster-mysql-master-0 Bound pvc-b9a1d1ca-44d3-4292-af45-e6f3b3063395 8Gi RWO openebs-jiva-default 31m
data-mysql-cluster-mysql-slave-0 Bound pvc-0d234b12-26eb-4e07-9dc0-ef9f0230e9fa 8Gi RWO openebs-jiva-default 31m
data-mysql-cluster-mysql-slave-1 Bound pvc-16531f4b-41ac-4a04-9d90-04b92aab7b49 8Gi RWO openebs-jiva-default 29m
# 檢視 pv
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-b9a1d1ca-44d3-4292-af45-e6f3b3063395 8Gi RWO Delete Bound test-middleware/data-mysql-cluster-mysql-master-0 openebs-jiva-default 33m
pvc-0d234b12-26eb-4e07-9dc0-ef9f0230e9fa 8Gi RWO Delete Bound test-middleware/data-mysql-cluster-mysql-slave-0 openebs-jiva-default 33m
pvc-16531f4b-41ac-4a04-9d90-04b92aab7b49 8Gi RWO Delete Bound test-middleware/data-mysql-cluster-mysql-slave-1 openebs-jiva-default 31m
8. 連線 MySQL 叢集
驗證服務
# 獲取 MySQL 叢集的密碼
$ kubectl get secret --namespace test-middleware mysql-cluster-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode
root123
# 啟動一個臨時容器
$ kubectl run mysql-cluster-mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:5.7.26 --namespace test-middleware --command -- bash
## 登陸 MySQL Master節點
$ mysql -h mysql-cluster-mysql.test-middleware -uroot -p
Enter password: # root123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_database |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
# 檢視主從狀態
# 檢視File和Position的值,在從庫配置中會顯示。
> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
ERROR:
No query specified
## 登陸從庫,檢視主從同步狀態
$ mysql -h mysql-cluster-mysql.test-middleware -uroot -p
Enter password: # root123
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-cluster-mysql
Master_User: replicator
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000002 # File: mysql-bin.000002
Read_Master_Log_Pos: 154 # Position: 154
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 2236
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 641
Master_UUID: aa7a516b-cf5c-11ec-b974-a2ee403fe88f
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
參考文件
https://luckfu.com/post/helm_deploy_mysql_master_slave/
https://cloud.tencent.com/developer/article/1632915
https://github.com/bitnami/charts/issues/2892