使用 Kubernetes 和 MinIO 运算符简化多租户对象存储即服务

Simplifying Multi-Tenant Object Storage as a Service with Kubernetes and MinIO Operator


本文档更新于 2022 年 1 月 12 日。

对象存储即服务是当今存储领域最热门的概念。原因很简单:对象存储是云存储的存储类别,能够将其无缝地配置到应用程序或开发人员中,使其对任何规模的企业都具有极大的价值。

挑战在于,对象存储即服务传统上一直难以实现。过于复杂、难以调整性能、在扩展时容易出现故障等等。虽然 Kubernetes 等系统为这些系统的部署和管理提供了强大的自动化工具,但 _复杂性_ 的总体问题仍然没有解决,因为管理员仍然需要投入大量时间和精力来部署即使是小型对象存储资源。

通过将 Kubernetes 与我们的新 Operator 和我们的 Operator Console 图形用户界面相结合,MinIO 正在以一种重大的方式改变这种动态。需要说明的是,MinIO 一直都痴迷于简化。它渗透到我们所做的一切,我们做出的每一个设计决策,我们编写的每一行代码。

尽管如此,我们仍然看到了简化的更大机会。为此,我们创建了 MinIO Operator 和 MinIO kubectl 插件,以简化 MinIO 对象存储在 Kubernetes 上的部署和管理。虽然 Operator 命令对于已经熟练使用 Kubernetes 的用户至关重要,但我们也希望能够满足更广泛的用户群体,因此我们为 Operator 创建了一个图形用户界面,并将它整合到我们的新 MinIO Operator Console 中,使组织中的任何人都能够创建、部署和管理对象存储即服务。

Kubernetes 是互联网的平台。鉴于其广泛的采用,我们选择与 Kubernetes 的做事方式保持一致。这意味着不使用任何专用工具或服务来设置 MinIO。

效果是,MinIO Operator 可在任何 Kubernetes 发行版上运行,无论是 OpenShift、vSphere 7.0u1、Rancher 还是默认的上游版本。此外,MinIO 可在任何公有云提供商上运行,例如亚马逊的 EKS(弹性 Kubernetes 引擎)、谷歌的 GKE(谷歌 Kubernetes 引擎)、谷歌的 Anthos 或 Azure 的 AKS(Azure Kubernetes 服务)。

要开始使用任何 Kubernetes 发行版,您几乎只需要一个存储设备,该设备可以通过本地持久卷或 CSI 驱动程序提供给 Kubernetes。

让我们先回顾一下如何使用 kubectl 插件和基于 kustomize 的方法使用 MinIO。您需要在具有 Kubernetes 集群网络访问权限的计算机上安装 kubectl 工具。请参阅 安装和设置 kubectl 以获取安装说明。您可能需要联系您的 Kubernetes 管理员,以寻求在配置您的 kubectl 安装以访问 Kubernetes 集群方面的帮助。

安装

kubectl 插件

要安装 MinIO Operator,我们可以利用它的 _kubectl 插件_,该插件可以通过 _krew_ 安装。

kubectl krew install minio


之后,我们可以通过简单地执行以下命令来安装 Operator

kubectl minio init


使用 kustomize 安装

或者,对于任何喜欢基于 kustomize 的方法的用户,我们的存储库支持安装特定标签,当然,您也可以将此用作您 **kustomization.yaml** 文件的基础。

kubectl apply -k github.com/minio/operator/resources/\?ref\=v4.4.3


配置对象存储

我们用来表示 MinIO 对象存储集群的类比是 **租户**。我们这样做是为了传达这样一个信息,即使用 MinIO Operator,可以在同一个 Kubernetes 集群中分配多个租户。每个租户反过来可以拥有不同的容量(即:500GB 的小型租户与 100TB 的租户)、资源(1000m CPU 和 4Gi RAM 与 4000m CPU 和 16Gi RAM)以及服务器(4 个 pod 与 16 个 pod),以及关于身份提供商、加密和版本的单独配置。

让我们从创建一个跨 4 个节点的容量为 **16Ti** 的小型租户开始。我们首先为要安装的租户创建一个名为 `**minio-tenant-1**` 的命名空间,然后使用 `**kubectl minio tenant create**` 命令将该租户放置在那里。

请密切注意 **存储类**。在这里,我们将使用集群的默认存储类 - 称为 **standard**,但您应该使用任何能够容纳 16Ti(或 1Ti 持久卷)的存储类。

kubectl create ns minio-tenant-1
kubectl minio tenant create minio-tenant-1 \
      --servers 4                             \
      --volumes 16                            \
      --capacity 16Ti                         \
      --namespace minio-tenant-1              \

      --storage-class standard

此命令将输出连接到此租户所需的凭据。MinIO 只会显示一次这些凭据,因此请确保将它们复制到安全的位置。

Tenant 'minio-tenant-1' created in 'minio-tenant-1' Namespace
  Username: admin
  Password: dbc978c2-bfbe-41bf-9dc6-699c76bafcd0 

  注意:请将凭据复制到安全位置。MinIO 不会显示这些   

  再次
+-------------+------------------------+------------------+--------------+-----------------+
| 应用       |       服务名称      |     命名空间    | 服务类型 | 服务端口(s) |
+-------------+------------------------+------------------+--------------+-----------------+
| MinIO       | minio                  | minio-tenant-1   | ClusterIP    | 443             |
| 控制台     | minio-tenant-1-console | minio-tenant-1   | ClusterIP    | 9090,9443       |
+-------------+------------------------+------------------+--------------+-----------------+

通常,租户需要几分钟才能配置完成,因为 MinIO 运算符会通过 Kubernetes 证书签名请求 (CSR) 为 MinIO 和运算符控制台请求 TLS 证书,您可以通过以下操作检查进度

kubectl get tenant -n minio-tenant-1

这将告诉您租户的当前状态

➜ kubectl get tenants -n minio-tenant-1
名称             状态                               年龄
minio-tenant-1   等待 MinIO TLS 证书   19s

几分钟后,租户应报告已初始化状态,表示您的对象存储集群已准备就绪

➜ kubectl get tenants -n minio-tenant-1      
名称             状态         年龄
minio-tenant-1   已初始化   3m21s

就这样,我们的对象存储集群已启动并运行,我们可以通过kubectl port-forward访问它。要访问 MinIO 的控制台

➜ kubectl port-forward svc/minio-tenant-1-console 9443:9443 -n minio-tenant-1
从 127.0.0.1:9443 转发到 9443
从 [::1]:9443 转发到 9443

然后在本地浏览器中访问https://:9443/

非常简单,对吧?

但是现在让我们停止、倒带并重新混合,使用MinIO 控制台(也称为运算符 UI)添加租户。要访问它,我们可以简单地运行kubectl minio proxy命令。这将告诉我们如何访问运算符 UI。

如您所见,它告诉您访问本地浏览器的https://:9090/login,并告诉您用于访问控制台 UI 的 JWT。

在运算符 UI 中,我们可以看到之前使用 kubectl 插件配置的租户。

要添加另一个租户,请点击创建租户。第一个屏幕会询问一些配置问题

1) 为租户命名

2) 选择命名空间

3) 选择存储类

4) 设置租户大小

如果您希望为该租户配置身份提供者、TLS 证书、加密或资源,我邀请您使用左侧部分,这些配置选项位于其中。

在此屏幕中,您可以使用服务器数量、每个服务器的驱动器数量和所需的原始容量来设置租户大小,此外您还可以预览每个擦除编码奇偶校验值选择的可用容量和 SLA 保证。

现在点击创建。就是这样。

返回租户列表,我们可以看到我们最初使用 CLI 配置的租户,以及使用运算符 UI 创建的租户。这些过程是等效的。选择哪一个仅仅是个人喜好。

最后,如果您好奇如何通过传统的yaml配置 MinIO 租户,您可以获取租户的定义,并熟悉我们的自定义资源定义

➜ kubectl get tenant bigdata-storage -o yaml

返回

apiVersion: minio.min.io/v2
kind: Tenant
metadata:
name: bigdata-storage
namespace: default
spec:
credsSecret:
  name: bigdata-storage-secret
env:
  - name: MINIO_STORAGE_CLASS_STANDARD
    value: EC:8
exposeServices:
  console: true
  minio: true
image: minio/minio:RELEASE.2022-01-08T03-11-54Z
imagePullSecret: { }
log:
  audit:
    diskCapacityGB: 10
  image: minio/logsearch:v4.4.3
  resources: { }
mountPath: /export
pools:
  - affinity:
      podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
                - key: v1.min.io/tenant
                  operator: In
                  values:
                    - bigdata-storage
                - key: v1.min.io/pool
                  operator: In
                  values:
                    - pool-0
            topologyKey: kubernetes.io/hostname
    name: pool-0
    resources:
      limits:
        memory: 32Gi
      requests:
        memory: 2Gi
    servers: 4
    volumeClaimTemplate:
      metadata:
        name: data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: "68719476736"
        storageClassName: standard
    volumesPerServer: 4
prometheus:
  diskCapacityGB: 5
  resources: { }
requestAutoCert: true

结论

我们竭尽全力简化 MinIO 在 Kubernetes 上的部署和管理。安装运算符并使用它通过命令行或图形用户界面创建租户非常简单。但是,这只是 MinIO 在 Kubernetes 上的功能的一部分。每个 MinIO 租户都拥有与裸机部署相同的完整功能集,因此您可以将现有的 MinIO 部署迁移到 Kubernetes,并完全相信功能

我鼓励您亲自尝试 MinIO 运算符,并探索其他酷炫的功能,例如使用 Prometheus 指标和审计日志,或使用外部身份提供者(如 LDAP/Active Directory 或 OpenID 提供者)保护 MinIO 租户。

无论采用哪种方法,现在都可以通过各种 IT 管理员、开发人员和架构师的技能集来配置多租户对象存储即服务。