MongoDB Kubernetes Operator 的擴縮容流程是聲明式的,核心是修改你的 MongoDB 自定義資源 (CR) 文件並重新應用,Operator 會自動協調,使集羣狀態與你的聲明匹配。

🔧 水平與垂直擴縮容原理對比

下表對比了兩種擴縮容方式在 MongoDB 中的具體實現,幫助你快速區分:

特性

水平擴縮容 (Horizontal)

垂直擴縮容 (Vertical)

核心目標

增減節點/分片數量,以提升容量、冗餘或處理能力。

調整單個Pod的資源規格(CPU/內存),以提升或降低單節點性能。

操作對象

副本集的 spec.members、分片集羣的 shardCountmongodsPerShard 等。

Pod 模板中的 spec.podSpec.podTemplate.spec.containers.resources(limits/requests)。

Operator動作

創建/刪除 StatefulSet 的 Pod,並自動將新成員加入副本集或分片集羣。

更新 Pod 模板,觸發 StatefulSet 對 Pod 進行滾動重啓

服務影響

副本集:新成員異步同步數據,通常影響小;縮容時,Operator 會確保數據安全。

分片集羣:數據重平衡可能產生負載。

有狀態Pod滾動重啓:每個 Pod 重啓時會有秒級服務中斷,需應用具備重連機制。

主要耗時

分鐘級,主要耗時在 Pod 調度啓動、數據同步或分片數據遷移。

分鐘到十分鐘級,取決於 Pod 數量、重啓策略和健康檢查。

數據與存儲

有狀態 Pod 關聯 PVC(持久化卷聲明),縮容時通常保留 PVC(取決於回收策略),以備重新擴容時使用。

資源變動通常不直接影響 PVC 中已有的數據。

🧩 不同架構的擴縮容參數

你需要根據部署類型,在 CR 文件中修改不同的字段:

  • 副本集 (ReplicaSet)
  • 水平擴縮容:修改 spec.members 字段。
  • 垂直擴縮容:修改 spec.podSpec.podTemplate.spec.containers.resources 字段。
  • 分片集羣 (ShardedCluster)
  • 水平擴縮容:可以分別調整以下組件數量:
  • spec.shardCount:分片數量。
  • spec.mongodsPerShard每個分片的副本集成員數。
  • spec.mongosCount:查詢路由 (mongos) 的數量。
  • spec.configServerCount:配置服務器的成員數。

📋 詳細操作流程

第一步:變更前準備

  1. 備份配置與數據:備份你的 MongoDB CR 文件。執行關鍵數據備份(可通過Ops Manager配置或 mongodump 命令)。
  2. 檢查集羣狀態:確保集羣當前健康,所有 Pod (kubectl get pods) 和副本集狀態正常。
  3. 資源規劃(垂直擴容時):確保 Kubernetes 節點有足夠的 CPU/內存容納新的資源請求,避免 Pod 無法調度。
  4. 選擇時機:在業務低峯期操作,尤其對於涉及 Pod 滾動重啓的垂直擴縮容。

第二步:執行擴縮容操作

  1. 編輯自定義資源(CR)文件:修改對應字段。例如,將副本集成員從3個擴展到4個:
# 原配置
apiVersion: mongodb.com/v1
kind: MongoDB
metadata:
  name: my-replica-set
spec:
  members: 3 # 修改此值
  version: "8.0.0"
  type: ReplicaSet
  # ... 其他配置
  1. 應用新配置:使用 kubectl apply 使變更生效。
kubectl apply -f your-mongodb-cr.yaml

第三步:監控與驗證

  1. 觀察協調過程
# 觀察Pod變化
kubectl get pods -w -l app=mongodb-replicaset
# 查看Operator日誌(瞭解協調細節)
kubectl logs -f deployment/mongodb-kubernetes-operator -n <operator-namespace>
  1. 驗證集羣狀態
  • 所有新 Pod 應進入 Running 狀態。
  • 通過連接到任一 mongod 實例,使用 rs.status() 命令檢查副本集成員數量和狀態是否正常。
  • 對於分片集羣,通過 mongos 連接,使用 sh.status() 檢查分片信息。

⚠️ 關鍵注意事項與風險控制

  • 部署類型不可轉換:Operator 不支持直接將一個獨立實例轉換為副本集,或將副本集轉換為分片集羣。這需要創建新部署並遷移數據。
  • 垂直擴縮容與滾動重啓:這會導致 Pod 逐個重啓。對於生產環境,務必確保:
  1. 應用具備自動重連和重試機制
  2. 結合使用 PodDisruptionBudget 來保證最小可用副本數。
  • 分片集羣的負載與容量:增加 shardCount 會觸發集羣內的數據塊遷移和重平衡,可能短期內增加集羣負載。規劃時應預留容量。
  • Operator 版本與兼容性:確保你使用的 MongoDB Operator 版本與你指定的 MongoDB Server spec.version 兼容。從搜索結果看,請注意區分新舊 Operator 版本。
  • 底層基礎設施依賴:雖然 Operator 簡化了管理,但 MongoDB 的性能和可靠性仍依賴於底層 Kubernetes 集羣的存儲、網絡和計算資源的正確配置與穩定性。

希望這份針對 MongoDB 的詳細流程能幫助你安全地進行擴縮容操作。如果你能提供你正在使用的 MongoDB CR 示例片段具體想調整的組件(例如是調整副本集成員數,還是想為 mongod 容器增加 CPU),我可以為你提供更具體的配置建議。