中文文档

布署MinIO多租户

本程序记录了使用 Kustomize 或 MinIO 的 Helm Charts 将 MinIO 租户部署到 Kubernetes 集群上的过程。

部署单节点拓扑需要额外的配置,本文档未涵盖这些内容。 如果需要进行本地测试和评估,可以使用一个简单的Kubernetes YAML对象来描述单节点拓扑。 MinIO 不建议也不支持在生产环境中使用单节点部署拓扑。

本文档假定您已经熟悉所有引用的 Kubernetes 概念、实用工具和过程。 虽然本文档 可能 会尽力提供有关配置或部署 Kubernetes 相关资源的指导,但它不能替代官方 Kubernetes 文档

先决条件

MinIO Kubernetes 操作员

本页上的程序*需要*有效安装 MinIO Kubernetes Operator,并假定本地主机已匹配安装 MinIO Kubernetes Operator。 此过程假设使用最新稳定 Operator 版本 7.1.1。

请参考 部署MinIO操作员,了解有关部署MinIO Operator的完整文档。

检查安全上下文限制

MinIO Operator在每个Pod中使用以下默认 Security Context 进行部署:

securityContext:
  runAsUser: 1000
  runAsGroup: 1000
  runAsNonRoot: true
  fsGroup: 1000

某些OpenShift Security Context Constraints 限制了Pod允许的UID或GID,因此MinIO无法成功部署Tenant。 确保运算符部署Tenant的项目具有足够的SCC设置,以允许默认的Pod安全上下文。 您也可以在部署期间修改租户的安全上下文设置。

以下命令返回securityContext的最佳值:

oc get namespace <namespace> \
-o=jsonpath='{.metadata.annotations.openshift\.io/sa\.scc\.supplemental-groups}{"\n"}'

该命令返回类似于以下内容的输出:

1056560000/10000

在执行此过程之前,请注意斜杠前面的值。

持久卷

Exclusive access to drives

MinIO 要求 专有 对提供给对象存储的驱动器或卷的访问。 其他任何进程、软件、脚本或人员都不得直接对提供给MinIO的驱动器或卷执行 任何 操作,也不得对MinIO放置在其上的对象或文件执行操作。

除非由MinIO工程部门指导,否则不要使用脚本或工具直接修改、删除或移动提供给MinIO的驱动器上的任何数据片段、校验片段或元数据文件,包括从一个驱动器或节点移动到另一个驱动器或节点。 这些操作很可能会导致广泛的数据损坏和丢失,超出了MinIO的修复能力。

MinIO可以使用任何支持 ReadWriteOnce 访问模式的Kubernetes 持久量 (PV)。 MinIO的一致性保证要求独占存储访问,而 ReadWriteOnce 正是提供这种支持。 The Persistent Volume must exist prior to deploying the Tenant.

此外,MinIO建议为 PVC StorageClass 设置 保留 回收策略。 如果可能的话,请配置底层 PV 的存储类、CSI 或其他提供程序,以将卷格式化为 XFS 以确保最佳性能。

对于节点具有直接附加存储的Kubernetes集群,MinIO强烈建议使用 DirectPV CSI 驱动程序。 DirectPV 提供了一个分布式的持久卷管理器,可以在Kubernetes节点之间发现、格式化、挂载、调度和监控驱动器。 DirectPV解决了手动配置和监控 local persistent volumes 的限制。

命名空间

租户必须使用自己的命名空间,不能与其他租户共享命名空间。 此外,MinIO 强烈建议租户使用专用命名空间,命名空间中不运行其他应用程序。

使用 Kustomize 部署 MinIO 租户

下面的过程使用 kubectl -k 使用 MinIO Operator Github 代码库 中的 ``base``定制模板部署 MinIO 租户。

您可以从 repository 中选择不同的基础模板或预建模板作为起点,或者使用 MinIO Custom Resource Documentation 创建自己的 Kustomization 资源。

重要

如果使用 Kustomize 部署 MinIO 租户,则必须使用 Kustomize 管理或升级该部署。 请勿使用 kubectl krew 、Helm 图表或类似方法管理或升级 MinIO 租户。

本步骤并没有穷尽 Tenant CRD 中所有可能的配置选项。 它提供了一个基准,您可以在此基础上根据自己的要求修改和定制租户。

  1. 为租户创建 YAML 对象

    使用 kubectl kustomize 命令生成一个 YAML 文件,其中包含部署 base 租户所需的所有 Kubernetes 资源:

    kubectl kustomize https://github.com/minio/operator/examples/kustomization/base/ > tenant-base.yaml
    

    该命令创建一个 YAML 文件,其中包含多个对象,并用 --- 行隔开。 用你喜欢的编辑器打开文件。

    以下步骤将根据每个对象的 kindmetadata.name 字段对其进行引用:

  2. 配置租户拓扑

    kind: Tenant 对象描述 MinIO 租户。

    以下字段共享 spec.pools[0] 前缀,并控制租户中部署的所有 pod 的服务器数量、每台服务器的卷数量和存储类别:

    Field

    Description

    servers

    服务器池中要部署的 MinIO pod 数量。

    volumesPerServer

    要附加到每个 MinIO pod ( servers ) 的持久卷的数量。 操作员为租户生成 ``volumesPerServer x servers``(每服务器卷)持久卷申请。

    volumeClaimTemplate.spec.storageClassName

    要与生成的持久卷声明关联的 Kubernetes 存储类。

    如果没有与指定值匹配的存储类, 如果指定的存储类无法满足所要求的 PVC 数量或存储容量,租户可能无法启动。

    volumeClaimTemplate.spec.resources.requests.storage

    为每个生成的 PVC 申请的存储容量。

  3. 配置租户亲和性或反亲和性

    MinIO 操作员支持以下 Kubernetes 亲缘和反亲缘配置:

    • Node Affinity ( spec.pools[n].nodeAffinity )

    • Pod Affinity ( spec.pools[n].podAffinity )

    • Pod Anti-Affinity ( spec.pools[n].podAntiAffinity )

    MinIO 建议使用 Pod Anti-Affinity 配置租户,以确保 Kubernetes 计划不会在同一个工作节点上调度多个 pod。

    如果您想在特定的工作节点上部署租户,请将这些节点标签或筛选器传递到 nodeAffinity 字段,以限制调度程序将 pod 放在这些节点上。

  4. 配置网络加密

    MinIO 租户 CRD 提供以下字段,您可以从中配置租户 TLS 网络加密:

    Field

    Description

    tenant.certificate.requestAutoCert

    启用或禁用 MinIO :ref:` 自动 TLS 证书生成 <minio-tls>`

    默认为 true 或启用(如果省略)。

    tenant.certificate.certConfig

    自定义 automatic TLS 的行为(如果启用)。

    tenant.certificate.externalCertSecret

    通过服务器名称指示 (SNI) 为多个主机名启用 TLS

    指定一个或多个 kubernetes.io/tlscert-manager 类型的 Kubernetes 秘密。

    tenant.certificate.externalCACertSecret

    启用验证由未知、第三方或内部证书颁发机构 (CA) 签发的客户端 TLS 证书。

    指定一个或多个类型为 kubernetes.io/tls 的 Kubernetes 秘密,其中包含特定机构的 CA 证书的完整链。

  5. 配置 MinIO 环境变量

    您可以使用 tenant.configuration 字段设置 MinIO 服务器环境变量。

    Field

    Description

    tenant.configuration

    指定 Kubernetes 不透明机密,其数据有效载荷 config.env 包含要设置的每个 MinIO 环境变量。

    config.env ``数据有效载荷 **必须** 是一个 base64 编码的字符串。 您可以创建一个本地文件,设置环境变量,然后使用 ``cat LOCALFILE | base64 创建有效载荷。

    YAML 包括一个对象 kind: Secretmetadata.name: storage-configuration ,其中设置了根用户名、密码、擦除奇偶校验设置,并启用了租户控制台。

    根据需要进行修改,以反映租户的要求。

  6. 查看命名空间

    YAML 对象 kind: Namespace 会将租户的默认命名空间设置为 minio-tenant

    您可以更改该值,为租户创建不同的命名空间。 您必须更改 YAML 文件中的 所有 metadata.namespace 值,以匹配命名空间。

  7. 部署租户

    使用 kubectl apply -f 命令部署租户。

    kubectl apply -f tenant-base.yaml
    

    该命令在配置的命名空间中创建 YAML 对象中指定的每个资源。

    您可以使用以下命令监控进度:

      watch kubectl get all -n minio-tenant
    
  8. 公开租户 MinIO S3 API 端口

    要从本地计算机测试 MinIO 客户端 mc,请转发 MinIO 端口并创建别名。

    • 转发租户的 MinIO 端口:

    kubectl port-forward svc/MINIO_TENANT_NAME-hl 9000 -n MINIO_TENANT_NAMESPACE
    
    • 为租户服务创建别名:

     mc alias set myminio https://localhost:9000 minio minio123 --insecure
    
        您可以使用 :mc:`mc mb` to create a bucket on the Tenant:
    
    mc mb myminio/mybucket --insecure
    
    如果使用由可信证书颁发机构(CA)颁发的 TLS 证书部署 MinIO 租户,则可以省略 ``--insecure``  标记。
    

    有关具体说明,请参阅 连接租户

连接租户

MinIO Operator 会为 MinIO 租户创建服务。

使用命令 oc get svc -n TENANT-PROJECT 来查看已部署的服务:

oc get svc -n TENANT-NAMESPACE
NAME                               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
minio                              LoadBalancer   10.97.114.60     <pending>     443:30979/TCP    2d3h
TENANT-NAMESPACE-console             LoadBalancer   10.106.103.247   <pending>     9443:32095/TCP   2d3h
TENANT-NAMESPACE-hl                  ClusterIP      None             <none>        9000/TCP         2d3h
  • minio 服务对应于MinIO租户服务。 应用程序应使用此服务针对 MinIO 租户执行操作。

  • *-console 服务对应于 MinIO控制台。 管理员应该使用此服务来访问MinIO控制台,并在MinIO租户上执行管理操作。

其余服务支持租户操作,不适合用户或管理员使用。

默认情况下,每个服务仅在Kubernetes集群内可见。 在集群内部部署的应用程序可以使用 CLUSTER-IP 来访问服务。

对于Kubernetes集群外部的应用程序,可以使用 EXTERNAL-IP 来访问服务。 仅为配置了Ingress或类似网络访问服务的Kubernetes集群填充此值。 Kubernetes提供了多种选项来配置服务的外部访问。

有关配置服务的外部访问的更完整信息,请参考和阅读OpenShift文档中的 路由或入口 部分。

使用 OpenShift Web 控制台部署租户。

1) 访问 MinIO Operator 接口。

您可以在左侧导航栏的 Operators 中找到 MinIO Operator 接口。

  1. 转到 Operators,然后选择 Installed Operators

  2. Project 下拉菜单中,选择 openshift-operators

  3. 从已安装的operators列表中选择 MinIO Operators

单击 Create Tenant 开始创建租户的流程。

2) 创建租户

Form View 提供了一个用户界面,用于配置新的 MinIO 租户。

OpenShift Tenant Creation UI View
  • 确保 Tenant Secret -> Name 设置为作为先决条件创建的 MinIO 根用户 Kubernetes 密钥的名称。

  • 确保 Console -> Console Secret -> Name 设置为作为先决条件创建的 MinIO 控制台 Kubernetes 密钥的名称。

您还可以使用 YAML 视图对 MinIO 租户执行更加精细的配置。 有关设置特定字段的指导,请参考和阅读 MinIO 自定义资源定义文档。 MinIO还发布了一些示例,以提供创建自定义租户 YAML 对象的更多指导。 请注意,OperatorHub YAML 视图仅支持创建 MinIO 租户对象。 不要指定任何其他对象作为 YAML 输入的一部分。

OpenShift Tenant Creation UI View

对一个视图的更改将反映在另一个视图中。 例如,您可以在 YAML 视图 中进行修改,并在 表单视图 中看到这些更改。

Security Context Configuration

如果您的 OpenShift 集群安全上下文配置限制了支持的 Pod 安全上下文,则打开 YAML 视图并找到 spec.pools[n].securityContextspec.console.securityContext 对象。 修改 securityContext 设置以使用基于您的 OpenShift 集群 SCC 的受支持 UID。

单击 Create 以使用指定的配置创建 MinIO 租户。 使用作为 MinIO 根用户密钥的凭证来访问 MinIO 服务器。

3) 连接到租户

MinIO Operator将为 MinIO 租户创建服务。 使用 oc get svc -n NAMESPACE 命令来查看已部署的服务:

oc get svc -n minio-tenant-1
NAME                               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
minio                              LoadBalancer   10.97.114.60     <pending>     443:30979/TCP    2d3h
minio-tenant-1-console             LoadBalancer   10.106.103.247   <pending>     9443:32095/TCP   2d3h
minio-tenant-1-hl                  ClusterIP      None             <none>        9000/TCP         2d3h
minio-tenant-1-log-hl-svc          ClusterIP      None             <none>        5432/TCP         2d3h
minio-tenant-1-log-search-api      ClusterIP      10.103.5.235     <none>        8080/TCP         2d3h
minio-tenant-1-prometheus-hl-svc   ClusterIP      None             <none>        9090/TCP         7h39m
  • minio 服务对应于 MinIO 租户服务。 应用程序应使用此服务对 MinIO 租户执行操作。

  • *-console 服务对应于 MinIO控制台。 管理员应使用此服务访问 MinIO 控制台,并对 MinIO 租户执行管理操作。

其余服务支持租户操作,不适用于用户或管理员使用。

默认情况下,每个服务仅在 Kubernetes 集群内部可见。 部署在集群内的应用程序可以使用 CLUSTER-IP 访问服务。

Kubernetes 集群外部的应用程序可以使用 EXTERNAL-IP 访问服务。 只有配置了 Ingress 或类似网络访问服务的 Kubernetes 集群才会填充此值。 Kubernetes 提供多种选项来配置服务的外部访问。 请参考和阅读 Kubernetes 文档: 发布服务 (ServiceTypes)Ingress 以获取有关配置服务的外部访问的更完整信息。

Join Slack 商业支持购买咨询