以前常常在虛擬機上建立MySQL DB當作許多應用服務的後端資料庫,當進入了容器化的世界之後,還沒有機會實務上去做這樣的資料庫的部署任務,即然想到了,就透過本文來記錄如何在Kubernetes環境下,部署Standalone架構的MySQL Database,並透過phpmyadmin進行管理(也就是原本在單機上我常做的基本搭配組合)。
接下來將分成以下幾點進行說明與實作的流程:
許多年前,我第一次接觸到MySQL DB的時候,因為效能的問題,許多實務上的部署還是以實體機為主流。直到後來VMware出現,經過多年後的實務經驗,DBA開始願意將生產環境的MySQL DB移轉至虛擬機器上運行,並取得許多實體機所無法取得的優點。
而當現代愈來愈多的應用服務進入容器化的世界,慢慢身邊有客戶為了讓應用服務取用後端資料庫可以更有效率,開始將DB也以容器的方式在Kubernetes平台內進行部署與管理,此時在容器平台內運行的資料庫管理解決方案可以得到以下優點:
實際上的資料將透過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
一般來說,我不會每次都透過下指令的方式進行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
今天實作了在kubernetes內部署MySQL standalone與PMA(phpmyadmin)的組合,做法在網路上您可以找到千百種,但筆者覺得一定要找一個最適合自已的基礎做法,往後再從這個做法延伸出去變化出更多自定義的方式。
本篇說明了一個基本的做法,下一篇將更進一步的建立實務上更常使用的Master-Slave架構,希望透過文章可以讓大家了解實務上該如何進行。
好了,本篇就說明到這邊,我們下期再見~~~~~