Kubernetes 環境下 MySQL 單機部署與 phpMyAdmin 管理

2024/04/09閱讀時間約 11 分鐘

以前常常在虛擬機上建立MySQL DB當作許多應用服務的後端資料庫,當進入了容器化的世界之後,還沒有機會實務上去做這樣的資料庫的部署任務,即然想到了,就透過本文來記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理(也就是原本在單機上我常做的基本搭配組合)。

raw-image

接下來將分成以下幾點進行說明與實作的流程:

  1. MySQL部署在K8S內的優勢
  2. 部署MySQL DB standalone
  3. 部署PhpMyAdmin (PMA)
  4. 結論

1.MySQL部署在K8S內的優勢

許多年前,我第一次接觸到MySQL DB的時候,因為效能的問題,許多實務上的部署還是以實體機為主流。直到後來VMware出現,經過多年後的實務經驗,DBA開始願意將生產環境的MySQL DB移轉至虛擬機器上運行,並取得許多實體機所無法取得的優點。

而當現代愈來愈多的應用服務進入容器化的世界,慢慢身邊有客戶為了讓應用服務取用後端資料庫可以更有效率,開始將DB也以容器的方式在Kubernetes平台內進行部署與管理,此時在容器平台內運行的資料庫管理解決方案可以得到以下優點:

  • 資源隔離 : Kubernetes原生就可以透過命名空間進行資源的隔離,設計好的情境下,不會有其他不相干的服務來搶奪資料庫所需要的資源。
  • 動態擴展:這是Kubernetes資源管理的最大好處,透過VPA/HPA機制的設計,可以很好的在需要大量資源的時間動態地進行需求的對應處理。
  • 環境一致性:所有在kubernetes平台內的環境相對於一般安裝在OS的情境下,所有的設定與管理方式都是一樣的。
  • 維運方便:不需要其他特別的監控管理方案,可以直接透過Grafana/Prometheus的整合就可以跟著平台其他資源一起進行監管。

2.部署MySQL DB standalone

實際上的資料將透過StorageClass的方式進行儲存。若要使用建立local PV的方式也是可以,將以下關於StorageClass的部分修改即可。

#-----------------------------------
# S2-1. SVC
#-----------------------------------
[master]# vim mysql-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: mysql
namespace: mysql-std
labels:
app: mysql
type: standalone
spec:
type: NodePort
ports:
- name: server
port: 3306
protocol: TCP
targetPort: 3306
nodePort: 31009
selector:
app: mysql
type: standalone
#-----------------------------------
# S2-2. Statefulset
#-----------------------------------
[master]# vim mysql-sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: mysql-std
labels:
app: mysql
type: standalone
spec:
replicas: 1
selector:
matchLabels:
app: mysql
type: standalone
serviceName: mysql
template:
metadata:
labels:
app: mysql
type: standalone
spec:
# nodeSelector:
# app: database
containers:
- name: mysql
image: mysql:latest
imagePullPolicy: IfNotPresent
ports:
- name: server
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql123"
- name: MYSQL_DATABASE
value: "app"
- name: MYSQL_USER
value: "albert"
- name: MYSQL_PASSWORD
value: "albert1122"
volumeMounts:
- name: data
mountPath: /var/lib/mysql
# - name: mysql-conf
# mountPath: /etc/mysql/my.cnf
# subPath: my.cnf
# - name: log
# mountPath: /var/log/mysqld.log
resources:
limits:
memory: "4Gi"
cpu: "2"
requests:
memory: "512Mi"
cpu: "1"
volumeClaimTemplates:
- metadata:
name: data
labels:
app: mysql
type: standalone
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-nfs-storage
resources:
requests:
storage: 5Gi
#-----------------------------------
# S2-3. 執行部署
#-----------------------------------
[master]# kubectl create namespace mysql-std
[master]# kubectl apply -f mysql-svc.yaml
[master]# kubectl apply -f mysql-sts.yaml
[master]# kubectl get all -n mysql-std
[master]# kubectl get pvc -n mysql-std

[master]# kubectl exec -it mysql-0 /bin/bash
bash-4.4# mysql -u root -p
raw-image
raw-image

3.部署PhpMyAdmin (PMA)

一般來說,我不會每次都透過下指令的方式進行DB的管理,因為當一次要管理非常多個DB的情況下,就會明顯非常沒有效率。

因此,我常常會在部署完資料庫管理服務之後,再額外部署與其搭配的圖形管理介面,例如MySQL + PMA 這樣的組合。

#------------------------------------------
# S3-1. 部署
#------------------------------------------
[master]# vim pma-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: phpmyadmin-deployment
labels:
app: phpmyadmin
spec:
replicas: 1
selector:
matchLabels:
app: phpmyadmin
template:
metadata:
labels:
app: phpmyadmin
spec:
containers:
- name: phpmyadmin
image: phpmyadmin/phpmyadmin
ports:
- containerPort: 80
env:
- name: PMA_HOST
value: <mysql pod ip>
- name: PMA_PORT
value: "3306"
#------------------------------------------
# S3-2. svc
#------------------------------------------
[master]# vim pma-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: phpmyadmin-service
spec:
type: NodePort
selector:
app: phpmyadmin
ports:
- protocol: TCP
nodePort: 31008
port: 80
targetPort: 80
#-------------------------------------------
# S3-3. execute yaml
#-------------------------------------------
[master]# kubectl create -f pma-secret.yaml
[master]# kubectl create -f pma-svc.yaml
[master]# kubectl create -f pma-deployment.yaml
raw-image
raw-image

4.結論

今天實作了在kubernetes內部署MySQL standalone與PMA(phpmyadmin)的組合,做法在網路上您可以找到千百種,但筆者覺得一定要找一個最適合自已的基礎做法,往後再從這個做法延伸出去變化出更多自定義的方式。

本篇說明了一個基本的做法,下一篇將更進一步的建立實務上更常使用的Master-Slave架構,希望透過文章可以讓大家了解實務上該如何進行。


好了,本篇就說明到這邊,我們下期再見~~~~~

8會員
39內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!