数据层 (data)

data 是集群里的数据库、缓存与搜索中间件这一类,绝大多数是有状态服务,落在 applications/data/<service>/ 下,每个目录是一个独立的 kustomize root。有状态实例多用 StatefulSet,钉在 node-role=database 的 worker3 本地;无状态的连接池/代理/exporter 则用 Deployment。本页只罗列能从 manifest 验证的事实(镜像、副本、端口、namespace、ingress、调度),不臆测业务用途。

组件总览

  • Name
    clickhouse
    Description
    StatefulSet,replicas: 1,镜像 clickhouse/clickhouse-server:26.5,namespace clickhouse。暴露 HTTP 8123、native 9000、interserver 9009,含 clickhouse 与 headless clickhouse-headless 两个 ClusterIP Service。数据走 volumeClaimTemplates(20Gi,nfs-client)。调度用 workload: app,不钉 node-role=database
  • Name
    consul
    Description
    StatefulSet,replicas: 1,镜像 hashicorp/consul:2.0.0,namespace consul。端口含 HTTP 8500、gRPC 8502、DNS 8600、serf/server 系列(8301/8302/8300)。有 ExternalSecret(consul-secret,含 HTTP token 与 gossip 加密 key)和 Ingress(host consul.yldm.tech)。钉在 node-role=database
  • Name
    meilisearch
    Description
    StatefulSet,replicas: 1,镜像 getmeili/meilisearch:v1.46,namespace meilisearch。HTTP 端口 7700MEILI_ENV=production,master key 来自 ExternalSecret meilisearch-secret。有 Ingress(host meilisearch.yldm.tech)。钉在 node-role=database。版本迁移有坑,见下文。
  • Name
    mongodb
    Description
    StatefulSet,replicas: 1,镜像 mongo:8.3,namespace mongodb。端口 27017,root 账号来自 ExternalSecret mongodb-secretremoteRef.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,namespace postgres(与 postgres 共用 namespace)。监听 5432,sidecar prometheuscommunity/pgbouncer-exporter:v0.12.09127)+ ServiceMonitor。Postgres 的连接池,无状态,调度用 workload: app
  • Name
    postgres
    Description
    主从两套 StatefulSet:postgres-primaryreplicas: 1,钉 node-role=database)与 postgres-replicareplicas: 1,钉 kubernetes.io/hostname: k8s-worker2 以与主库分散在不同节点)。镜像均 postgres:18-alpine,端口 5432,namespace postgres。含 postgres-primary/postgres-replica/postgres-headless 三个 Service、exporter 与 ServiceMonitor。
  • Name
    redis
    Description
    命名空间 redis 的“壳”目录 —— 独立 redis 已在 Sentinel HA 切换后下线,实际实例见 redis-ha。本目录现在只保留共享的 redis Service(指向 HAProxy)、NodePort Service、ExternalSecret redis-secretoliver006/redis_exporter:v1.86.0 exporter(9121)+ ServiceMonitor,以及配额/网络策略。端口 6379
  • Name
    redis-ha
    Description
    Sentinel 模式 HA,namespace redisredis-ha StatefulSet replicas: 3 + redis-ha-sentinel StatefulSet replicas: 3(均 redis:8.8-alpine,端口 6379/26379),前面挂 redis-ha-haproxy Deployment replicas: 2haproxy:3.4-alpine,监听 6379)。redis 节点用 podAntiAffinitytopologyKey: kubernetes.io/hostname)打散到不同节点。客户端经上面 redis 目录里的 redis Service → 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 打散。

服务形态副本调度持久化
clickhouseStatefulSet1workload: appvolumeClaimTemplates 20Gi nfs-client
consulStatefulSet1node-role: database
meilisearchStatefulSet1node-role: database
mongodbStatefulSet1node-role: database独立 pvc.yaml
pgbouncerDeployment2workload: app无状态
postgres-primaryStatefulSet1node-role: database
postgres-replicaStatefulSet1hostname: k8s-worker2
redis-ha (redis)StatefulSet3podAntiAffinity 打散
redis-ha (sentinel)StatefulSet3
redis-ha-haproxyDeployment2无状态

升级踩坑

数据层组件的版本 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 移除了旧版 mongo shell,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。

评论