存储 (storage)
storage 类聚集了集群里负责数据落盘与对象存储的基础组件:MinIO 对象存储、longhorn 跨节点块存储、以及自托管的镜像 registry(原 nfs-provisioner 已随 NFS 于 2026-06-27 退役)。它们的 manifest 位于 applications/storage/<service>/,由 ArgoCD 自动同步。
本页只陈述能从 manifest、README、CLAUDE.md 验证的事实(镜像、namespace、副本数、端口、ingress host、依赖的 secret、ServiceMonitor 等)。集群的整体数据层视角见 集群架构 · 数据层,节点与调度约定见 节点与调度。
存储方案
集群有两套并存的存储方案,按工作负载特性分流:
- Name
- Longhorn(跨节点副本)
- Description
- StorageClass
longhorn,RWO、默认 2 副本,数据盘是 worker2/3/4 各自挂载的专用盘(/var/lib/longhorn/disk2,+400G/+500G/+200G;worker1 不参与副本调度)。卷可随 Pod 漂移到副本所在节点——vault、grafana、consul、gitea、DNF 游戏服、minio-critical 等"需要在节点宕机后活下来"的数据用它。前身 NFS/nfs-client已于 2026-06-27 退役。
- Name
- local-path(节点本地)
- Description
- K3s 内置的 local-path provisioner,PV 钉在本节点磁盘上。数据库等有状态服务用它,以 StatefulSet 钉在
node-role=database的 worker3 本地盘——README 数据库段列出 PostgreSQL 主从、Redis、MongoDB、RabbitMQ、Meilisearch ×2、MinIO(800GB)、NATS、Consul、Tempo 等都跑在 local-path 上。
组件清单
- Name
- minio
- Description
- S3 兼容对象存储。单副本 StatefulSet,镜像
quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z,namespaceminio。数据卷用volumeClaimTemplates,storageClassName: local-path,请求 800Gi,并以nodeSelector: node-role=database钉在 worker3。容器暴露9000(S3 API)与9001(Console)两个端口,ClusterIP Service 同时转发两者。Ingress 把minio.yldm.tech路由到 Console(9001)、minio-api.yldm.tech路由到 API(9000),证书走letsencrypt-prod、经 Cloudflare tunnel 代理。登录集成 Dex OIDC(https://dex.yldm.tech),ExternalSecretminio-secret从 Vault 拉minio/root的 root 密码与dex/clients/minio的 OIDC client secret。有 ServiceMonitor(抓/minio/v2/metrics/cluster)。Terraform state 与 registry 桶已迁到minio-critical(Longhorn 2 副本,见下方 Note),这里主要承载 velero / database-backups / etcd 快照等备份类大桶。
- Name
- longhorn
- Description
- 跨节点块存储(
longhorn-systemnamespace,manifest 在applications/storage/longhorn/)。提供longhorn/longhorn-static两个 StorageClass,卷级快照/备份走 RecurringJob(snapshot-daily/backup-weekly),backupTarget 指向 NAS。节点盘配置(各 worker 的 disk2)是集群内kubectl patch,不在 Git。
- Name
- registry
- Description
- 自托管镜像仓库,
registry:3.1.1,单副本 Deployment,namespaceregistry,以非 root(uid/gid 1000)运行。容器端口5000(HTTP)与5001(metrics)。存储后端是 S3——指向集群内的minio-critical(http://minio-critical.minio.svc.cluster.local:9000,bucketregistry,forcepathstyle;Longhorn 2 副本,镜像数据不可重建所以不放主实例),凭据由 ExternalSecretregistry-s3从 Vaultregistry/minio注入(access-key / secret-key / http-secret)。另带一个registry-ui(joxit/docker-registry-ui:2.6.0,端口 8080)做只读浏览。有 ServiceMonitor(抓 5001 的/metrics)。
bootstrap 里登记的 storage 类 Application 为 longhorn、minio、registry,manifest 均位于 applications/storage/ 目录下。minio namespace 里实际跑着两个 MinIO 实例:主实例(local-path 800Gi,存大而可重建的备份类桶)和 minio-critical(Longhorn 2 副本,存 dify / registry / terraform-state 这类不可重建的数据)——不要把 minio-critical 当冗余删掉。MinIO 的桶
MinIO 通过一组 sync-wave 的 Job(quay.io/minio/mc,mc mb --ignore-existing)幂等创建初始 bucket,连接 https://minio-api.yldm.tech:
| Bucket | 用途(按 Job 命名) |
|---|---|
registry | 镜像仓库的 S3 后端 |
velero-backups | Velero 备份目标 |
k3s-etcd-snapshots | K3s etcd 快照 |
dnf | DNF 相关数据 |
yldm-static | 静态资源 |
MinIO 同时是集群三层备份(源 → MinIO → NAS)中的中间层,相关流程见仓库 docs/backup-and-restore-runbook.md。
镜像仓库
registry 把镜像 blob 实际存到 minio-critical 的 registry bucket,但关掉了 S3 重定向(redirect.disable: true):MinIO 只在集群内可达(NetworkPolicy + 内部 DNS),若让客户端被 307 重定向到 minio-critical.minio.svc:9000 会拉取失败,因此由 registry 自身代理 blob 内容。
对外有两套域名,分别挂在不同的 Cloudflare account tunnel 上:
- Name
- yldm.tech(新 account tunnel)
- Description
registry.yldm.tech(推拉)与registry-ui.yldm.tech(UI),由 cert-manager 经 DNS-01 签发 origin 证书(registry-tls/registry-ui-tls)。镜像层可能很大,ingress 放开了 body 上限并拉长了读写超时。
- Name
- dunaifen.games(旧 account tunnel)
- Description
registry.dunaifen.games与registry-ui.dunaifen.games仍在旧 account 的 tunnel 上,走 Cloudflare 边缘 TLS 回源,因此没有 origin 证书(无tls块)。