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

閱讀時間約 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架構,希望透過文章可以讓大家了解實務上該如何進行。


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

15會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
發表第一個留言支持創作者!
超健忘閒人的沙龍 的其他內容
本篇文章將教你如何在Kubernetes cluster內部署一個MongoDB,包括取得Manifests、建立Volume、部署實務、基本操作和結論。透過操作演示,讓你瞭解在實務上如何成功建立MongoDB,並進行基本操作。
本文將介紹Gitlab與GitHub的差異,以及在本地環境部署Gitlab的流程與實作。文章內容包括版本管理系統的選擇,Gitlab的基本功能,以及使用Docker進行部署的詳細步驟。
本文介紹了在K8S Cluster出現問題時,透過ETCD的備份來還原Cluster的方法。包括ETCD的資料類型、備份、還原以及相關建議,並提出了自動進行ETCD備份作業和備份存放位置的重要性。
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
本篇將介紹Minio的功能和如何與Harbor進行整合,並說明這樣做的好處。包括Minio的優勢及Harbor x Minio的部署和測試。
本文闡述了Kubernetes內部網路通訊的基本概念,從容器到服務的溝通流程,並討論了Kubernetes使用的各種技術。重要的是,管理Kubernetes叢集時理解這些基本概念是極其重要的。
本篇文章將教你如何在Kubernetes cluster內部署一個MongoDB,包括取得Manifests、建立Volume、部署實務、基本操作和結論。透過操作演示,讓你瞭解在實務上如何成功建立MongoDB,並進行基本操作。
本文將介紹Gitlab與GitHub的差異,以及在本地環境部署Gitlab的流程與實作。文章內容包括版本管理系統的選擇,Gitlab的基本功能,以及使用Docker進行部署的詳細步驟。
本文介紹了在K8S Cluster出現問題時,透過ETCD的備份來還原Cluster的方法。包括ETCD的資料類型、備份、還原以及相關建議,並提出了自動進行ETCD備份作業和備份存放位置的重要性。
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
本篇將介紹Minio的功能和如何與Harbor進行整合,並說明這樣做的好處。包括Minio的優勢及Harbor x Minio的部署和測試。
本文闡述了Kubernetes內部網路通訊的基本概念,從容器到服務的溝通流程,並討論了Kubernetes使用的各種技術。重要的是,管理Kubernetes叢集時理解這些基本概念是極其重要的。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
👨‍💻簡介 在當今的雲計算時代,容器化和微服務架構成為了重要趨勢。Kubernetes,作為領先的容器編排平台,提供了強大的功能來管理和部署應用程式。然而,隨著應用程式和用戶的增加,有效管理誰可以對 Kubernetes 集群執行何種操作變得至關重要。
Thumbnail
在雲端建立AKS後,運行後有許多Container會被外部服務呼叫使用。但我們知道當我們佈署到AKS,如果要被外面服務呼叫,就要在YAML將Type設定成Loadbalance,一旦這樣設定,就會變成每個Container就會多出一個對外的IP,Container變多了,對外IP就會擴增很快,也不好
Thumbnail
宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程...
Thumbnail
Kubernetes 是一個開源的容器管理平台,它可以幫助您自動化容器應用程式的部署、擴展和管理。在 Kubernetes 中,有兩種主要的管理方式:命令式和宣告式。
Thumbnail
在 Kubernetes 裡,Secret 就像是一個保險箱,可以放你任何不想公開的東西。比如說密碼、API 金鑰、憑證等,這樣的資料可能會被放在 Pod 裡,但你可以用 Secret 來避免直接在應用程式的程式碼中暴露這些機密資料。
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Autoscaling 的目的是當有大量請求時,系統可以自動的增加運算資源,處理當下的大量請求;也可以根據當下資源使用率低時,自動降低運算資源,達到省錢的目的。
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
👨‍💻簡介 在當今的雲計算時代,容器化和微服務架構成為了重要趨勢。Kubernetes,作為領先的容器編排平台,提供了強大的功能來管理和部署應用程式。然而,隨著應用程式和用戶的增加,有效管理誰可以對 Kubernetes 集群執行何種操作變得至關重要。
Thumbnail
在雲端建立AKS後,運行後有許多Container會被外部服務呼叫使用。但我們知道當我們佈署到AKS,如果要被外面服務呼叫,就要在YAML將Type設定成Loadbalance,一旦這樣設定,就會變成每個Container就會多出一個對外的IP,Container變多了,對外IP就會擴增很快,也不好
Thumbnail
宣告式管理是一種管理方法,其中您描述系統或資源的期望狀態,而不必關心實際如何達到該狀態。kubectl apply 命令在 Kubernetes 中實現了這種宣告式管理方式,以下是執行指令時的運作流程...
Thumbnail
Kubernetes 是一個開源的容器管理平台,它可以幫助您自動化容器應用程式的部署、擴展和管理。在 Kubernetes 中,有兩種主要的管理方式:命令式和宣告式。
Thumbnail
在 Kubernetes 裡,Secret 就像是一個保險箱,可以放你任何不想公開的東西。比如說密碼、API 金鑰、憑證等,這樣的資料可能會被放在 Pod 裡,但你可以用 Secret 來避免直接在應用程式的程式碼中暴露這些機密資料。
Thumbnail
什麼是 Kubernetes Deployment? 一樣先來個官網解說 A Deployment provides declarative updates for Pods and ReplicaSets. You describe a desired state in a Deployment,
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
Kubernetes是現代應用程序開發和部署的重要技術,而Pod是Kubernetes中最小的部署單位。Pod是一個或多個container的集合,它們共享一個網路命名空間和一個網路接口。Pod不僅提供了一個簡單而強大的container環境,還可以用於實現多種container編排方案,例如負載平
Autoscaling 的目的是當有大量請求時,系統可以自動的增加運算資源,處理當下的大量請求;也可以根據當下資源使用率低時,自動降低運算資源,達到省錢的目的。