存储 (storage)

storage 类聚集了集群里负责数据落盘与对象存储的基础组件:MinIO 对象存储、longhorn 跨节点块存储、以及自托管的镜像 registry(原 nfs-provisioner 已随 NFS 于 2026-06-27 退役)。它们的 manifest 位于 applications/storage/<service>/,由 ArgoCD 自动同步。

存储方案

集群有两套并存的存储方案,按工作负载特性分流:

  • 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,namespace minio。数据卷用 volumeClaimTemplatesstorageClassName: 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),ExternalSecret minio-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-system namespace,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,namespace registry,以非 root(uid/gid 1000)运行。容器端口 5000(HTTP)与 5001(metrics)。存储后端是 S3——指向集群内的 minio-criticalhttp://minio-critical.minio.svc.cluster.local:9000,bucket registryforcepathstyle;Longhorn 2 副本,镜像数据不可重建所以不放主实例),凭据由 ExternalSecret registry-s3 从 Vault registry/minio 注入(access-key / secret-key / http-secret)。另带一个 registry-uijoxit/docker-registry-ui:2.6.0,端口 8080)做只读浏览。有 ServiceMonitor(抓 5001 的 /metrics)。

MinIO 的桶

MinIO 通过一组 sync-wave 的 Job(quay.io/minio/mcmc mb --ignore-existing)幂等创建初始 bucket,连接 https://minio-api.yldm.tech

Bucket用途(按 Job 命名)
registry镜像仓库的 S3 后端
velero-backupsVelero 备份目标
k3s-etcd-snapshotsK3s etcd 快照
dnfDNF 相关数据
yldm-static静态资源

MinIO 同时是集群三层备份(源 → MinIO → NAS)中的中间层,相关流程见仓库 docs/backup-and-restore-runbook.md

镜像仓库

registry 把镜像 blob 实际存到 minio-criticalregistry 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.gamesregistry-ui.dunaifen.games 仍在旧 account 的 tunnel 上,走 Cloudflare 边缘 TLS 回源,因此没有 origin 证书(无 tls 块)。

评论