文档

部署 MinIO 租户

本程序文档记录了使用 Kustomize 或 MinIO 的 Helm 图表将 MinIO 租户部署到库存 Kubernetes 集群上的过程。

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

本文档假定您熟悉所有引用的 Kubernetes 概念、实用程序和过程。虽然本文档 *可能* 提供有关以尽力而为的方式配置或部署 Kubernetes 相关资源的指导,但它不是官方 Kubernetes 文档 的替代品。

先决条件

MinIO Kubernetes 运算符

本页上的过程 *需要* 有效安装 MinIO Kubernetes 运算符,并假定本地主机具有匹配的 MinIO Kubernetes 运算符安装。本过程假定使用最新的稳定运算符版本 6.0.4。

有关部署 MinIO 运算符的完整文档,请参阅 部署 MinIO 运算符

具有计算引擎节点的 GKE 集群

本过程假定存在一个具有 MinIO 运算符安装的现有 GKE 集群,并且 *至少* 具有四个计算引擎节点。计算引擎节点应具有匹配的机器类型和配置,以确保 MinIO 的可预测性能。

MinIO 提供 硬件指南,用于选择合适的计算引擎实例类别和大小。MinIO 强烈建议选择支持本地 SSD 并且 *至少* 具有 25Gbps 出站带宽的实例作为性能基线。

有关可用计算引擎和持久存储资源的更多完整信息,请参阅 机器系列资源和比较指南持久磁盘

持久卷

对驱动器的独占访问

MinIO *需要* 对用于对象存储的驱动器或卷进行 *独占* 访问。任何其他进程、软件、脚本或人员都不应对提供给 MinIO 的驱动器或卷或 MinIO 放置在其上的对象或文件执行 *任何* 操作。

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

MinIO 可以使用任何支持 持久卷 (PV) 的 Kubernetes,该持久卷支持 ReadWriteOnce 访问模式。MinIO 的一致性保证需要 ReadWriteOnce 提供的独占存储访问权限。持久卷 *必须* 在部署租户之前存在。

此外,MinIO 建议为 PVC StorageClass 设置 Retain 的回收策略。在可能的情况下,将底层 PVC、CSI 或其他供应器配置为将卷格式化为 XFS,以确保最佳性能。

对于节点具有直接连接存储的 Kubernetes 集群,MinIO 强烈建议使用 DirectPV CSI 驱动程序。DirectPV 提供了一个分布式持久卷管理器,它可以跨 Kubernetes 节点发现、格式化、挂载、调度和监控驱动器。DirectPV 克服了手动配置和监控 本地持久卷 的局限性。

GKE 上的 MinIO 租户应使用 Compute Engine 持久磁盘 CSI 驱动程序 来配置必要的底层持久卷。MinIO 强烈建议使用 SSD 支持的磁盘类型以获得最佳性能。有关 GKE 磁盘类型的更多信息,请参阅 持久磁盘

使用 Kustomize 部署 MinIO 租户

以下过程使用 kubectl -k 使用 MinIO Operator Github 存储库 中的 base Kustomization 模板部署 MinIO 租户。

您可以从 存储库 中选择不同的基本模板或预构建模板作为您的起点,或者使用 MinIO 自定义资源文档 构建自己的 Kustomization 资源。

重要

如果您使用 Kustomize 部署 MinIO 租户,则必须使用 Kustomize 来管理或升级该部署。不要使用 kubectl krew、Helm Chart 或类似方法来管理或升级 MinIO 租户。

此过程并非涵盖 租户 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 的服务器数量、每个服务器的卷数以及存储类。

    字段

    描述

    servers

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

    volumesPerServer

    要附加到每个 MinIO pod (servers) 的持久卷数量。操作员为租户生成 volumesPerServer x servers 持久卷声明。

    volumeClaimTemplate.spec.storageClassName

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

    如果不存在与指定值匹配的存储类如果指定的存储类无法满足请求的 PVC 数量或存储容量,则租户可能无法启动。

    volumeClaimTemplate.spec.resources.requests.storage

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

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

    MinIO 操作员支持以下 Kubernetes 亲和性和反亲和性配置。

    • 节点亲和性 (spec.pools[n].nodeAffinity)

    • Pod 亲和性 (spec.pools[n].podAffinity)

    • Pod 反亲和性 (spec.pools[n].podAntiAffinity)

    MinIO 建议使用 Pod 反亲和性配置租户,以确保 Kubernetes 调度程序不会在同一工作节点上调度多个 pod。

    如果您有要部署租户的特定工作节点,请将这些节点标签或过滤器传递给 nodeAffinity 字段,以将调度程序限制为将 pod 放置在这些节点上。

  4. 配置网络加密

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

    字段

    描述

    tenant.certificate.requestAutoCert

    启用或禁用 MinIO 自动 TLS 证书生成

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

    tenant.certificate.certConfig

    自定义 自动 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 服务器环境变量。

    字段

    描述

    tenant.configuration

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

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

    YAML 包含一个对象 kind: Secret,其 metadata.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 http://127.0.0.1:9000 minio minio123 --insecure
    

    您可以使用 mc mb 在租户上创建一个桶。

    mc mb myminio/mybucket --insecure
    

    如果您使用受信任的证书颁发机构 (CA) 颁发的 TLS 证书部署了 MinIO 租户,则可以省略 --insecure 标志。

    请参阅 连接到租户 以获取特定说明。

连接到租户

MinIO 操作员为 MinIO 租户创建服务。

使用 kubectl get svc -n NAMESPACE 命令查看已部署的服务。

kubectl 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 提供多种选项来配置对服务的外部访问。

有关配置对服务的外部访问的更完整信息,请参阅 Kubernetes 文档中的 发布服务 (ServiceTypes)Ingress