MinIO · 集群统一的 S3 兼容对象存储

MinIO 是部署在 minio namespace 的单副本 S3 兼容对象存储,承载集群里所有需要对象存储的下游:Velero 备份、k3s etcd 快照、yldm-static CDN、各应用 bucket 等。

它对外暴露两类入口:Web Console(受 Cloudflare Access 保护)与 S3 API(公网直连),并通过 STS AssumeRoleWithWebIdentity 与 Dex 做 OIDC 集成,供程序获取临时凭据。

部署形态

  • Name
    命名空间
    Description
    minio
  • Name
    工作负载
    Description
    StatefulSet(serviceName minio),replicas: 1 单副本
  • Name
    镜像
    Description
    quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
  • Name
    启动参数
    Description
    server /data --console-address :9001
  • Name
    调度
    Description
    nodeSelector node-role: database(只有 k8s-worker3 带该标签)
  • Name
    端口
    Description
    9000(api)、9001(console)
  • Name
    存储
    Description
    volumeClaimTemplates data,storageClass local-path(本地盘 provisioner),800Gi,ReadWriteOnce
  • Name
    资源
    Description
    requests 50m / 256Mi,limits 500m / 512Mi
  • Name
    探针
    Description
    liveness /minio/health/live、readiness /minio/health/ready,均走 9000 端口

namespace 还附带 ResourceQuota(minio-quota:pods 10、requests 500m/1Gi、limits 2/4Gi)与 LimitRange(minio-limits:容器默认 100m/128Mi,上限 1 CPU/2Gi)。

配置与依赖

root 账号写死为 xiaomo,密码与 OIDC client secret 通过 ExternalSecret minio-secret 从 Vault 经 ClusterSecretStore vault-backend 拉取(refreshInterval: 1h)。

secretKeyremoteRef.keyproperty
root-passwordminio/rootpassword
oidc-secretdex/clients/miniosecret

关键环境变量(在 StatefulSet 容器内直接声明):

变量
MINIO_ROOT_USERxiaomo
MINIO_SERVER_URLhttps://minio-api.yldm.tech
MINIO_BROWSER_REDIRECT_URLhttps://minio.yldm.tech
MINIO_IDENTITY_OPENID_CONFIG_URLhttps://dex.yldm.tech/.well-known/openid-configuration
MINIO_IDENTITY_OPENID_CLIENT_IDminio
MINIO_IDENTITY_OPENID_SCOPESopenid,profile,email,groups
MINIO_IDENTITY_OPENID_REDIRECT_URIhttps://minio.yldm.tech/oauth_callback
MINIO_IDENTITY_OPENID_ROLE_POLICYreadwrite
MINIO_IDENTITY_OPENID_DISPLAY_NAMEDex
MINIO_PROMETHEUS_AUTH_TYPEpublic

依赖项:Vault(凭据来源)、Dex(OIDC IdP)、node-role: database 节点的本地盘。

访问与监控

Service 为 ClusterIP,暴露 api(9000)与 console(9001)两个端口。三个 Ingress 都走 traefik ingressClass,经 cert-manager(letsencrypt-prod)签证书,并通过 external-dns 注册到 Cloudflare Tunnel(cloudflare-proxied: "true")。

Host后端端口用途
minio.yldm.tech9001Web Console(受 Cloudflare Access 保护)
minio-api.yldm.tech9000S3 API(公网直连,无 CF Access)
static.yldm.tech9000yldm-static bucket 只读 CDN,middleware rewrite /(.*)/yldm-static/$1
download.dunaifen.games9000DNF 下载,走单独的 Cloudflare Tunnel + dnf 前缀 rewrite middleware

主 Ingress 设置 proxy-body-size: "0"(不限上传体积)与 600s 读写超时。监控方面:ServiceMonitor minioapi 端口的 /minio/v2/metrics/cluster(interval 30s),配合 MINIO_PROMETHEUS_AUTH_TYPE=public 免鉴权暴露指标。本仓库未为 MinIO 定义 HPA / VPA / PDB。

bucket 初始化 Job

base kustomization 包含一组 argocd.argoproj.io/sync-wave: "1" 的初始化 Job,用 quay.io/minio/mc 镜像在 MinIO 起来后用 root 凭据创建 bucket(mc mb --ignore-existing),按需设置匿名下载权限。涵盖:yldm-staticvelero-backupsk3s-etcd-snapshotsregistrydnf。例如 minio-bucket-yldm-static 创建 yldm-staticmc anonymous set download,对应 static CDN 的只读公开访问。

注意事项

Console 上没有 OIDC 登录按钮是 MinIO 上游 RELEASE.2025-05-24 起的有意行为,不是配置问题:OIDC 登录按钮、用户/策略管理等管理功能被搬进了商业版 AIStor;2025-12 community edition 进入 maintenance mode。服务端 OIDC 仍完整工作——MINIO_IDENTITY_OPENID_*、IAM Role、与 Dex 的 client 注册都正常,任何走 STS AssumeRoleWithWebIdentity 的程序(SDK、mc CLI)都能通过 Dex 拿临时凭据。被砍掉的只是 console 那个按钮,当前选择维持现状:进 console 只用 root 表单登录(进 console 的只有 xiaomo 一人,程序场景 OIDC 已工作)。

minio namespace 是 default-deny,Pod 出方向受限,其中 allow-external-egress(公网 TCP 80/443)必须保留:MinIO 启动时要走公网回连自己的 MINIO_SERVER_URL=https://minio-api.yldm.tech 验证凭据,并去 https://dex.yldm.tech/.well-known/openid-configuration 拉 OIDC discovery。删掉这条规则,表单登录会直接报 unable to login due to login network error,OIDC 也注册不上(见 PR #783)。入方向走 default-deny-ingress + 按 namespace 单独放行(allow-from-{app,game,platform,velero,argo-workflows,kube-system,...}allow-prometheus-scraping);新增使用 minio 的 namespace 时要补一条对应的 allow-from-<ns>.yaml

返回 Storage 总览

评论