虽然你可以在 Kubernetes 上使用 Deployment 或 StatefulSet 部署 MinIO,但推荐的方式是通过官方的 MinIO Operator 进行部署。为什么?
MinIO Operator 简化了在 Kubernetes 集群上管理 MinIO 的过程,不仅在初始部署(第 0 天和第 1 天)期间,而且在持续的第 2 天运维期间也是如此。例如,当通过添加服务器池来扩展集群时,只需运行几个 kubectl
命令即可。请参阅使用池扩展 MinIO 集群以获取更多详细信息。
MinIO Operator 支持在任何云、本地、边缘或混合环境中的 Kubernetes 集群上部署 MinIO 租户——基本上,只要你能运行 Kubernetes 集群,就能部署 MinIO。MinIO Operator 使用 krew
插件安装自定义资源定义 (CRD) 和 Kubernetes 插件,从而能够使用 kubectl minio
命令管理 MinIO 租户。

让我们详细看一下上图。MinIO Operator 将部署在专用命名空间中;稍后我们将展示这如何派上用场。命名空间包含 2 个 Pod
Operator:Operator Pod 负责租户的维护,例如部署、管理、修改和其他操作。
Console:Console Pod 是一个图形界面,用于执行与使用 kubectl minio
命令类似的功能。
此外,由 MinIO Operator 部署的每个租户都需要在单独的命名空间中。它还需要在 Pod 中创建以下 3 个容器。
Init 容器:用于在启动时配置主 MinIO 容器,一旦 MinIO 容器启动,此容器就会终止。
MinIO 容器:MinIO 在此容器中运行(类似于单个裸机安装)。租户最终将持久卷声明 (PVC) 附加到此容器以与存储对象的持久卷 (PV) 通信。
Sidecar 容器:此容器用于监视集群中的各种操作,例如租户的配置密钥和根凭据。如果这些内容发生更改,它们将自动更新。MinIO 还构建了一个名为Sidekick 的 sidecar 容器,这是一个小型负载均衡器,作为 sidecar 附加到每个客户端应用程序进程;您可以消除集中式负载均衡器瓶颈和 DNS 故障转移管理。Sidekick 通过检查其就绪状态 API 和 HTTP 错误返回来自动避免将流量发送到失败的服务器。
如您所见,部署 MinIO 集群需要多个活动部件,例如容器、命名空间和 PVC。这些活动部件需要特定的权限才能执行其操作。虽然我们始终遵循安全最佳实践 并设计 MinIO Operator 以使用尽可能少的权限,但有时必须进一步锁定 MinIO 部署以满足金融和医疗保健等领域的监管要求,这些领域存储着 AI/ML 模型和其他敏感数据/知识产权。
在本篇文章中,我们将向您展示如何使用最严格的命名空间权限配置 MinIO Operator,同时能够充分利用 MinIO Operator 的强大功能和灵活性以进行日常操作。
如何锁定 Operator
在锁定 MinIO Operator 的过程中,我们假设您熟悉 Kubernetes 的概念和流程。虽然我们可能会向您展示一些最佳实践,但这篇博文不能替代 Kubernetes 文档。请记住这一点,让我们开始吧。
我们将使用 Kustomize 安装 MinIO Operator,请务必使用这些说明预先安装 Kustomize。
生成 operator.yaml
文件并将所有资源连接到单个文件中
kustomize build github.com/minio/operator/resources/\?ref\=v5.0.9 > operator.yaml |
打开 operator.yaml
。将有以下与 console-sa-role
和 console-sa-binding
相关的部分。删除与这两个设置相关的所有内容。
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata name: console-sa-role rules … --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata name: console-sa-binding roleRef apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: console-sa-role subjects - kind: ServiceAccount name: console-sa namespace: default |
请注意,由于规则数量众多,以上 yaml 已被截断。我们向您展示了 yaml 的开头和结尾,请确保删除这两个部分之间的所有内容。
我们正在删除默认情况下授予控制台的宽松权限。这样做的缺点是,由于 JWT
令牌将限制在 Operator 的集群角色中,因此 Console UI 将无法再创建命名空间或删除卷。这些任务必须在 Operator 自动化范围之外手动完成。
从 operator.yaml
中删除 console-sa-role
和 console-sa-binding
资源后,应用其余资源。
kubectl apply -f operator.yaml |
通常,下一步将是使用以下命令通过端口转发访问租户控制台

但在这种情况下,虽然我们可以访问 UI,但由于包含控制台的命名空间被锁定,因此我们无法创建任何租户。那么我们如何部署租户呢?让我们再次使用 Kustomize 来构建部署租户所需的资源的 yaml。
kustomize build github.com/minio/operator/examples/kustomization/tenant-lite\?ref\=v5.0.9 > tenant.yaml |
构建租户 yaml 后,可以按如下方式部署它
kubectl apply -f tenant.yaml |
让我们测试一下,确保我们可以访问新创建的租户
# mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123 Added `myminio` successfully. |
创建一个 Bucket 以验证它是否已创建
root@ubuntu:/# mc mb myminio/ajtest Bucket created successfully `myminio/ajtest`. |
检查 MinIO 集群和擦除集的状态
root@ubuntu:/# mc admin info myminio ● myminio-pool-0-0.myminio-hl.tenant-lite.svc.cluster.local:9000 Uptime: 3 minutes Version: 2024-01-09T19:57:37Z Network: 4/4 OK Drives: 2/2 OK Pool: 1
● myminio-pool-0-1.myminio-hl.tenant-lite.svc.cluster.local:9000 Uptime: 3 minutes Version: 2024-01-09T19:57:37Z Network: 4/4 OK Drives: 2/2 OK Pool: 1
● myminio-pool-0-2.myminio-hl.tenant-lite.svc.cluster.local:9000 Uptime: 3 minutes Version: 2024-01-09T19:57:37Z Network: 4/4 OK Drives: 2/2 OK Pool: 1
● myminio-pool-0-3.myminio-hl.tenant-lite.svc.cluster.local:9000 Uptime: 3 minutes Version: 2024-01-09T19:57:37Z Network: 4/4 OK Drives: 2/2 OK Pool: 1
Pools 1st, Erasure sets: 1, Drives per erasure set: 8
8 drives online, 0 drives offline |
最终思考
我们构建 MinIO Operator 时,以简洁易用为指导原则。我们不会捆绑仅增加攻击面的额外功能,并且默认安装在开箱即用时尽可能地锁定,消除了使用过于宽松的访问权限进行预配的风险——MinIO Operator 仅拥有执行其操作所需的权限。
在某些环境中,可能需要进一步锁定 MinIO Operator。集群角色访问真正需要的唯一权限是控制台 Pod,为此,您可以结合使用 kubectl minio
和 mc
来管理您的集群。
或者,如果公司安全标准需要,您可以考虑使用Role 而不是 ClusterRole在同一个命名空间中部署 Operator 和租户。这不是我们推荐的最佳方案,但如果您需要将所有内容限制在一个命名空间内,这是一种折衷方案。
主要设计MinIO Kubernetes 部署用于与 Operator 一起使用。MinIO Operator 不仅简化了 MinIO 集群的初始部署,还帮助在发布新版本时升级 MinIO 集群。最重要的是,MinIO Operator 允许您部署多个 MinIO 租户,这使您可以通过设置对他们允许使用的空间量、Bucket 数量等方面的限制,在不同的团队和部门之间逻辑地分离数据。它确实是一个强大的资源。
如果您对 MinIO Kubernetes Operator 有任何疑问,请务必在Slack上与我们联系!