Skip to content

MongoDB Helm 部署

使用 Bitnami Helm Chart 在 Kubernetes 上部署 MongoDB,支援 Standalone 與 ReplicaSet 兩種架構,搭配 Azure Internal LoadBalancer 提供內網存取。

概述

在 Kubernetes 中部署 MongoDB,Bitnami 提供的 Helm Chart 是最廣泛使用的方案之一。它封裝了 MongoDB 的部署複雜度,透過 values.yaml 即可宣告式地配置架構模式、認證、持久化儲存與網路暴露方式。

本文記錄使用 Bitnami MongoDB Chart(版本 16.5.33)的兩種部署架構:適合開發測試的 Standalone 模式,以及適合生產環境的 ReplicaSet 模式。兩者均搭配 Azure Internal LoadBalancer 提供內網固定 IP 存取。

核心內容

Helm 基本操作

部署 MongoDB 的標準流程是:新增 Bitnami Helm Repository、更新索引、然後以自訂的 values.yaml 安裝:

bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install replica-mongodb bitnami/mongodb \
  --namespace mongodb \
  -f replica-values.yaml

Standalone 架構

Standalone 是最簡單的單節點部署模式,適合開發、測試或資料量不大的場景。

核心設定要點:

  • 架構設為 standalone,停用 Arbiter
  • 持久化使用 managed-csi StorageClass,配置 8Gi 磁碟空間
  • Service 類型為 LoadBalancer,透過 Azure 註解綁定內部固定 IP
  • 資源請求 Memory 1Gi / CPU 250m

存取方式: 內網客戶端透過 LoadBalancer 分配的固定 IP 直接連線 MongoDB,連線字串格式為 mongodb://<user>:<password>@<LB-IP>:27017

ReplicaSet 架構

ReplicaSet 模式部署 3 個副本(1 Primary + 2 Secondary),提供高可用性與讀取擴展能力,適合生產環境。

核心設定要點:

  • 架構設為 replicaset,副本數 3,停用 Arbiter
  • 持久化配置 10Gi 磁碟空間(較 Standalone 更大)
  • 必須啟用 externalAccess 並使用 autoDiscovery,讓每個副本自動產生獨立的 LoadBalancer Service
  • 需建立 ServiceAccount 並啟用 RBAC,以便 Chart 能自動發現各副本的外部 IP

為何需要 External Access: 這是 ReplicaSet 部署的一個重要陷阱。MongoDB 客戶端在連線 ReplicaSet 時,會嘗試連線到 Primary 回報的所有成員位址。若未啟用 externalAccess,成員之間僅有叢集內部 DNS 名稱,外部客戶端無法解析這些名稱,導致連線失敗。啟用 externalAccess + autoDiscovery 後,每個副本都會獲得獨立的 LoadBalancer IP,客戶端便能正確連線到所有成員。

兩種架構比較

面向StandaloneReplicaSet
節點數13
高可用是(自動故障轉移)
磁碟空間8Gi10Gi(每節點)
External Access單一 LoadBalancer每節點獨立 LoadBalancer
RBAC 需求需要(autoDiscovery)
適用場景開發 / 測試生產環境

測試連線

部署完成後,可建立一個臨時的 Client Pod 進行連線測試:

bash
kubectl run --namespace mongodb replica-mongodb-client \
  --restart='Never' \
  --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" \
  --image docker.io/bitnami/mongodb:8.0.12-debian-12-r0 \
  --command -- tail -f /dev/null

進入 Pod 後使用 mongosh 連線至 MongoDB 進行驗證。

關鍵要點

  • Bitnami Helm Chart 大幅簡化 MongoDB 在 Kubernetes 上的部署與管理
  • ReplicaSet 模式必須啟用 externalAccess + autoDiscovery,否則外部客戶端無法正確連線所有成員
  • 兩種架構均使用 Azure Internal LoadBalancer 提供內網固定 IP 存取
  • 持久化儲存使用 managed-csi StorageClass,確保資料不隨 Pod 刪除而遺失
  • 生產環境建議使用 ReplicaSet 以獲得高可用性與自動故障轉移能力

實際應用

MongoDB 在 Kubernetes 上的部署常見於微服務架構中,作為應用程式的文件型資料庫。Standalone 模式適合快速搭建開發環境,ReplicaSet 模式則為生產服務提供資料冗餘與高可用保障。搭配 Prometheus Exporter 部署模式 可進一步監控資料庫的運行狀態。

部署設定參考

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

Helm 操作指令

bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install replica-mongodb bitnami/mongodb \
  --namespace mongodb \
  -f replica-values.yaml

Standalone — values.yaml

yaml
auth:
  enabled: true
  rootUser: superuser
  rootPassword: SI5YI1DLSk8m9S

architecture: standalone

persistence:
  enabled: true
  storageClass: "managed-csi"
  size: 8Gi

arbiter:
  enabled: false

resources:
  requests:
    memory: 1Gi
    cpu: 250m

service:
  type: LoadBalancer
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-ipv4: "10.244.196.16"
項目
架構standalone
root 帳號superuser
root 密碼SI5YI1DLSk8m9S
儲存類別managed-csi
磁碟大小8Gi
Service 類型LoadBalancer(Azure 內部)
指定內部 IP10.244.196.16

ReplicaSet — values.yaml

yaml
architecture: replicaset
replicaCount: 3
arbiter:
  enabled: false

auth:
  enabled: true
  rootUser: admin
  rootPassword: ur50wGUazXCrjZ

externalAccess:
  enabled: true
  service:
    type: LoadBalancer
    annotations:
      service.beta.kubernetes.io/azure-load-balancer-internal: "true"
  autoDiscovery:
    enabled: true

serviceAccount:
  create: true

automountServiceAccountToken: true

rbac:
  create: true

resources:
  requests:
    memory: "1Gi"
    cpu: "250m"

persistence:
  enabled: true
  size: 10Gi
項目
架構replicaset
副本數3
Arbiter停用
root 帳號admin
root 密碼ur50wGUazXCrjZ
磁碟大小10Gi
External Access啟用(LoadBalancer + autoDiscovery)

測試用 Client Pod

bash
kubectl run --namespace mongodb replica-mongodb-client \
  --restart='Never' \
  --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" \
  --image docker.io/bitnami/mongodb:8.0.12-debian-12-r0 \
  --command -- tail -f /dev/null

相關概念

來源