实现多集群桶路由:etcd + CoreDNS 配置实战)
MinIO 通过 Bucket DNS 查找Federation Lookup实现多集群桶路由etcd CoreDNS 配置实战【免费下载链接】minioMinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.项目地址: https://gitcode.com/GitHub_Trending/mi/minio本文基于 MinIO 仓库中的 Federation 快速入门文档 docs/federation/lookup/README.md系统讲解 MinIO “Bucket lookup from DNS”基于 DNS 的桶查找联邦部署模式如何借助 etcd 存储桶的 DNS SRV 记录、借助 CoreDNS 完成bucket.domain.com形式的桶域名解析从而让客户端无需知道桶所在集群即可通过 DNS 直接定位到正确的 MinIO 实例。读完本文你将掌握联邦模式的三个核心环境变量MINIO_ETCD_ENDPOINTS、MINIO_DOMAIN、MINIO_PUBLIC_IPS的完整配置方法、多集群启动命令以及该功能在当前版本中的弃用状态与演进方向。1. 功能定位与当前状态务必先读需要首先明确的是官方文档在标题处已经注明“Federation feature is deprecated and should be avoided for future deployments”——即 Federation桶 DNS 查找功能已被弃用不建议在新的生产部署中继续使用。该功能的设计目标是在一个由多个 MinIO 集群可位于不同数据中心组成的联邦中当客户端向domain.com提交 CreateBucket 请求时请求会经负载均衡落到某个集群该集群随后把bucket1.domain.com的 DNS 服务记录写入共享的 etcd 后端其他集群或客户端通过解析该子域名即可直接路由到“桶真正所在”的那台/那组 MinIO 实例实现跨集群的桶寻址。理解这一架构价值后仍应以仓库现状为准从源码结构看当前代码库中 etcd 客户端辅助逻辑如 cmd/etcd.go 中的saveKeyEtcd/deleteKeyEtcd/readKeyEtcd仍然保留且 cmd/server-main.go 中仍存在 “Populate existing buckets to the etcd backend”把已有桶注册到 etcd的逻辑分支但完整的桶 DNS SRV 发布/查找链路较早期版本已有收敛这与文档中“已弃用”的声明是一致的。因此本文更适合用于理解 MinIO 早期多数据中心联邦的设计思路以及排查存量联邦环境新建部署建议使用桶复制Bucket Replication等当前主推方案见 docs/bucket/replication 相关文档。2. 架构与依赖组件Bucket lookup from DNS 联邦模式依赖两个外部组件组件作用是否必需etcd作为联邦后端存储桶的 DNS 服务记录SRV 记录同时也管理 MinIO 的config.json必需CoreDNS基于 etcd 中写入的桶 DNS 服务记录对外提供 DNS 解析可选可被其他支持 etcd 插件的 DNS 服务器替代其工作链条为所有联邦内的 MinIO 实例共享同一组 etcd 端点MINIO_ETCD_ENDPOINTS在整个联邦部署中必须一致顶层域名MINIO_DOMAIN如domain.com指向部署在所有联邦 MinIO 实例前方的负载均衡器在domain.com上创建桶bucket1后MinIO 会把bucket1.domain.com解析到本实例的公网 IP由MINIO_PUBLIC_IPS指定的 DNS 条目写入 etcd客户端之后使用bucket1.domain.com这一子域名即可绕过“桶到底在哪”的问题直接解析到正确的集群。3. 三个核心环境变量详解3.1 MINIO_ETCD_ENDPOINTS指向 MinIO 联邦后端的 etcd 服务器列表多个地址用逗号分隔。文档明确要求同一联邦部署内的所有 MinIO 实例必须使用相同的 etcd 后端否则各实例看到的桶 DNS 记录不一致联邦路由会失效。etcd 交互的底层实现可见 cmd/etcd.gosaveKeyEtcd负责写入桶记录deleteKeyEtcd负责删除readKeyEtcd负责读取saveKeyEtcdWithTTL则通过 etcd leaseclient.Grant实现带 TTL 的租约写入可用于需要自动过期的记录。所有操作都套用了defaultContextTimeout超时上下文并在不可达时返回统一的errEtcdUnreachable“etcd is unreachable, please check your endpoints”错误便于运维定位网络问题。3.2 MINIO_DOMAIN联邦环境的顶层域名。两点要求该域名理想情况下应解析到部署在所有联邦 MinIO 实例前方的负载均衡器该域名用于在 etcd 中创建桶的子域条目。例如域名为domain.com时桶bucket1、bucket2将分别可通过bucket1.domain.com、bucket2.domain.com访问。从源码看MINIO_DOMAIN的解析位于 cmd/common-main.go 的serverHandleEnvVars()中实际支持逗号分隔的多个域名config.ValueSeparator切分每个域名都会经过dns2.IsDomainName校验非法值直接以 “Invalid MINIO_DOMAIN value in environment variable” 触发 fatal 退出多个域名会排序后计算最长公共后缀lcpSuffix若出现域名互为后缀的“重叠域名”如example.com与a.example.com并存会以 “Overlapping domains … not allowed” 报错终止启动。3.3 MINIO_PUBLIC_IPS逗号分隔的 IP 列表表示本 MinIO 实例上创建的桶将解析到的公网地址。例如当前实例上创建bucket1后DNS 条目bucket1.domain.com将指向MINIO_PUBLIC_IPS中的 IP。文档给出两条使用规则对 standalone 与 erasure code单节点/纠删码部署此字段是启用联邦模式的必填项对 distributed 部署此字段可选——若未设置MinIO 会使用启动参数中传入的宿主 IP 地址来生成 DNS 条目。这一“兜底逻辑”在源码中同样可以印证cmd/common-main.go 中若设置了MINIO_PUBLIC_IPS逐项做net.ParseIP校验非 IP 的条目会被当作 DNS 主机名经globalDNSCache.LookupHost反查为 IP查询失败则以 “invalid entry found in MINIO_PUBLIC_IPS” fatal 退出最终汇总进updateDomainIPs若未设置则回退为mustGetLocalIP4()本机 IPv4 地址加上globalEndpoints.Hostnames()中各宿主名同样写入updateDomainIPs。4. 运行多集群联邦完整命令示例以下是官方文档给出的两集群联邦启动示例。注意两个集群共享同一组 etcd 与同一MINIO_DOMAIN但MINIO_PUBLIC_IPS各自不同——这正是“桶落在哪个集群”能够被 DNS 区分开的根源。cluster1export MINIO_ETCD_ENDPOINTShttp://remote-etcd1:2379,http://remote-etcd2:4001 export MINIO_DOMAINdomain.com export MINIO_PUBLIC_IPS44.35.2.1,44.35.2.2,44.35.2.3,44.35.2.4 minio server http://rack{1...4}.host{1...4}.domain.com/mnt/export{1...32}cluster2export MINIO_ETCD_ENDPOINTShttp://remote-etcd1:2379,http://remote-etcd2:4001 export MINIO_DOMAINdomain.com export MINIO_PUBLIC_IPS44.35.1.1,44.35.1.2,44.35.1.3,44.35.1.4 minio server http://rack{5...8}.host{5...8}.domain.com/mnt/export{1...32}配置要点回顾MINIO_ETCD_ENDPOINTS指向管理 MinIOconfig.json与桶 DNS SRV 记录的 etcd 后端MINIO_DOMAIN指定桶的域后缀客户端将使用mybucket.domain.com直接解析到正确集群MINIO_PUBLIC_IPS是各集群可被公网访问的地址每个集群互不相同。一个重要的行为细节文档 NOTE 原文强调mybucket只会存在于 cluster1 或 cluster2 其中之一由domain.com的解析结果随机决定——若domain.com配置了轮询 DNSround-robin则桶由哪个集群承接是完全随机的。客户端要稳定访问桶必须走桶子域名mybucket.domain.com而不能依赖根域名。5. CoreDNS 解析配置示例联邦环境若使用 CoreDNS 来基于 etcd 记录提供 DNS 解析仓库提供了示例配置 docs/federation/lookup/Corefile.example. { etcd churchofminio.com { endpoint http://localhost:2379 http://localhost:4001 upstream /etc/resolv.conf } debug prometheus cache 160 mydomain.com loadbalance forward . /etc/resolv.conf }其中etcd churchofminio.com插件块告诉 CoreDNS域churchofminio.com对应你的MINIO_DOMAIN下的记录从 etcd 读取endpoint需指向你的 etcd 集群cache 160 mydomain.com对指定域做 160 秒缓存loadbalance在解析返回多个 A 记录时做负载均衡轮转forward . /etc/resolv.conf兜底转发非联邦域的查询。使用时需把churchofminio.com替换为实际的联邦域、endpoint替换为实际 etcd 地址。6. 验证部署按文档步骤可通过浏览器或mc客户端访问 MinIO 服务器验证上传文件后确认这些文件可以从联邦内所有 MinIO 端点即通过各桶子域名访问。也可以直接用dig/nslookup检查bucket1.domain.com是否解析到了创建该桶的那个集群的MINIO_PUBLIC_IPS地址这是最快确认“桶 DNS SRV 记录已写入 etcd 且被 DNS 侧消费”的手段。7. 小结与演进建议Federation 桶 DNS 查找是 MinIO 早期为“多数据中心、桶级路由”提供的方案etcd 存桶的 SRV 记录CoreDNS 消费记录MINIO_DOMAINMINIO_PUBLIC_IPS共同决定bucket.domain.com的解析目标三个环境变量的配置规则etcd 全联邦一致、域名须合法且不重叠、公网 IP 单节点部署必填/分布式部署可选均有明确的源码实现支撑见 cmd/common-main.go再次强调文档头部的声明该功能已弃用新的部署不应再采用。如果你当前面临跨集群数据可达性问题应优先考虑 MinIO 现主推的桶复制Bucket Replication与站点复制Site Replication方案相关文档与脚本可参考 docs/bucket/replication 与 docs/site-replication/README.md。【免费下载链接】minioMinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.项目地址: https://gitcode.com/GitHub_Trending/mi/minio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考