离线部署的MinIO

网络有不同的部分,例如 DMZ、公共、私有、堡垒等。这实际上取决于您的组织和网络要求。在部署应用程序时,任何应用程序,我们都需要考虑类型以及它是否需要位于网络的特定部分。

例如,如果要部署数据库,则不希望它位于公用网络上,而可能希望它位于无法从外部 Internet 访问的专用网络中。为什么?仅仅因为数据库中有更多敏感信息,而某些数据库中的访问控制列表不够严格,无法应对直接访问时可能受到损害的可能性。此外,最终用户很少直接访问数据库,他们通常通过前端应用程序访问数据库,然后对数据库执行结构化查询。

在这篇文章中,我们将讨论什么是内外网隔离的私有专网,在这样的环境中部署 MinIO 时要考虑什么,以及如何在之后与其他隔离网络站点一起复制和扩展它。

通常,在专用网络中,以下 CIDR 中的 IP(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)中,您无法从 Internet 入站与节点通信,除非您使用具有首先必须连接到的公共 IP 的代理,例如 VPN 或反向代理。通常,节点可以与外界通信,因为数据中心通常使用 NAT 或某种 Internet 网关 (IGW) 将公共请求路由到此 NAT/IGW 设备之外,以便能够下载包以进行上传等操作。

顾名思义,内外网隔离的私有专网更进一步,您不仅无法从 Internet 访问它,而且也无法从节点连接到 Internet。节点在此网络中完全锁定。您仍然可以通过 VPN 访问它们,但通常建议连接到堡垒主机,然后仅从堡垒节点的专用 IP 访问内外网隔离的私有专网。

在内外网隔离的私有专网中部署 MinIO

那么,为什么需要这种安全级别呢?嗯,有很多目的。我们提到了数据库,但这尤其适用于关键的基础设施组件,例如 MinIO,在这些组件中,您无法承受向外界公开其中的数据,但您需要存储它们并可供生态系统中的其他应用程序访问。

在设计内外网隔离的私有专网时,必须确保该节点运行所需的所有公共资源都需要可供内外网隔离的私有专网访问。这意味着操作系统包、RPM/APT 包、MinIO 二进制文件以及节点需要从互联网拉取的任何其他依赖项都需要已经可用于内外网隔离的私有专网。这可以通过在数据中心本地的称为 Ops Network 的特殊网络中同步所有这些依赖项的存储库来实现。Ops Network 的特点是,在此网络中运行的任何服务都可以与 Internet 通信(反之亦然),数据中心内专用网络中的任何应用程序(甚至是隔离网络)都可以与 Ops Network 中的服务通信。使用这种方法,您不仅可以同时杀死两只鸟,还可以杀死几只鸟

您可以清理从 Internet 下载的软件包,以确保它们没有被篡改。您可以放心,您的所有应用程序都将使用经过审查的包,并且可以安全地从隔离网络环境中的受信任存储库镜像安装。

要构建的节点所需的所有包都可以在本地获得,如果上游 repo 中断,不会影响离线环境的运行。

如果出现完全的节点故障,时间至关重要。替换节点的速度越快,如果更多节点发生故障,群集超出仲裁的可能性就越小。通过更快地重建节点,您可以降低 MTR(平均解决时间)。

一旦所有需要的资源都可以通过内外网隔离的私有专网在内部访问,在内外网隔离的私有专网中部署 MinIO 就像其他任何资源一样。我们建议您至少在单个站点上执行多节点多驱动器部署,以便在发生驱动器故障甚至整个节点故障时,纠删码将确保将数据复制到其他磁盘和节点。您只需要确保运行 MinIO 的端口在所有节点上都处于打开状态,并且可以从内外网隔离的私有专网内双向访问。

目前为止,一切都好。我们设计了一个内外网隔离的私有专网。找到了一种在其中部署 MinIO 的方法,并在本地镜像上游资源。但是我们实际上如何使用集群呢?如果它无法访问外部,我们如何向其添加数据?嗯,这实际上很简单,我们可以使用与传统数据库类似的技术。网络的设计应使 MinIO 只能通过其前面的应用程序访问。它可能是一个成熟的前端应用程序,可能充当 CDN,也可能是一个简单的 ETL 工作流,它使用 MinIO 来检索原始数据并存储最终处理结果。

最终用户永远无法直接访问 MinIO,因此,如果公有子网或 DMZ 中出现网络入侵,他们将永远无法访问离线网络(如 MinIO)中的服务,因此您的数据和模型是安全的。此外,您会注意到您的整个集群运行比以前稳定得多,但这是为什么呢?其他一切都一样吗?

原因是稳定性很重要。内外网隔离的私有专网中的任何内容都不会更新,除非您明确希望它更新。让我绕道而行。十年前,当我在 SRE 团队工作时,有一天,我们的任务是升级 260 台 Redis 服务器。当我们进行例行维护准备为新版本准备二进制文件时,我们注意到我们所有的页面加载量都在增加,而一些功能根本没有加载。不幸的是,所有这些都是由 Redis 支持的服务。我们很困惑,我们只上演了二进制文件,为什么一切都离线了?5 分钟后,我们立即注意到所有 Redis 服务器都在自动升级到更新的二进制文件,我们只是暂存,而不是部署。事实证明,在我们的基础设施自动化系统(Puppet)中,我们将其设置为在注意到正在暂存的新包时立即升级Redis。因此,它做了它应该做的事情,升级了所有服务器,随后一次关闭了多个 Redis 集群。所以错是我们的,我们很快就纠正了。即使我们的 Redis 服务器处于隔离网络状态,我们仍然设法将其关闭,所以试想一下,如果您直接从上游拉取它,您的服务将根据软件包维护者的心血来潮进行更新。

虽然 MinIO 更新是向后兼容的,我们强烈建议您通过我们的无停机原子升级尽可能定期地跟上新版本,但我们仍然不希望您在发布二进制文件时升级您的集群,这只是糟糕的 devops 做法,您至少应该知道您的系统上正在升级什么。一些团队加倍努力,使整个节点不可变,这意味着,每当需要升级甚至修改任何内容时,他们都必须重建整个节点,以确保没有配置漂移。但在大多数情况下,这可能是一项比所需更大的任务,因此在这些情况下,拥有一个隔离网络环境是一个不错的选择。

我们谈到了单个区域中的单个集群,但多站点呢?我们的内外网隔离的私有专网现在是否必须通过互联网进行通信才能到达其他站点?这难道没有破坏隔离网络环境的目的吗?

与互联网通过物理光纤连接的方式类似,数据中心在很大程度上通过互联网交换设施相互连接。这些设施提供暗光纤WAN链路(广域网),您基本上可以做任何事情。您可以创建自己的 ISP,也可以使用它来连接位于世界各地的两个不同数据中心。在这些WAN链路上运行的协议可以是任何东西,您不需要在此基础上运行VPN。虽然我们仍然建议对 MinIO 流量进行加密,但 WAN 链路也应该有自己的加密,这样数据就不会被相邻流量嗅探,因为基本上所有这些链都是共享的。

一旦 WAN 链路启动并运行,您将能够与专用内外网隔离的私有专网上的其他 MinIO 集群进行通信,就像站点到站点复制在常规 Internet 上运行一样。这里唯一的区别是:

  • 流量是完全私有的,这提供了额外的安全层

  • 由于您不与其他任何人共享管道,因此您将有权访问管道的全部吞吐量,通常对于关键和时间敏感的应用程序,首选专用的分配 WAN 链路。

由于您不与其他任何人共享管道,因此您将有权访问管道的全部吞吐量,通常对于关键和时间敏感的应用程序,首选专用的分配 WAN 链路。

请花点时间阅读这篇博文,其中我们将讨论站点到站点复制的最佳实践。

监控隔离网络中的 MinIO

这是一个很好的问题。这就是我们为 mc diag 命令提供隔离网络标志的确切原因。不仅如此,您还可以对数据进行匿名化处理,以便在与诊断捆绑包一起发送之前对主机名和 IP 等敏感信息进行混淆处理。

要在 airgap 中创建诊断捆绑包,请运行以下命令,该命令也会对数据进行匿名化处理

mc support diag myminio --airgap --anonymize=strict

● CPU Info ... ✔
● Disk Info ... ✔
● Net Info ... ✔
● Os Info ... ✔
● Mem Info ... ✔
● Process Info ... ✔
● Server Config ... ✔
● System Errors ... ✔
● System Services ... ✔
● System Config ... ✔
● Admin Info ... ✔

mc: MinIO diagnostics report saved to myminio-health_20231111053323.json.gz

总结

MinIO 可以很好的在私有网络中进行部署,完全隔离对应的数据,保障您的数据安全。

如果需要专业技术支持请联系MinIO中国支持团队4008-566-339。

相关推荐
legend_jz6 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
tangliang_cn26 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟27 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
新知图书38 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
威威猫的栗子40 分钟前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
力透键背40 分钟前
display: none和visibility: hidden的区别
开发语言·前端·javascript
bluefox197941 分钟前
使用 Oracle.DataAccess.Client 驱动 和 OleDB 调用Oracle 函数的区别
开发语言·c#
条纹布鲁斯1 小时前
dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
docker·kubernetes
ö Constancy1 小时前
c++ 笔记
开发语言·c++
墨染风华不染尘1 小时前
python之开发笔记
开发语言·笔记·python