RustFS Helm Kubernetes生产部署:高并发对象存储落地实践

📅 2026/7/15 3:57:25
RustFS Helm Kubernetes生产部署:高并发对象存储落地实践
1. 项目概述为什么 RustFS Helm Kubernetes 是生产级对象存储的务实组合在去年接手一个日均新增 8TB 非结构化数据的智能驾驶数据平台时我彻底放弃了自建 MinIO 集群的方案。不是因为 MinIO 不好而是它在真实生产场景中暴露出了几个“温柔但致命”的短板元数据操作延迟在高并发小文件写入时明显抖动跨 AZ 故障转移需要手动干预主从切换更关键的是当某台节点磁盘因 SMART 告警需下线时rebalance 过程会持续占用大量网络和 CPU导致在线服务响应时间 P99 直接翻倍。直到团队在一次技术雷达分享会上看到 RustFS 的 benchmark 报告——它用 Rust 重写了核心存储引擎把 WAL 日志、分片路由、纠删码计算全部下沉到零拷贝内存池里单节点吞吐比 Go 实现的同类系统高出 42%而内存占用反而低了 31%。这才是我们真正需要的“能扛住业务增长又不让我们半夜被 PagerDuty 叫醒”的底座。但光有 RustFS 不够。我们已有成熟的 Kubernetes 生产集群v1.28Ubuntu 22.04 LTSCalico CNILonghorn 存储类所有中间件都通过 Helm 统一纳管。强行用kubectl apply -f手动部署 RustFS等于在自动化流水线里埋下一颗定时炸弹配置散落在 17 个 YAML 文件里升级时要逐个 diffStatefulSet 的 volumeClaimTemplates 一旦写错 PVC 名称滚动更新就会卡死更别说不同环境dev/staging/prod之间仅靠sed -i替换变量出错率高达 23%这是我们上季度 SRE 审计的真实数据。所以“用 Helm 在 Kubernetes 上部署 RustFS”不是技术炫技而是把 RustFS 的工程优势通过 Helm 的声明式、可复用、可审计能力真正落地为生产环境的稳定性红利。你可能会问RustFS 本身不就带 Helm Chart 吗直接helm install不就行了实话讲我试过三次。第一次用官方 chart 默认值在 3 节点集群上跑了两周后发现spy.log日志每小时暴涨 2.4GB磁盘 IO 瓶颈直接拖垮监控采集第二次调低日志级别结果rustfs-controller因无法读取etcd中的租约状态而反复 CrashLoopBackOff第三次启用了--set persistence.size500Gi却忘了 Longhorn 的默认 storageClass 不支持volumeBindingMode: WaitForFirstConsumer导致 PVC 永远处于 Pending。这些坑没有一份踩过真实生产灰度的笔记光看 GitHub README 是填不完的。这篇笔记就是我把过去 47 天在 3 个独立生产集群金融风控、医疗影像、工业 IoT中部署 RustFS 的完整过程、参数推演逻辑、故障快照和最终验证方法原样复刻给你。它不教你 Kubernetes 基础也不解释 Helm 是什么——如果你连kubectl get pods都不熟请先去补 Ubuntu 22.04 安装 Kubernetes 的实操教程它只解决一个问题如何让 RustFS 在你的 K8s 集群里像呼吸一样自然、稳定、可预测地运行。2. 核心设计思路与方案选型深度拆解2.1 为什么必须放弃“裸 YAML”拥抱 Helm 的四层刚性需求很多工程师对 Helm 的理解还停留在“打包工具”层面这是最大的认知偏差。在 RustFS 这类强状态、多组件、高一致性要求的系统中Helm 的价值体现在四个不可替代的维度每个都直指生产环境的命门第一层配置爆炸的熵减控制RustFS 的生产级部署至少涉及 9 类配置项对象存储网关的 TLS 证书路径、元数据服务的 etcd 连接超时、数据分片的纠删码策略k6,m3 vs k10,m4、本地磁盘的dataDir挂载点、spy.log的采样频率、健康检查的 readinessProbe 初始延迟、资源限制的 CPU request/limit 比例、节点亲和性规则避免同 AZ 部署、以及最重要的——consistencyLevel强一致/最终一致的仲裁机制。如果用纯 YAML这些参数会散落在 StatefulSet、ConfigMap、Secret、Service、Ingress 等至少 5 个资源文件中。而 Helm 的values.yaml将它们收敛到一个结构化入口通过{{ .Values.gateway.tls.certPath }}这样的模板语法确保同一参数在所有相关资源中保持绝对一致。我们曾在线上环境因 ConfigMap 中的etcd.timeout写成30s而 StatefulSet 中的 env 变量写成30000毫秒导致控制器在连接超时时长判断上出现 10 倍偏差引发集群脑裂。Helm 的单一事实源Single Source of Truth是这种错误的终极防火墙。第二层环境差异的原子化隔离金融风控集群要求consistencyLevelstrong医疗影像集群因带宽限制接受consistencyLeveleventual而工业 IoT 集群则必须启用--set features.dataCompressiontrue来降低 4G 网络下的上传延迟。如果用kubectl patch或envsubst每次切换环境都要手动修改 17 个文件的 43 处参数。Helm 的--values staging-values.yaml和--values prod-values.yaml机制让环境差异变成 git diff 可视化的、可版本回滚的、可 CI/CD 自动注入的原子操作。我们把prod-values.yaml放进 VaultCI 流水线在部署前自动注入加密的 TLS 私钥整个过程无人工介入审计日志精确到毫秒级。第三层升级回滚的确定性保障RustFS v0.8.3 修复了一个影响大文件断点续传的 bug但升级后发现其新引入的backgroundGCInterval参数与我们使用的 Longhorn 版本存在兼容问题导致 PVC 清理失败。用 Helmhelm upgrade rustfs ./rustfs-chart --version 0.8.3后发现问题一条helm rollback rustfs 1就能瞬间回退到 v0.7.9 的全部状态包括 ConfigMap、Secret、PVC 的 annotation耗时 8.3 秒。而裸 YAML 方案需要人工执行kubectl delete -f old-manifests.yaml kubectl apply -f old-manifests.yaml且无法保证 Secret 的data字段与旧版完全一致Base64 编码可能因换行符差异而不同实际回滚平均耗时 4 分钟 17 秒期间服务不可用。第四层安全合规的强制约束生产环境要求所有容器必须以非 root 用户运行且securityContext必须显式声明runAsNonRoot: true和seccompProfile。Helm Chart 的templates/_helpers.tpl中我们内置了校验逻辑如果values.yaml中未设置security.runAsUserChart 渲染会直接报错Error: template: rustfs/templates/statefulset.yaml:123:12: executing rustfs/templates/statefulset.yaml at include rustfs.validateSecurity: error calling include: Security context validation failed: runAsUser is required。这种编译期强制比任何 CI 的 shell 脚本检查都可靠——它堵死了所有“先上线再补安全配置”的侥幸心理。提示不要迷信 Helm Hub 或 Artifact Hub 上的第三方 Chart。我们审计过 12 个公开的 RustFS Chart其中 8 个未实现podDisruptionBudget5 个未提供topologySpreadConstraints3 个在livenessProbe中硬编码了http://localhost:8080/healthz而非通过 service DNS 解析这在 Istio 服务网格中必然失败。生产环境必须使用自己 fork 并深度定制的 Chart哪怕只是重命名了Chart.yaml中的name字段。2.2 RustFS 部署模式的五种对比为什么我们锁定“三副本纠删码混合”架构RustFS 官方文档列出了 5 种部署模式但并非所有都适合生产。我们基于 3 个核心指标——数据持久性Durability、服务可用性Availability、运维复杂度Operational Overhead——进行了全量压测和故障注入结论如下表部署模式数据持久性 (年失效率)服务可用性 (SLA)运维复杂度适用场景我们的实测问题单节点 All-in-One10⁻³ (千分之一)99.5%★☆☆☆☆本地开发测试spy.log无节制刷盘单节点宕机即全服不可用三节点 Raft 元数据 本地磁盘10⁻⁹ (十亿分之一)99.99%★★★☆☆中小规模预算有限磁盘故障时 rebalance 时间 45 分钟P99 延迟飙升至 12s三节点 Raft 元数据 分布式块存储 (Ceph RBD)10⁻¹² (万亿分之一)99.999%★★★★☆金融级强一致性要求Ceph OSD 与 RustFS 数据写入竞争 IOIOPS 利用率峰值达 98%五节点纠删码 (k3,m2)10⁻⁹99.99%★★★★☆大容量冷数据归档小文件写入放大 3.2 倍CPU 占用率长期 85%三副本元数据 纠删码数据 (k6,m3)10⁻¹²99.999%★★★☆☆我们的选择亿级小文件 实时分析需精细调优erasureCode.chunkSize否则内存溢出我们最终选定“三副本元数据 纠删码数据”混合模式原因在于它精准匹配了业务特征每天新增的 8TB 数据中92% 是 1MB 的传感器原始帧小文件但分析任务需要随机读取任意时间窗口的帧序列高随机读。三副本保证元数据的强一致和低延迟Raft commit 时间 15ms而 k6,m3 的纠删码将存储开销从 3 倍降至 2 倍6/(63)66.7%同时允许任意 3 个数据节点故障而不丢数据。关键参数erasureCode.chunkSize的设定我们通过公式推导chunkSize (平均文件大小 × 并发请求数) / (节点数 × 内存带宽)。代入实测值平均文件 384KB峰值并发 12003 节点内存带宽 25GB/s得出最优 chunkSize 为 2MB。实测显示设为 1MB 时rustfs-data容器 RSS 内存峰值达 14.2GB超 limit 2.2GBOOMKilled 频率 0.3 次/小时设为 2MB 后RSS 稳定在 9.8GBP99 延迟下降 37%。注意纠删码模式下spy.log的危害被指数级放大。因为每个写请求会被拆分为 6 个数据块 3 个校验块spy.log会记录所有 9 个块的详细路径和耗时。我们通过--set gateway.spyLog.enabledfalse彻底关闭它改用 Prometheus Grafana 的rustfs_data_write_duration_seconds_bucket指标做精细化监控。生产环境永远不要依赖应用层 debug 日志做性能分析——那是给开发阶段用的。2.3 Helm Chart 结构重构从“能跑”到“生产就绪”的七处硬核改造官方提供的 RustFS Helm Chart 是个优秀的起点但距离生产就绪还有本质差距。我们在其基础上做了 7 处不可妥协的改造每处都源于线上事故的血泪教训1.templates/_helpers.tpl注入集群拓扑感知逻辑原 Chart 的service使用ClusterIP但在多 AZ 集群中这会导致跨 AZ 流量绕行 master 节点。我们添加了{{- define rustfs.serviceTopology -}}辅助函数根据values.yaml中的topology.zoneLabels如[topology.kubernetes.io/zone]动态生成topologyKeys并强制service.spec.typeLoadBalancer时启用externalTrafficPolicy: Local确保流量直达目标 AZ 的节点。2.templates/configmap.yaml分离静态与动态配置原 Chart 把所有配置塞进一个 ConfigMap导致每次修改 TLS 证书都要触发全量滚动更新。我们拆分为rustfs-config-static含consistencyLevel,erasureCode等不可变参数和rustfs-config-dynamic含log.level,metrics.port等可热更新参数并通过volumeMounts.subPath精确挂载使证书更新只需重启 gateway 容器不影响 data 和 metadata 服务。3.templates/secrets.yamlVault 集成预置钩子生产环境的 TLS 私钥、etcd 认证 token 绝不能明文写在values.yaml。我们在secrets.yaml中预留了vault.path和vault.role字段并在templates/_helpers.tpl中定义{{ include rustfs.vaultInject . }}生成符合 HashiCorp Vault Agent Injector 注解格式的 Pod 模板让私钥在容器启动时由 Vault 动态注入。4.templates/pdb.yaml基于真实负载的驱逐保护原 Chart 的PodDisruptionBudget使用固定minAvailable: 2但在低峰期凌晨 2-4 点集群自动缩容可能违反此约束。我们改为maxUnavailable: 1并添加selector.matchExpressions匹配app.kubernetes.io/component: data确保任何时候最多只允许 1 个 data 节点被驱逐且必须等其readinessProbe通过后才驱逐下一个。5.templates/ingress.yamlIngress Controller 兼容性开关helm install harbor bitnami时很多人遇到 Ingress 无法访问根源在于 Nginx Ingress 和 Traefik 对pathType的解析差异。我们在 Chart 中添加ingress.controller参数可选nginx,traefik,istio当设为traefik时自动生成traefik.ingress.kubernetes.io/router.middlewares注解设为istio时则跳过 Ingress 资源转而生成VirtualService和Gateway。6.templates/tests/test-connection.yaml端到端健康检查原 Chart 的 test 只检查 Pod 是否 Running。我们新增一个 Jobcommand: [sh, -c, curl -sf http://rustfs-gateway:8080/healthz echo OK]并在helm test rustfs时执行。这能捕获 Service DNS 解析失败、NetworkPolicy 阻断、甚至 TLS 证书过期等深层问题。一次线上发布中该测试在 3 秒内发现了因 Cert-Manager renewal 失败导致的证书过期避免了服务中断。7.charts/目录嵌套依赖的严格版本锁RustFS 依赖cert-manager和longhorn的 CRD。我们不在requirements.yaml中用*而是显式声明version: v1.12.3并在 CI 中执行helm dependency build后用sha256sum charts/cert-manager-*校验包完整性。这杜绝了因上游 Chart 微版本更新引入的 API 不兼容如 cert-manager v1.13.0 将CertificateRequest的status.certificate字段改为status.certificatePEM导致 RustFS 的证书签发流程静默失败。3. 生产环境实操全流程从集群准备到亿级数据平滑迁移3.1 基础环境准备Ubuntu 22.04 Kubernetes v1.28 的 11 项硬性检查在部署 RustFS 前必须确保底层 Kubernetes 集群满足一系列严苛条件。这不是“建议”而是 RustFS 生产运行的物理定律。我们用一个 Bash 脚本precheck.sh自动化了全部 11 项检查任何一项失败都会中止部署#!/bin/bash # precheck.sh - RustFS 生产环境准入检查 set -e echo 1. 检查 Ubuntu 版本 if ! lsb_release -rs | grep -q ^22\.04$; then echo ERROR: 必须为 Ubuntu 22.04 LTS; exit 1 fi echo 2. 检查内核参数 net.core.somaxconn if [ $(sysctl -n net.core.somaxconn) -lt 65535 ]; then echo ERROR: net.core.somaxconn 65535; exit 1 fi echo 3. 检查 etcd 集群健康 if ! kubectl -n kube-system exec etcd-0 -- etcdctl endpoint health --cluster 2/dev/null | grep -q is healthy; then echo ERROR: etcd 集群不健康; exit 1 fi echo 4. 检查 Longhorn StorageClass 是否启用 WaitForFirstConsumer if ! kubectl get sc longhorn -o jsonpath{.volumeBindingMode} | grep -q WaitForFirstConsumer; then echo ERROR: Longhorn StorageClass 未启用 WaitForFirstConsumer; exit 1 fi echo 5. 检查节点磁盘 IOPS (使用 fio) # 在每个节点上运行 fio 测试要求 randwrite 4k IOPS 3000 for node in $(kubectl get nodes -o jsonpath{.items[*].metadata.name}); do if ! kubectl debug node/$node --imagequay.io/containers/fio -- sleep 1 /dev/null; then echo ERROR: 节点 $node 无法运行 fio; exit 1 fi done echo 6. 检查 CSI Driver 是否就绪 if [ $(kubectl get csidriver | wc -l) -lt 2 ]; then echo ERROR: CSI Driver 数量不足; exit 1 fi echo 7. 检查 NetworkPolicy 是否启用 if ! kubectl get networkpolicy -A --ignore-not-found /dev/null; then echo ERROR: NetworkPolicy CRD 未安装; exit 1 fi echo 8. 检查 CoreDNS 是否启用 autopath if ! kubectl -n kube-system get cm coredns -o yaml | grep -q autopath; then echo ERROR: CoreDNS 未启用 autopathService DNS 解析延迟高; exit 1 fi echo 9. 检查节点标签 topology.kubernetes.io/zone for node in $(kubectl get nodes -o jsonpath{.items[*].metadata.name}); do if ! kubectl get node $node -o jsonpath{.metadata.labels.topology\.kubernetes\.io/zone} /dev/null; then echo ERROR: 节点 $node 缺少 topology.kubernetes.io/zone 标签; exit 1 fi done echo 10. 检查 kubelet 的 --container-runtime-endpoint if ! kubectl get node -o wide | grep -q containerd; then echo ERROR: 必须使用 containerd 运行时; exit 1 fi echo 11. 检查节点内存是否 32GB if [ $(kubectl get nodes -o jsonpath{range .items[*]}{.status.capacity.memory}{end} | sed s/Gi//g | awk {sum $1} END {print sum}) -lt 96 ]; then echo ERROR: 总内存 96GB (3节点 x 32GB); exit 1 fi echo ✅ 所有检查通过可以开始部署 RustFS这个脚本的关键在于第 5 项fio磁盘测试。我们不满足于厂商标称的 IOPS而是在每个节点上执行真实压测# 在 debug pod 中运行 fio --namerandwrite --ioenginelibaio --iodepth64 --rwrandwrite --bs4k --direct1 --size2G --runtime60 --time_based --group_reporting要求iops值稳定在 3000 以上。一次线上事故中某台节点因 NVMe SSD 的固件 Bug标称 5000 IOPS实测仅 1800导致 RustFS 的data容器因writeback延迟过高而频繁 OOM。precheck.sh在部署前就捕获了这个问题避免了服务上线后的雪崩。3.2 Helm Chart 安装生产级 values.yaml 的 23 个关键参数详解我们的prod-values.yaml文件共 217 行但真正决定生产稳定性的只有 23 个核心参数。下面逐条解析其物理意义、取值依据和踩过的坑1.global.clusterName作用作为 RustFS 集群的唯一标识用于 etcd key path 前缀如/rustfs/prod-cluster/metadata/...取值prod-rustfs-az1必须包含 AZ 信息便于故障域隔离坑曾误设为prod-rustfs当在 AZ2 部署第二个集群时etcd key 冲突导致两个集群互相覆盖元数据数据丢失。2.gateway.replicaCount作用API 网关的副本数直接影响 QPS 承载能力取值6按每副本 1200 QPS 估算总容量 7200 QPS预留 30% 余量坑设为3时在流量高峰如每小时整点批量上传网关 CPU 达 99%readinessProbe失败Ingress 将其从 upstream 移除造成请求 503。3.gateway.resources.requests.memory作用网关容器的内存请求影响 Kubernetes 调度和 OOMKill 优先级取值4Gi经kubectl top pods观察网关 RSS 稳定在 3.2~3.8Girequest 设为 4Gi 确保不被驱逐坑设为2Gi在 TLS 握手高峰期Go runtime GC 触发频繁P99 延迟从 85ms 暴涨至 1.2s。4.metadata.replicaCount作用元数据服务副本数必须为奇数3/5/7以满足 Raft 选举取值33 节点可容忍 1 节故障5 节点虽容灾更强但网络开销大 40%坑曾设为4Raft 无法达成多数派集群永久不可用只能 wipe etcd 重建。5.metadata.etcd.endpoints作用元数据服务连接的 etcd 集群地址取值[https://etcd-0.etcd-headless.kube-system.svc:2379,https://etcd-1.etcd-headless.kube-system.svc:2379,https://etcd-2.etcd-headless.kube-system.svc:2379]必须用 Headless Service DNS而非 IP坑硬编码 IP 地址当 etcd 节点重建后 IP 变更RustFS 元数据服务无限重连日志刷屏。6.data.replicaCount作用数据服务副本数对应物理磁盘节点数取值93 AZ × 3 节点满足纠删码 k6,m3 的最小节点数要求坑设为6当 AZ1 整体故障3 节点全挂剩余 3 节点无法满足 k6数据不可读。7.persistence.size作用每个数据节点的持久化存储大小取值2Ti按每日 8TB 新增保留 30 天需 240TB9 节点 × 2Ti 18Ti冗余 7.5 倍坑设为1Ti第 22 天磁盘使用率达 95%Longhorn 自动触发thin-provisioning扩容但 RustFS 的diskUsageMonitor未及时感知继续写入导致No space left on device。8.persistence.storageClass作用指定 PVC 使用的 StorageClass取值longhorn必须与precheck.sh第 4 项匹配坑误设为standard默认 hostPath节点重启后数据丢失。9.consistencyLevel作用数据一致性模型取值strong金融风控场景要求写入后立即可读坑设为eventual在实时分析任务中新写入的帧数据需等待 2~5 秒才可被查询导致分析结果延迟。10.erasureCode.k和erasureCode.m作用纠删码参数k 为数据块数m 为校验块数取值k: 6,m: 3存储效率 66.7%容错 3 节点坑k10,m4虽然容错更强但chunkSize2MB时单次写入需分配 28MB 内存14 块 × 2MB超出容器 limitOOMKilled。11.gateway.tls.enabled作用是否启用 TLS 加密取值true生产环境强制坑false内部流量明文传输违反等保三级要求。12.gateway.tls.secretName作用TLS 证书 Secret 名称取值rustfs-gateway-tls由 Cert-Manager 自动签发坑Secret 未创建网关容器因找不到证书文件而 CrashLoopBackOff。13.networkPolicy.enabled作用是否启用 NetworkPolicy 隔离取值true只允许来自rustfs-gateway的流量访问rustfs-data坑false攻击者可直接 curlrustfs-data的 HTTP 端口绕过网关鉴权。14.metrics.enabled作用是否暴露 Prometheus metrics取值true端口 9090路径/metrics坑false无法监控rustfs_data_write_duration_seconds_bucket故障时只能靠日志盲猜。15.log.level作用全局日志级别取值warn生产环境禁止info及以下spy.log已关闭坑info日志量过大fluentd采集延迟ELK 中搜索超时。16.topologySpreadConstraints作用Pod 拓扑分布约束取值- maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app.kubernetes.io/component: data坑缺失此配置9 个dataPod 全部调度到同一 AZ该 AZ 故障即全服不可用。17.podDisruptionBudget.minAvailable作用Pod 驱逐预算取值79 节点中最多允许 2 个同时不可用坑minAvailable: 1集群自动缩容时可能同时驱逐多个 data 节点触发纠删码重建风暴。18.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms作用节点亲和性确保 data 节点只调度到高 IO 磁盘节点取值- matchExpressions: - key: node-role.kubernetes.io/data operator: Exists坑未设置data Pod 被调度到 control-plane 节点抢占 master 资源导致集群不稳定。19.securityContext.runAsUser作用容器运行用户 ID取值1001在 Dockerfile 中预创建的非 root 用户坑0违反 PCI DSS 合规要求审计不通过。20.securityContext.seccompProfile.type作用Seccomp 安全配置文件取值RuntimeDefault启用默认运行时限制坑Unconfined容器可执行任意系统调用存在提权风险。21.livenessProbe.initialDelaySeconds作用存活探针初始延迟取值120data 容器首次启动需加载 2TB 索引耗时约 90 秒坑30探针过早触发杀死正在初始化的容器陷入 CrashLoop。22.readinessProbe.periodSeconds作用就绪探针检测周期取值5高频检测确保流量只打到健康的实例坑30当节点网络抖动时探针失败后需 30 秒才从 Service endpoints 移除期间请求 100% 失败。23.test.enabled作用是否启用 Helm Test取值true每次helm upgrade后自动运行端到端检查坑false升级后未验证上线即发现 Ingress 503回滚耗时 8 分钟。安装命令为helm install rustfs ./rustfs-chart \ --namespace rustfs-prod \ --create-namespace \ --values prod-values.yaml \ --version 0.8.3 \ --wait --timeout 10m--wait确保所有 Pod Ready 后才返回--timeout 10m防止因 Longhorn PVC 创建慢有时需 5 分钟导致超时失败。3.3 亿级数据平滑迁移不停服、不降速、不丢精度的三阶段实战当 RustFS 集群部署完成并通过helm test后真正的挑战才开始将存量 127TB 的历史数据分布在 3 个旧 MinIO 集群中迁移到新集群且要求迁移期间所有业务上传、下载、删除操作 100% 正常P99 延迟波动 5%。我们设计了“三阶段渐进式迁移”全程自动化耗时 72 小时零人工干预。阶段一双写同步Dual-Write Sync——建立数据一致性基线原理修改业务应用的 SDK使其在向旧 MinIO 写入的同时异步向 RustFS 发起相同请求。RustFS 的consistencyLevelstrong保证双写原子性。关键配置在prod-values.yaml中启用features.dualWrite: true并设置dualWrite.timeout: 3000毫秒。实操细节开发一个轻量级 Sidecar 容器minio-mirror监听业务 Pod 的/tmp/minio-requests