数据层 (data)
data 是集群里的数据库、缓存与搜索中间件这一类,绝大多数是有状态服务,落在 applications/data/<service>/ 下,每个目录是一个独立的 kustomize root。有状态实例多用 StatefulSet,钉在 node-role=database 的 worker3 本地;无状态的连接池/代理/exporter 则用 Deployment。本页只罗列能从 manifest 验证的事实(镜像、副本、端口、namespace、ingress、调度),不臆测业务用途。
所有密码、token、master key 都不进 git,由 ExternalSecret 经 ClusterSecretStore
vault-backend 从 Vault 拉取。改 VM 的 CPU/内存要去 pve-infra,不在本仓库。组件总览
- Name
- clickhouse
- Description
- StatefulSet,
replicas: 1,镜像clickhouse/clickhouse-server:26.5,namespaceclickhouse。暴露 HTTP8123、native9000、interserver9009,含clickhouse与 headlessclickhouse-headless两个 ClusterIP Service。数据走volumeClaimTemplates(20Gi,nfs-client)。调度用workload: app,不钉node-role=database。
- Name
- consul
- Description
- StatefulSet,
replicas: 1,镜像hashicorp/consul:2.0.0,namespaceconsul。端口含 HTTP8500、gRPC8502、DNS8600、serf/server 系列(8301/8302/8300)。有 ExternalSecret(consul-secret,含 HTTP token 与 gossip 加密 key)和 Ingress(hostconsul.yldm.tech)。钉在node-role=database。
- Name
- meilisearch
- Description
- StatefulSet,
replicas: 1,镜像getmeili/meilisearch:v1.46,namespacemeilisearch。HTTP 端口7700,MEILI_ENV=production,master key 来自 ExternalSecretmeilisearch-secret。有 Ingress(hostmeilisearch.yldm.tech)。钉在node-role=database。版本迁移有坑,见下文。
- Name
- mongodb
- Description
- StatefulSet,
replicas: 1,镜像mongo:8.3,namespacemongodb。端口27017,root 账号来自 ExternalSecretmongodb-secret(remoteRef.key: secret/database/prod/mongodb)。含独立 exporter Deployment + ServiceMonitor,数据用独立pvc.yaml(非 volumeClaimTemplates)。钉在node-role=database。对 CPU 和 shell 有硬性要求,见下文。
- Name
- pgbouncer
- Description
- Deployment,
replicas: 2,镜像edoburu/pgbouncer:v1.25.2-p0,namespacepostgres(与 postgres 共用 namespace)。监听5432,sidecarprometheuscommunity/pgbouncer-exporter:v0.12.0(9127)+ ServiceMonitor。Postgres 的连接池,无状态,调度用workload: app。
- Name
- postgres
- Description
- 主从两套 StatefulSet:
postgres-primary(replicas: 1,钉node-role=database)与postgres-replica(replicas: 1,钉kubernetes.io/hostname: k8s-worker2以与主库分散在不同节点)。镜像均postgres:18-alpine,端口5432,namespacepostgres。含postgres-primary/postgres-replica/postgres-headless三个 Service、exporter 与 ServiceMonitor。
- Name
- redis
- Description
- 命名空间
redis的“壳”目录 —— 独立 redis 已在 Sentinel HA 切换后下线,实际实例见 redis-ha。本目录现在只保留共享的redisService(指向 HAProxy)、NodePort Service、ExternalSecretredis-secret、oliver006/redis_exporter:v1.86.0exporter(9121)+ ServiceMonitor,以及配额/网络策略。端口6379。
- Name
- redis-ha
- Description
- Sentinel 模式 HA,namespace
redis。redis-haStatefulSetreplicas: 3+redis-ha-sentinelStatefulSetreplicas: 3(均redis:8.8-alpine,端口6379/26379),前面挂redis-ha-haproxyDeploymentreplicas: 2(haproxy:3.4-alpine,监听6379)。redis 节点用podAntiAffinity(topologyKey: kubernetes.io/hostname)打散到不同节点。客户端经上面 redis 目录里的redisService → HAProxy 接入。
调度与持久化
集群调度键在单值的 workload 节点标签和 node-role 标签上,详见 节点与调度。有状态主库(mongodb、postgres-primary、consul、meilisearch)钉 node-role=database(只有 worker3 有这个标签),紧贴本地盘;postgres-replica 故意钉到 k8s-worker2,与主库分散到不同节点避免单点。clickhouse 和 pgbouncer 用 workload: app,不进数据库节点。redis-ha 的三个 redis 节点用 podAntiAffinity 打散。
| 服务 | 形态 | 副本 | 调度 | 持久化 |
|---|---|---|---|---|
| clickhouse | StatefulSet | 1 | workload: app | volumeClaimTemplates 20Gi nfs-client |
| consul | StatefulSet | 1 | node-role: database | — |
| meilisearch | StatefulSet | 1 | node-role: database | — |
| mongodb | StatefulSet | 1 | node-role: database | 独立 pvc.yaml |
| pgbouncer | Deployment | 2 | workload: app | 无状态 |
| postgres-primary | StatefulSet | 1 | node-role: database | — |
| postgres-replica | StatefulSet | 1 | hostname: k8s-worker2 | — |
| redis-ha (redis) | StatefulSet | 3 | podAntiAffinity 打散 | — |
| redis-ha (sentinel) | StatefulSet | 3 | — | — |
| redis-ha-haproxy | Deployment | 2 | — | 无状态 |
mongodb 数据放在独立的
pvc.yaml(不是 volumeClaimTemplates),所以删掉 StatefulSet 不会删数据,要单独删 PVC 才能清空。升级踩坑
数据层组件的版本 bump 经常是破坏性变更,光换镜像 tag 不够。Renovate 和 argocd-image-updater 只换 tag,自托管中间件往往还需要配套的 CRD、探针、env、配置或数据迁移,否则崩溃循环。下面两条是已踩过的坑。
- Name
- mongodb 需要 AVX,并且只能用 mongosh
- Description
- MongoDB 5.0+ 要求 CPU 暴露 AVX 指令集。k8s 节点 VM 原本配的
x86-64-v2-AES虚拟 CPU 不暴露 AVX,mongod ≥5.0 会直接Illegal instruction(SIGILL)退出。解决办法是把每个节点的 vCPU 类型提到x86-64-v3(在 PVE 上qm set <vmid> -cpu x86-64-v3后冷重启),这是pve-infra里的改动,不在本仓库。另外 6.0 移除了旧版mongoshell,liveness/readiness 探针与恢复演练必须用mongosh,否则 pod 不 Ready。大版本数据不自动升级,丢弃数据要物理清空/data/db,光删 PVE 不可靠(argocd selfHeal 会中途重建 StatefulSet 抢操作)。
- Name
- meilisearch 引擎拒绝旧盘数据
- Description
- MeiliSearch 引擎会拒绝过旧的 on-disk DB 且不自动迁移。无 dump 升级只在 ≥v1.12 且一次一步时可行,v1.11→v1.46 的跨大版本直接 crash-loop(当时通过清空空 DB 解决)。这类包在
renovate.json里带dependencyDashboardApproval,取 bump 时必须在同一个 PR 里带上对应的迁移或清数据,绝不能只合 tag。
metallb、vault 等其它组件也有“minor/major bump 是破坏性变更”的同类坑,详见仓库
CLAUDE.md 的对应小节。