MySQL on k8s 云原生環(huán)境部署
一、概述
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。這里主要講mysql部署在k8s上,mysql部署在k8s上的優(yōu)勢主要有以下幾點:
- 資源隔離
- 動態(tài)彈性擴(kuò)縮容
- 環(huán)境一致性
- 運維方便
官方文檔:docs.oracle.com/en-us/iaas/… MySQL 原理介紹也可以參考我這篇文章:MySQL原理介紹

二、開始部署(一主兩從)

1)添加源
helm repo add bitnami https://charts.bitnami.com/bitnami helm pull bitnami/mysql tar -xf mysql-9.3.3.tgz
2)修改配置
- 修改
mysql/values.yaml
...
image:
registry: myharbor.com
repository: bigdata/mysql
tag: 8.0.30-debian-11-r15
...
architecture: replication
...
primary:
persistence:
enabled: true
size: 10Gi
storageClass: "mysql-local-storage"
# 目錄需要提前在宿主機(jī)上創(chuàng)建
local:
- name: mysql-0
host: "local-168-182-110"
path: "/opt/bigdata/servers/mysql/data/data1"
service:
type: NodePort
nodePorts:
mysql: "30306"
secondary:
replicaCount: 2
persistence:
enabled: true
size: 10Gi
storageClass: "mysql-local-storage"
# 目錄需要提前在宿主機(jī)上創(chuàng)建
local:
- name: mysql-1
host: "local-168-182-111"
path: "/opt/bigdata/servers/mysql/data/data1"
- name: mysql-2
host: "local-168-182-112"
path: "/opt/bigdata/servers/mysql/data/data1"
service:
type: NodePort
nodePorts:
mysql: "30307"
...
metrics:
## @param metrics.enabled Start a side-car prometheus exporter
##
enabled: true
image:
registry: myharbor.com
repository: bigdata/mysqld-exporter
tag: 0.14.0-debian-11-r33
- 添加
mysql/templates/pv.yaml
{{- range .Values.primary.persistence.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .name }}
labels:
name: {{ .name }}
spec:
storageClassName: {{ $.Values.primary.persistence.storageClass }}
capacity:
storage: {{ $.Values.primary.persistence.size }}
accessModes:
- ReadWriteOnce
local:
path: {{ .path }}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- {{ .host }}
---
{{- end }}
{{- range .Values.secondary.persistence.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .name }}
labels:
name: {{ .name }}
spec:
storageClassName: {{ $.Values.secondary.persistence.storageClass }}
capacity:
storage: {{ $.Values.secondary.persistence.size }}
accessModes:
- ReadWriteOnce
local:
path: {{ .path }}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- {{ .host }}
---
{{- end }}
- 添加
mysql/templates/storage-class.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: {{ .Values.primary.persistence.storageClass }}
provisioner: kubernetes.io/no-provisioner
3)開始安裝
# 創(chuàng)建持久化目錄 mkdir -p /opt/bigdata/servers/mysql/data/data1 # 先準(zhǔn)備好鏡像 docker pull docker.io/bitnami/mysql:8.0.30-debian-11-r15 docker tag docker.io/bitnami/mysql:8.0.30-debian-11-r15 myharbor.com/bigdata/mysql:8.0.30-debian-11-r15 docker push myharbor.com/bigdata/mysql:8.0.30-debian-11-r15 # mysqld-exporter docker pull docker.io/bitnami/mysqld-exporter:0.14.0-debian-11-r33 docker tag docker.io/bitnami/mysqld-exporter:0.14.0-debian-11-r33 myharbor.com/bigdata/mysqld-exporter:0.14.0-debian-11-r33 docker push myharbor.com/bigdata/mysqld-exporter:0.14.0-debian-11-r33 # 開始安裝 helm install mysql ./mysql -n mysql --create-namespace
NOTES
NAME: mysql
LAST DEPLOYED: Mon Sep 19 23:57:18 2022
NAMESPACE: mysql
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.3.3
APP VERSION: 8.0.30
** Please be patient while the chart is being deployed **
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace mysql
Services:
echo Primary: mysql-primary.mysql.svc.cluster.local:3306
echo Secondary: mysql-secondary.mysql.svc.cluster.local:3306
Execute the following to get the administrator credentials:
echo Username: root
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run mysql-client --rm --tty -i --restart='Never' --image myharbor.com/bigdata/mysql:8.0.30-debian-11-r15 --namespace mysql --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
2. To connect to primary service (read/write):
mysql -h mysql-primary.mysql.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
3. To connect to secondary service (read-only):
mysql -h mysql-secondary.mysql.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
To access the MySQL Prometheus metrics from outside the cluster execute the following commands:
kubectl port-forward --namespace mysql svc/mysql-metrics 9104:9104 &
curl http://127.0.0.1:9104/metrics

查看pod狀態(tài)
kubectl get pods,svc -n mysql -owide

4)測試驗證
【溫馨提示】從庫(slave)是只讀的。就是簡單的讀寫測試,還有就是pod掛了,能否正常拉起等等。這個測試驗證比較簡單。這里就不一步步的演示了。
5)Prometheus監(jiān)控
Prometheus:

可以通過命令查看采集數(shù)據(jù)
kubectl get --raw http://10.244.0.74:9104/metrics kubectl get --raw http://10.244.1.125:9104/metrics kubectl get --raw http://10.244.2.178:9104/metrics
Grafana 賬號:admin,密碼通過下面命令獲取
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
導(dǎo)入grafana模板,集群資源監(jiān)控:7362 官方模塊下載地址:grafana.com/grafana/das…

6)卸載
helm uninstall mysql -n mysql
kubectl delete pod -n mysql `kubectl get pod -n mysql |awk 'NR>1{print $1}'` --force
kubectl patch ns mysql -p '{"metadata":{"finalizers":null}}'
kubectl delete ns mysql --force
這里只是實現(xiàn)了mysql 的主從,沒有實現(xiàn)高可用,官方目前沒有出mysql ok k8s高可用的實現(xiàn)方案,雖然網(wǎng)上也有高可用的實現(xiàn)方案,但是我們公司沒真正去落地使用,所以不予評價網(wǎng)上的高可用的方案,有興趣的小伙伴可以去試試,其實mysql在大數(shù)據(jù)領(lǐng)域一般只是作為元數(shù)據(jù)存儲,主掛了,影響不是很大。目前也在研究mysql on k8s 的高可用實現(xiàn)方案,如果后期有mysql on k8s高可用真正落地到生產(chǎn)環(huán)境中使用,到時候再來分享一下。
MySQL on k8s 環(huán)境部署就先這里了,更多關(guān)于MySQL k8s 環(huán)境部署的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL系統(tǒng)庫之information_schema的實現(xiàn)
information_schema用于存儲數(shù)據(jù)庫元數(shù)據(jù),本文主要介紹了MySQL系統(tǒng)庫之information_schema的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-11-11
MySQL數(shù)據(jù)庫之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語言
這篇文章主要介紹了MySQL數(shù)據(jù)庫之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語言,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
MySQL中interactive_timeout和wait_timeout的區(qū)別
這篇文章主要介紹了MySQL中interactive_timeout和wait_timeout的區(qū)別,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10
史上最簡單的MySQL數(shù)據(jù)備份與還原教程(下)(三十七)
這篇文章主要為大家詳細(xì)介紹了史上最簡單的MySQL數(shù)據(jù)備份與還原教程下篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
mysql 數(shù)據(jù)庫安裝經(jīng)驗問題匯總
這篇文章主要介紹了mysql 數(shù)據(jù)庫安裝經(jīng)驗問題匯總,本文介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下2016-09-09
在MySQL中按字符串中的數(shù)字排序的詳細(xì)教程
本文將詳細(xì)介紹如何在MySQL中利用正則表達(dá)式提取字符串中的數(shù)字并按這些數(shù)字進(jìn)行排序,以一個具體的例子來說明,使得即使是數(shù)據(jù)庫操作的初學(xué)者也能輕松理解和應(yīng)用,需要的朋友可以參考下2024-07-07
Can’t open file:''[Table]mytable.MYI''
也許很多人遇到過類似Can’t open file: ‘[Table]mytable.MYI’ 這樣的錯誤信息,卻不知道怎么解決他,下面我們做個介紹,2011-01-01

