MongoDB · 集群的文档型数据库

MongoDB 是 yldm 集群里的文档型数据库,以单副本 StatefulSet 形式部署在独立的 mongodb namespace,开启了 authorization: enabled 的鉴权,数据落在钉在 worker3 本地盘的 200Gi PVC 上。它旁边还跑了一个 percona mongodb_exporter Deployment,把运行指标喂给 Prometheus。

部署形态

  • Name
    命名空间
    Description
    mongodb(由 namespace.yaml 单独创建,带 name: mongodb 标签;kustomization 统一 namespace: mongodb,无 namePrefix)。
  • Name
    工作负载
    Description
    主体是 StatefulSet/mongodbreplicas: 1serviceName: mongodb-headless,selector app: mongodb。监控侧另有一个独立的 Deployment/mongodb-exporterreplicas: 1app: mongodb-exporter)。
  • Name
    镜像与版本
    Description
    数据库容器 mongo:8.3;exporter 容器 percona/mongodb_exporter:0.51
  • Name
    调度
    Description
    StatefulSet 带 nodeSelector: node-role: database——集群里只有 k8s-worker3(192.168.88.113)有这个标签,且其 PV 用 local-path 钉在本节点本地盘,所以 MongoDB 固定跑在 worker3。exporter Deployment 没有 nodeSelector,可调度到任意节点。
  • Name
    端口
    Description
    数据库容器监听 27017(端口名 mongodb,TCP);exporter 容器监听 9216(端口名 metrics)。
  • Name
    存储
    Description
    独立的 PersistentVolumeClaim/mongodb-data不是 volumeClaimTemplates,而是单独的 PVC 对象),ReadWriteOnce200GistorageClassName: local-path,挂到容器 /data/db。另把 mongodb-config ConfigMap 挂到 /etc/mongo
  • Name
    资源
    Description
    数据库容器 requests cpu 500m / memory 1Gi,limits cpu 2000m / memory 4Gi;exporter requests cpu 10m / memory 32Mi,limits cpu 100m / memory 128Mi。namespace 另有 ResourceQuota(pods 10、requests.cpu 1 / memory 2Gi、limits.cpu 4 / memory 8Gi)与 LimitRange 兜底默认值。

配置与依赖

ConfigMap mongodb-config 提供 mongod.confstorage.dbPath: /data/dbjournal.enabled: truesystemLog 写文件到 /var/log/mongodb/mongod.lognet.port: 27017bindIp: 0.0.0.0security.authorization: enabled(强制鉴权)。

数据库的 root 凭据通过 ExternalSecret mongodb-secret 从 Vault 拉取,走 ClusterSecretStore vault-backendremoteRef.key: secret/database/prod/mongodb,取三个 property:usernameMONGO_INITDB_ROOT_USERNAMEpasswordMONGO_INITDB_ROOT_PASSWORDuriMONGODB_URI。StatefulSet 把前两个作为 MONGO_INITDB_ROOT_* 环境变量注入,用于初始化 root 账号;refreshInterval: 1h

exporter 侧另有一个 ExternalSecret mongodb-exporter-secret,从同一个 Vault key 取 username/password,再用 engineVersion: v2 模板拼出 MONGODB_URI: mongodb://{{ .username }}:{{ .password }}@mongodb:27017/admin。exporter Deployment 用 --mongodb.uri=$(MONGODB_URI) 连进库,并开启 --compatible-mode --discovering-modediagnosticdata/replicasetstatus/dbstats/topmetrics/indexstats/collstats 等 collector。

访问与监控

Service类型端口用途
mongodbClusterIP27017集群内访问入口(exporter 与各应用连这里)
mongodb-headlessHeadless(clusterIP None)27017StatefulSet 稳定网络标识
mongodb-nodeportNodePort27017 → nodePort 30017集群外直连(标 service-type: external-access
mongodb-exporterClusterIP9216指标抓取端点

健康检查用 mongosh --eval "db.adminCommand('ping')":liveness initialDelaySeconds 30 / period 10,readiness initialDelaySeconds 10 / period 5

监控由 ServiceMonitor mongodb 完成:它 selector app: mongodb-exporter,抓 metrics 端口 /metricsinterval: 30s,并 relabel 出 pod/namespace 以及把 service/job 固定为 mongodb。本目录没有 HPA / VPA / PDB / PrometheusRule(有状态单副本,不做水平伸缩)。

网络侧 namespace 默认 default-deny-ingress,再按需放行:同 namespace(allow-same-namespace)、来自 app / game / platform / argo-workflows 各 namespace 的入站、DNS 出站、以及 Prometheus 抓取。

注意事项

以下来自仓库 CLAUDE.md 对 MongoDB 升级踩坑的记录,自托管场景下纯 image tag bump 往往是破坏性变更,需要一并处理:

节点 CPU 必须暴露 AVX(PVE 带外改动,不在本仓库)。 MongoDB 5.0+ 要求 AVX。k8s VM 最初是 x86-64-v2-AES 虚拟 CPU,不暴露 AVX,mongod ≥5.0 会直接 Illegal instruction(SIGILL)崩。修复办法是把每个节点 vCPU 类型提到 x86-64-v3qm set <vmid> -cpu x86-64-v3 后冷重启 VM)。选 v3 而非 host 是因为集群混用两种 CPU 型号,v3 是它们暴露 AVX/AVX2 的公共子集,跨主机 live-migration 不会因特性不匹配而挂。这条配置活在 PVE 层,节点若从旧模板重建会退回无 AVX 状态,mongo 会再次崩。

升过 6.0 要用 mongosh 而非 mongo 旧版 mongo shell 在 6.0 被移除,liveness/readiness 探针和 restore-verify 演练必须用 mongosh——当前 manifest 的探针已是 mongosh --eval(#1022)。

大版本数据不会自动升级,清库要小心。 mongod 拒绝在过旧的数据文件上启动(exitCode 62Invalid featureCompatibilityVersion document)。更糟的是 8.x mongod 短暂打开 4.4 数据会升级 WiredTiger 文件格式但把 FCV 留在 4.4,两个版本互锁。要丢弃数据时必须物理清空挂载点(用一个临时 pod 挂 PVC 跑 find /data/db -mindepth 1 -delete)——单删 PVC 不可靠(argocd selfHeal 会中途重建 StatefulSet 抢跑清理)。只有真正空的 /data/db 才能让 entrypoint 干净重新初始化(用 db.adminCommand({getParameter:1,featureCompatibilityVersion:1}) 校验新大版本)。4.4→8.3 迁移见 #1022。

返回 data 类服务总览

评论