Appearance
MariaDB Helm 部署(Kubernetes)
使用 Bitnami Helm Chart 在 Kubernetes 上部署 MariaDB,涵蓋 Standalone 與 Galera 多 Master 同步兩種架構。
概述
MariaDB 是廣泛使用的開源關聯式資料庫,為 MySQL 的社群分支。在 Kubernetes 環境中,透過 Bitnami 提供的 Helm Chart 可以快速部署 MariaDB,支援兩種主要架構模式:Standalone(單節點)與 Galera Cluster(多 Master 同步寫入)。
Standalone 模式適合開發環境或讀寫負載較低的場景,部署簡單、資源消耗低。Galera Cluster 則透過 Galera 同步複製協定(wsrep)實現多節點同步寫入,適合需要高可用性的生產環境,但在節點故障與叢集重建方面需要更多維運經驗。
本文記錄了在 K8S(地端)與 AKS(Azure)兩種環境下的完整部署歷程,包含 TLS 憑證設定、Galera 叢集故障修復、性能調優等實戰經驗。
核心內容
Standalone vs. Galera 架構選擇
Standalone 使用 bitnami/mariadb Chart,部署單一 Primary 節點,透過 NodePort 對外暴露服務。適合非關鍵業務或開發測試環境,優點是部署與升級流程簡單,不需處理叢集同步問題。
Galera Cluster 使用 bitnami/mariadb-galera Chart,部署多個對等節點(每個節點均可讀寫)。生產環境建議至少 3 個副本以避免腦裂(split-brain)。Galera 的同步複製機制確保所有節點資料一致,但當節點故障時,叢集重建流程較為複雜,可能需要手動指定 bootstrap 節點或透過 VolumeSnapshot 還原 PVC。
TLS 憑證設定
Galera Chart 支援兩種 TLS 設定方式:
- 自動產生憑證:設定
tls.autoGenerated=true,Helm 自動產生自簽憑證,適合內部環境快速啟用加密。 - 使用自帶憑證:先將企業憑證建立為 Kubernetes Secret,再透過
tls.certificatesSecret指定。適合需要使用正式憑證的環境。
實戰經驗: AKS 環境曾因 TLS 憑證相關錯誤導致 Pod 無法恢復,最終決定移除 TLS 重新架設。若加密需求不高,可考慮在應用層處理加密,簡化資料庫層的維運複雜度。
Galera 叢集故障修復與重建
Galera 叢集在節點故障時,可能需要以下修復策略:
- 單節點緊急運作:將
replicaCount設為 1,搭配persistence.existingClaim掛載存活節點的 PVC,先恢復服務。 - 強制 Bootstrap:使用
galera.bootstrap.forceBootstrap=true與galera.bootstrap.bootstrapFromNode指定從特定節點啟動叢集。 - VolumeSnapshot 重建:將所有 Pod 停止後,從存活的 PVC 建立 VolumeSnapshot,還原至其他 PVC,再重新安裝 Helm Chart。
InnoDB 性能調優
針對高負載場景,可透過 extraFlags 傳入 InnoDB 參數進行調優。關鍵調優方向包括:
- Buffer Pool:
innodb-buffer-pool-size設為可用記憶體的 60-70% - I/O 能力:調高
innodb-io-capacity與 I/O 執行緒數 - 連線管理:增加
max-connections與thread-cache-size - 查詢監控:啟用
slow-query-log並設定合理的long-query-time - Query Cache:在高並發寫入場景下建議關閉(
query-cache-type=0)
關鍵要點
- Standalone 用
bitnami/mariadb,Galera 用bitnami/mariadb-galera,兩者為不同的 Helm Chart - Galera 生產環境建議 3 副本;緊急時可降為 1 副本維持服務,但需注意後續重建流程
- TLS 在 Galera 環境下可能增加故障排除難度,需權衡安全性與維運成本
- Helm Upgrade 時務必傳入現有密碼(從 Secret 取得),否則會被重設
- AKS 環境使用
managed-premiumStorageClass,K8S 地端使用nfs-client
實際應用
本部署方案用於支撐企業內部多個業務系統的關聯式資料庫需求。Standalone 部署於地端 K8S 叢集供開發測試使用,Galera 部署於 AKS 供生產環境使用。透過 Azure Internal LoadBalancer 對內網暴露服務,搭配 Prometheus Exporter 部署模式 可實現資料庫監控。
部署設定參考
以下為實際部署時使用的完整設定,供日後查詢與複製使用。
環境參數
| 項目 | K8S Standalone | AKS Galera(最新) |
|---|---|---|
| Helm Chart | bitnami/mariadb 18.2.5 | bitnami/mariadb-galera 13.2.6 |
| Image | 預設 | bitnamilegacy/mariadb-galera:12.0.2 |
| StorageClass | nfs-client | managed-premium |
| PVC 容量 | 100Gi | 依 PVC 擴容 |
| 副本數 | 1 | 1(曾為 3) |
| CPU Request | — | 3 |
| Memory Request | — | 12Gi |
| Service 類型 | NodePort (30306) | ClusterIP + Internal LB |
| Internal LB IP | — | 10.30.196.60 |
Standalone 安裝指令(K8S)
bash
helm install k8s-mariadb bitnami/mariadb \
--version 18.2.5 \
--namespace mariadb \
--set global.storageClass="nfs-client" \
--set primary.persistence.size=100Gi \
--set primary.service.nodePorts.mysql="30306" \
--set auth.rootPassword="MA245BKzW" \
--set primary.service.type="NodePort"Galera 安裝指令 — 自動產生憑證(K8S)
bash
helm install k8s-mariadb-galera bitnami/mariadb-galera \
--namespace mariadb \
--set global.storageClass="nfs-client" \
--set service.type="NodePort" \
--set service.nodePorts.mysql=30306 \
--set persistence.size=50Gi \
--set rootUser.password="MA245BKzW" \
--set tls.enabled="true" \
--set tls.autoGenerated="true" \
--set replicaCount=2 \
--set resourcesPreset="2xlarge"Galera 安裝指令 — 使用自帶憑證(K8S)
bash
# 建立憑證 Secret
kubectl create secret generic certificates-tls-secret \
--from-file=./wiwynn2023.crt \
--from-file=./wiwynn2023.key \
--from-file=./ca.crt \
-n mariadb
# 安裝 Helm Chart
helm install k8s-mariadb-galera bitnami/mariadb-galera \
--namespace mariadb \
--set global.storageClass="nfs-client" \
--set service.type="NodePort" \
--set service.nodePorts.mysql=30306 \
--set persistence.size=50Gi \
--set rootUser.password="MA245BKzW" \
--set tls.enabled="true" \
--set tls.certificatesSecret="certificates-tls-secret" \
--set tls.certFilename="wiwynn2023.crt" \
--set tls.certKeyFilename="wiwynn2023.key" \
--set tls.certCAFilename="ca.crt" \
--set replicaCount=3 \
--set resourcesPreset="2xlarge"AKS Galera — 性能最佳化版(最新設定)
bash
helm upgrade aks-mariadb-galera bitnami/mariadb-galera \
--namespace mariadb \
--set global.storageClass="managed-premium" \
--set service.type="ClusterIP" \
--set rootUser.password="MA245BKzW" \
--set galera.mariabackup.password="B1E85EpkdT" \
--set replicaCount=1 \
--set resources.requests.cpu=3 \
--set resources.requests.memory=12Gi \
--set image.repository="bitnamilegacy/mariadb-galera" \
--set image.tag=12.0.2 \
--set extraFlags="--innodb-buffer-pool-size=8G \
--innodb-log-file-size=512M \
--innodb-log-buffer-size=64M \
--innodb-io-capacity=2000 \
--innodb-io-capacity-max=4000 \
--innodb-read-io-threads=8 \
--innodb-write-io-threads=8 \
--innodb-flush-neighbors=0 \
--innodb-lru-scan-depth=2048 \
--max-connections=500 \
--thread-cache-size=100 \
--tmp-table-size=64M \
--max-heap-table-size=64M \
--read-rnd-buffer-size=4M \
--query-cache-type=0 \
--query-cache-size=0 \
--slow-query-log=1 \
--long-query-time=2 \
--sync-binlog=1 \
--binlog-cache-size=1M \
--max-allowed-packet=64M \
--performance-schema=ON \
--log-queries-not-using-indexes=OFF" \
--waitAKS LoadBalancer Service
yaml
apiVersion: v1
kind: Service
metadata:
name: aks-mariadb-galera-loadbalancer
namespace: mariadb
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.30.196.60
spec:
type: LoadBalancer
selector:
app.kubernetes.io/instance: aks-mariadb-galera
app.kubernetes.io/name: mariadb-galera
ports:
- name: mariadb
protocol: TCP
port: 3306
targetPort: 3306AKS 部署參數演進摘要
| 日期 | 事件 | Replicas | CPU | Memory | 備註 |
|---|---|---|---|---|---|
| 2024/07/03 | 初始安裝 | 3 | 2xlarge preset | 2xlarge preset | 含 TLS 憑證 |
| 2024/08/06 | 重新架設 | 3 | 2xlarge preset | 2xlarge preset | 移除 TLS |
| 2025/07/21 | 緊急修復 | 1 | 2 | 8Gi | 單節點運作,使用 existingClaim |
| 2025/08/25 | 重建 Cluster | 3 | 2 | 8Gi | VolumeSnapshot 還原 PVC |
| 2025/10/06 | 切換 Image | 1 | 3 | 12Gi | bitnamilegacy/mariadb-galera:12.0.2 |
| 2025/10/28 | 性能最佳化 | 1 | 3 | 12Gi | InnoDB 參數調優、Slow Query Log |
連線資訊
| 項目 | K8S Standalone | K8S / AKS Galera |
|---|---|---|
| 叢集內 DNS | k8s-mariadb.mariadb.svc.cluster.local:3306 | k8s-mariadb-galera.mariadb.svc.cluster.local:3306 |
| 帳號 | root | root |
| 對外存取 | NodePort 30306 | AKS Internal LB 10.30.196.60:3306 |
操作指令
取得 Standalone 密碼:
bash
kubectl get secret --namespace mariadb k8s-mariadb \
-o jsonpath="{.data.mariadb-root-password}" | base64 -d取得 Galera 密碼:
bash
echo "$(kubectl get secret --namespace mariadb k8s-mariadb-galera \
-o jsonpath="{.data.mariadb-root-password}" | base64 -d)"Standalone 叢集內連線測試:
bash
kubectl run k8s-mariadb-client --rm --tty -i --restart='Never' \
--image docker.io/bitnami/mariadb:11.3.2-debian-12-r8 \
--namespace mariadb \
--command -- sleep infinity
mysql -h k8s-mariadb.mariadb.svc.cluster.local -uroot -p my_databaseGalera Helm Upgrade(需帶入現有密碼):
bash
helm upgrade --namespace mariadb k8s-mariadb-galera \
oci://registry-1.docker.io/bitnamicharts/mariadb-galera \
--set rootUser.password=$(kubectl get secret --namespace mariadb k8s-mariadb-galera \
-o jsonpath="{.data.mariadb-root-password}" | base64 -d) \
--set db.name=my_database \
--set galera.mariabackup.password=$(kubectl get secret --namespace mariadb k8s-mariadb-galera \
-o jsonpath="{.data.mariadb-galera-mariabackup-password}" | base64 -d)Galera 緊急修復 — 強制 Bootstrap:
bash
--set podManagementPolicy=Parallel \
--set galera.bootstrap.forceBootstrap=true \
--set galera.bootstrap.bootstrapFromNode=1 \
--set galera.bootstrap.forceSafeToBootstrap=true相關概念
- MariaDB 遷移(Bitnami Galera → 官方 StatefulSet) — 將 Bitnami Galera Helm release 遷移至官方
mariadb:12.2映像的六個 Phase SOP - MongoDB Helm 部署 — 同為 Bitnami Helm Chart 部署的資料庫,可對照架構選擇與 AKS 部署模式
- Prometheus Exporter 部署模式 — 搭配 MySQL/MariaDB Exporter 實現資料庫監控
- PgBouncer 連線池(Kubernetes 部署) — 同為資料庫基礎設施的 K8s 部署方案
- Squid Proxy(Kubernetes 部署) — 同樣使用 Azure Internal LoadBalancer 暴露服務的部署模式
- Redis on Kubernetes 部署與維運 — 同為 Bitnami Helm Chart 部署的有狀態快取服務,可對照 PVC 管理與 LoadBalancer 暴露模式
來源
- Bitnami MariaDB Helm Chart — Standalone 版本
- Bitnami MariaDB Galera Helm Chart — Galera 多 Master 版本
- 原始素材:2026-04-10 MariaDB on Kubernetes 部署指南