MongoDB · 集群的文档型数据库
MongoDB 是 yldm 集群里的文档型数据库,以单副本 StatefulSet 形式部署在独立的 mongodb namespace,开启了 authorization: enabled 的鉴权,数据落在钉在 worker3 本地盘的 200Gi PVC 上。它旁边还跑了一个 percona mongodb_exporter Deployment,把运行指标喂给 Prometheus。
applications/data/mongodb/)能验证的事实——工作负载形态、镜像、存储、密钥引用、Service 与监控。MongoDB 这类自托管有状态组件的版本升级历史上踩过多次坑(AVX、mongosh、FCV),见末尾「注意事项」。部署形态
- Name
- 命名空间
- Description
mongodb(由namespace.yaml单独创建,带name: mongodb标签;kustomization 统一namespace: mongodb,无 namePrefix)。
- Name
- 工作负载
- Description
- 主体是
StatefulSet/mongodb,replicas: 1,serviceName: mongodb-headless,selectorapp: mongodb。监控侧另有一个独立的Deployment/mongodb-exporter(replicas: 1,app: 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 对象),ReadWriteOnce,200Gi,storageClassName: local-path,挂到容器/data/db。另把mongodb-configConfigMap 挂到/etc/mongo。
- Name
- 资源
- Description
- 数据库容器 requests
cpu 500m / memory 1Gi,limitscpu 2000m / memory 4Gi;exporter requestscpu 10m / memory 32Mi,limitscpu 100m / memory 128Mi。namespace 另有 ResourceQuota(pods 10、requests.cpu 1 / memory 2Gi、limits.cpu 4 / memory 8Gi)与 LimitRange 兜底默认值。
配置与依赖
ConfigMap mongodb-config 提供 mongod.conf:storage.dbPath: /data/db、journal.enabled: true、systemLog 写文件到 /var/log/mongodb/mongod.log、net.port: 27017 且 bindIp: 0.0.0.0、security.authorization: enabled(强制鉴权)。
数据库的 root 凭据通过 ExternalSecret mongodb-secret 从 Vault 拉取,走 ClusterSecretStore vault-backend,remoteRef.key: secret/database/prod/mongodb,取三个 property:username → MONGO_INITDB_ROOT_USERNAME、password → MONGO_INITDB_ROOT_PASSWORD、uri → MONGODB_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-mode 及 diagnosticdata/replicasetstatus/dbstats/topmetrics/indexstats/collstats 等 collector。
访问与监控
| Service | 类型 | 端口 | 用途 |
|---|---|---|---|
mongodb | ClusterIP | 27017 | 集群内访问入口(exporter 与各应用连这里) |
mongodb-headless | Headless(clusterIP None) | 27017 | StatefulSet 稳定网络标识 |
mongodb-nodeport | NodePort | 27017 → nodePort 30017 | 集群外直连(标 service-type: external-access) |
mongodb-exporter | ClusterIP | 9216 | 指标抓取端点 |
健康检查用 mongosh --eval "db.adminCommand('ping')":liveness initialDelaySeconds 30 / period 10,readiness initialDelaySeconds 10 / period 5。
监控由 ServiceMonitor mongodb 完成:它 selector app: mongodb-exporter,抓 metrics 端口 /metrics,interval: 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-v3(qm 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 62,Invalid 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。
mongodb-data 是独立 PVC 对象而非 volumeClaimTemplates,删掉 StatefulSet 不会删数据——要清库必须单独删 PVC(且按上面所述物理清空更稳妥)。返回 data 类服务总览