Skip to content

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 設定方式:

  1. 自動產生憑證:設定 tls.autoGenerated=true,Helm 自動產生自簽憑證,適合內部環境快速啟用加密。
  2. 使用自帶憑證:先將企業憑證建立為 Kubernetes Secret,再透過 tls.certificatesSecret 指定。適合需要使用正式憑證的環境。

實戰經驗: AKS 環境曾因 TLS 憑證相關錯誤導致 Pod 無法恢復,最終決定移除 TLS 重新架設。若加密需求不高,可考慮在應用層處理加密,簡化資料庫層的維運複雜度。

Galera 叢集故障修復與重建

Galera 叢集在節點故障時,可能需要以下修復策略:

  1. 單節點緊急運作:將 replicaCount 設為 1,搭配 persistence.existingClaim 掛載存活節點的 PVC,先恢復服務。
  2. 強制 Bootstrap:使用 galera.bootstrap.forceBootstrap=truegalera.bootstrap.bootstrapFromNode 指定從特定節點啟動叢集。
  3. VolumeSnapshot 重建:將所有 Pod 停止後,從存活的 PVC 建立 VolumeSnapshot,還原至其他 PVC,再重新安裝 Helm Chart。

InnoDB 性能調優

針對高負載場景,可透過 extraFlags 傳入 InnoDB 參數進行調優。關鍵調優方向包括:

  • Buffer Poolinnodb-buffer-pool-size 設為可用記憶體的 60-70%
  • I/O 能力:調高 innodb-io-capacity 與 I/O 執行緒數
  • 連線管理:增加 max-connectionsthread-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-premium StorageClass,K8S 地端使用 nfs-client

實際應用

本部署方案用於支撐企業內部多個業務系統的關聯式資料庫需求。Standalone 部署於地端 K8S 叢集供開發測試使用,Galera 部署於 AKS 供生產環境使用。透過 Azure Internal LoadBalancer 對內網暴露服務,搭配 Prometheus Exporter 部署模式 可實現資料庫監控。

部署設定參考

以下為實際部署時使用的完整設定,供日後查詢與複製使用。

環境參數

項目K8S StandaloneAKS Galera(最新)
Helm Chartbitnami/mariadb 18.2.5bitnami/mariadb-galera 13.2.6
Image預設bitnamilegacy/mariadb-galera:12.0.2
StorageClassnfs-clientmanaged-premium
PVC 容量100Gi依 PVC 擴容
副本數11(曾為 3)
CPU Request3
Memory Request12Gi
Service 類型NodePort (30306)ClusterIP + Internal LB
Internal LB IP10.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" \
  --wait

AKS 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: 3306

AKS 部署參數演進摘要

日期事件ReplicasCPUMemory備註
2024/07/03初始安裝32xlarge preset2xlarge preset含 TLS 憑證
2024/08/06重新架設32xlarge preset2xlarge preset移除 TLS
2025/07/21緊急修復128Gi單節點運作,使用 existingClaim
2025/08/25重建 Cluster328GiVolumeSnapshot 還原 PVC
2025/10/06切換 Image1312Gibitnamilegacy/mariadb-galera:12.0.2
2025/10/28性能最佳化1312GiInnoDB 參數調優、Slow Query Log

連線資訊

項目K8S StandaloneK8S / AKS Galera
叢集內 DNSk8s-mariadb.mariadb.svc.cluster.local:3306k8s-mariadb-galera.mariadb.svc.cluster.local:3306
帳號rootroot
對外存取NodePort 30306AKS 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_database

Galera 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

相關概念

來源