跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

运维

部署、监控、加固、恢复与排查 Silo 集群。

1 - MinIO Kubernetes Operator

Silo 是兼容 S3 的对象存储。MinIO Operator 是上游 Kubernetes 组件,其仓库已于 2026-03-20 归档并设为只读。最后一个版本 v7.1.1 可以通过 Tenant CRD 管理 Silo 服务端镜像。Operator 名称、API 组、CRD kind、资源名、镜像名和环境变量都属于上游契约,因此不在此改名。

MinIO Operator 会安装 Custom Resource Definition (CRD),其中包括用于把托管对象存储工作负载描述为 Kubernetes objectTenant kind。

固定的 v7.1.1 Kustomize 清单会在 minio-operator 命名空间部署一个 minio-operator Deployment,其中包含两个控制器副本;它不会部署独立的 Operator Console pod。

本站验证的是部署示例中的 Silo 镜像覆盖。归档后的 Operator 不再有持续的上游平台支持或商业支持承诺,本站也不会建立此类承诺。

上游 CRD 契约请参阅固定版本的 MinIO Operator v7.1.1 CRD Reference

Operator 前提条件

Kubernetes 版本

归档的 v7.1.1 README 要求 Kubernetes 1.30.0 或更高版本。请选择仍在维护且 API 兼容的 Kubernetes 版本,并在自己的集群中验证精确组合。可参阅 受维护的 Kubernetes 版本Operator v7.1.1 发布页;Silo 不另行声明更宽的平台支持矩阵。

如果 Kubernetes 基础设施运行的是生命周期已结束的 API 版本,在部署 Operator 时可能出现意料之外或不期望的行为。

Kustomize 和 kubectl

Kustomize 是一个基于 YAML 的模板工具,可让你以声明式、可重复的方式定义 Kubernetes 资源。 Kustomize 已内置在 kubectl 命令行工具中。

本步骤默认你的本地主机既安装了与 Kubernetes 集群版本匹配的 kubectl,也具备在该集群中创建新资源所需的访问权限。

固定版本的 MinIO Operator v7.1.1 Kustomize 模板 提供了可复现的起点。你可以修改该 Kustomization 文件,或应用自己的 patches 适配集群。不要推断还存在受支持的上游新版;任何分支或替代实现都必须独立审查。

Kubernetes TLS Certificate API

MinIO Operator 使用 Kubernetes certificates.k8s.io TLS certificate management API 管理 TLS Certificate Signing Requests (CSR),并在以下场景中创建已签名的 TLS 证书:

MinIO Operator 会读取 operator-ca-tls secret 中的证书,并在 tenant 命名空间内同步该 secret,以信任私有证书颁发机构,例如使用 cert-manager 时的场景。

在上述任一场景下,MinIO Operator 都 要求 Kubernetes kube-controller-manager 的配置中包含以下 配置项

  • --cluster-signing-key-file - 指定用于签发集群级证书的 PEM 编码 RSA 或 ECDSA 私钥。
  • --cluster-signing-cert-file - 指定用于签发集群级证书的 PEM 编码 x.509 Certificate Authority 证书。

Kubernetes TLS API 会使用 CA 的签名算法生成新证书。与 RSA 相比,ECDSA(例如 NIST P-256 curve)或 EdDSA(例如 Curve25519)通常需要更少的计算资源。Silo 服务端支持的套件请参阅 支持的 TLS Cipher Suite

如果 Kubernetes 集群未配置为对生成的 CSR 作出响应,Operator 将无法完成初始化。 某些 Kubernetes 提供方默认不会指定这些配置值。

若要检查 kube-controller-manager 是否指定了集群签名密钥和证书文件,请使用以下命令:

kubectl get pod kube-controller-manager-$CLUSTERNAME-control-plane \
  -n kube-system -o yaml
  • $CLUSTERNAME 替换为 Kubernetes 集群名称。

确认输出中包含高亮标出的行。 上例命令的输出可能与你终端中的实际输出不同:

 spec:
 containers:
 - command:
     - kube-controller-manager
     - --allocate-node-cidrs=true
     - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
     - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
     - --bind-address=127.0.0.1
     - --client-ca-file=/etc/kubernetes/pki/ca.crt
     - --cluster-cidr=10.244.0.0/16
     - --cluster-name=my-cluster-name
     - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
     - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
 ...
警告

重要

MinIO Operator 可以使用指定的 Certificate Authority (CA) 为 Tenant pod 生成 TLS 证书。Kubernetes 集群外部的客户端必须信任该 CA,才能连接到 Silo Tenant 端点。

禁用 TLS 校验仅适用于受控测试。生产客户端应信任签发 CA,或使用其本来就信任的 CA 所签发的证书。

另一种方式是生成由已知且受信任 CA 签发的 x.509 TLS 证书,并通过 Tenant CRD 提供这些证书。更完整的文档请参阅 网络加密(TLS)

2 - 安装 Silo Server

请使用当前的 服务端制品 与本节的平台说明,在物理机或虚拟化主机上安装 Silo。可执行文件、服务、软件包与环境变量契约仍保留 MinIO 兼容名称。

3 - 安装与管理

Silo 部署拓扑与安装说明

本节介绍如何在 Kubernetes裸机或虚拟化 基础设施上安装与管理采用 AGPLv3 许可的 Silo 对象存储服务端。

minio 可执行文件、MINIO_* 环境变量、S3 与 Admin API、盘上格式,以及 MinIO Operator 资源名都是兼容契约。叙述使用 Silo 品牌,命令和标识符则保留兼容名称。

Silo 是兼容 S3 的软件定义分布式对象存储服务端。下载页面 是当前已发布操作系统与架构制品的事实来源。

Silo 使用 纠删码 保护对象数据。你可以选择以下拓扑:

单机单盘 (SNSD,即”单机”模式)

适用于本地开发与评估,可靠性有限或无冗余

单机多盘 (SNMD,即”单机多盘”模式)

适用于对性能、规模和容量要求较低的工作负载

提供驱动器级可靠性,可配置为最多容忍 1/2 驱动器丢失

适合评估多驱动器拓扑和故障切换行为。

多机多盘 (MNMD,即”分布式”模式)

企业级高性能对象存储

提供节点/驱动器级可靠性,可配置为最多容忍 1/2 节点/驱动器丢失

可作为 AI/ML、分布式查询、分析及其他数据湖组件的主存储

可扩展到 PB+ 级工作负载,同时扩展存储容量与性能

Kubernetes

已经归档的 MinIO Kubernetes Operator v7.1.1 可以管理运行 Silo 服务端镜像的 Tenant 资源。Operator、Chart、CRD 与 Tenant Kind 保留上游名称;其上游发布周期现已冻结。

这些保留的 Operator 指南描述一份兼容快照。上游仓库已于 2026-03-20 归档,因此请根据 Kubernetes 发行版验证 v7.1.1,并将 Tenant 镜像覆盖为 pgsty/minio;Silo 项目不继承上游原厂商曾经的平台支持矩阵声明。

裸金属

Silo 可以运行在物理机、虚拟化主机或容器中。请查阅当前下载矩阵和各平台页面,确认已验证的制品与范围。

警告

重要

发布制品的存在不代表所有平台都有同等的生产验证范围。长期工作负载应优先使用经过测试的 Linux 或 Kubernetes 部署,固定确切的软件包/镜像版本,并根据所选拓扑验证存储、故障域、升级与恢复行为。

4 - 部署 Silo Tenant

本步骤说明如何使用 MinIO Operator v7.1.1 管理运行 Silo 服务端镜像的 Tenant。上游 Operator 仓库已于 2026-03-20 归档并设为只读,因此这是一份冻结的兼容基线,而不是仍在维护的 Operator 路径。MinIO OperatorTenantminio.min.io API 组以及 CRD 字段名属于上游 Kubernetes 契约,因此保留原名。

下文验证过的基线会创建一个四服务端 Tenant。单节点拓扑适合本地测试,但其生产故障模型与存储布局不在本文档覆盖范围内。

本文档默认你已经熟悉所有被引用的 Kubernetes 概念、工具和操作流程。 虽然本文档 可能 会以 best-effort 方式提供 Kubernetes 相关资源的配置或部署指导,但它不能替代官方 Kubernetes Documentation

使用 Kustomize 部署 Silo Tenant

以下步骤使用 MinIO Operator v7.1.1 仓库 中的 base Kustomization 模板,然后将其中默认的上游 MinIO 镜像替换为固定版本的 Silo 镜像。

你也可以从 v7.1.1 的其他 示例 中选择起点,或者依据 MinIO Custom Resource Documentation 自行构建资源。上游没有更晚的受支持版本;离开此固定快照前,应独立审查任何分支、替代实现或 CRD 变化。

警告

重要

如果你使用 Kustomize 部署 MinIO Tenant,就必须使用 Kustomize 来管理或升级该部署。 不要使用 kubectl krew、Helm Chart 或类似方式来管理或升级该 MinIO Tenant。

本步骤并未穷尽 Tenant CRD 中的所有可配置项。 它只提供一个基线,你可以在此基础上按需修改和定制 Tenant。

  1. 为 Tenant 创建 YAML 对象

    克隆固定版本的 Operator,并使用 kubectl kustomize 生成一个 YAML 文件,其中包含部署 base Tenant 所需的全部 Kubernetes 资源:

    git clone --branch v7.1.1 --depth 1 https://github.com/minio/operator.git
    kubectl kustomize operator/examples/kustomization/base > tenant-base.yaml

    该命令会创建一个单独的 YAML 文件,多个对象之间使用 --- 分隔。 请使用你偏好的编辑器打开此文件。

    上游模板默认使用 quay.io/minio/minio。应用前,请在 kind: Tenant 对象中把 spec.image 改为已验证的 Silo 版本,并关闭继承而来的原地更新器:

    spec:
      image: pgsty/minio:RELEASE.2026-08-04T00-00-00Z
      env:
        - name: MINIO_UPDATE
          value: "off"

    请按标签或摘要固定镜像。若选择更新的 Silo 镜像,应单独审查并测试该版本,而不是沿用 Operator 模板中的上游镜像。

    下文各步骤将根据对象的 kindmetadata.name 字段来引用这些对象:

  2. 配置 Tenant 拓扑

    kind: Tenant 对象用于描述由 MinIO Operator 管理的 Silo 工作负载。

    以下字段都带有 spec.pools[0] 前缀,用于控制 Tenant 中所有 pod 的 server 数量、每个 server 的卷数量以及存储类:

    字段

    描述

    servers

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

    volumesPerServer

    每个 Silo pod(servers)要挂载的持久卷数量。 Operator 会为该 Tenant 生成 volumesPerServer x servers 个 Persistent Volume Claim。

    volumeClaimTemplate.spec.storageClassName

    与生成的 Persistent Volume Claim 关联的 Kubernetes 存储类。

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

    volumeClaimTemplate.spec.resources.requests.storage

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

  3. 配置 Tenant Affinity 或 Anti-Affinity

    MinIO Operator 支持以下 Kubernetes Affinity 和 Anti-Affinity 配置:

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

    生产环境应为 Tenant 配置 Pod Anti-Affinity,避免 Kubernetes 调度器将多个 Tenant pod 放到同一个 worker node 上。

    如果你希望将 Tenant 部署到特定 worker node 上,请将对应的 node label 或过滤条件传入 nodeAffinity 字段,以约束调度器仅在这些节点上放置 pod。

  4. 配置网络加密

    MinIO Tenant CRD 提供以下字段,用于配置 Tenant 的 TLS 网络加密:

    字段

    描述

    spec.requestAutoCert

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

    若省略该字段,默认值为 true

    spec.certConfig

    在启用的情况下,自定义 自动 TLS 的行为。

    spec.externalCertSecret

    通过 Server Name Indication (SNI) 为多个主机名启用 TLS

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

    spec.externalCaCertSecret

    启用对由未知、第三方或内部 Certificate Authorities (CA) 签发的客户端 TLS 证书的校验。

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

  5. 配置 Silo 环境变量

    Silo 保留上游 MINIO_* 环境变量契约。你可以通过 Tenant CRD 的 spec.configuration 字段所引用的 Secret 提供这些变量,也可以使用 spec.env 设置 MINIO_UPDATE 等单项变量。

    字段

    描述

    spec.configuration.name

    指定一个 Kubernetes opaque Secret,其 config.env 键包含要设置的上游兼容环境变量。

    按 v7.1.1 基础模板使用 stringData.config.env 时填写明文;若改用 data.config.env,其值必须经过 base64 编码。

    该 YAML 中包含一个 kind: Secretmetadata.name: storage-configuration 的对象,用于设置 root 用户名、密码、纠删码校验设置,以及启用 Tenant Console。

    请根据 Tenant 的实际需求修改这些值。

  6. 检查命名空间

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

    你可以修改该值,为 Tenant 创建不同的命名空间。 你必须同时修改 YAML 文件中 所有 metadata.namespace 的值,使其与该命名空间保持一致。

  7. 部署 Tenant

    使用 kubectl apply -f 命令部署 Tenant。

    kubectl apply -f tenant-base.yaml

    该命令会在配置好的命名空间中创建 YAML 对象里定义的每一项资源。

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

    watch kubectl get all -n minio-tenant
  8. 暴露 Tenant 的 S3 API 端口

    若要在本地机器上测试 Silo 客户端 mc,请转发 S3 API 端口并创建别名。

    • 转发 Tenant 的 S3 API 端口:
    kubectl port-forward svc/MINIO_TENANT_NAME-hl 9000 -n MINIO_TENANT_NAMESPACE
    • 为 Tenant 服务创建别名:
    mc alias set myminio https://localhost:9000 minio minio123 --insecure

    你可以使用 mc mb 在 Tenant 上创建存储桶:

    mc mb myminio/mybucket --insecure

    如果你为 Tenant 部署的是由受信任 Certificate Authority (CA) 签发的 TLS 证书,则可以省略 --insecure 参数。

    具体说明请参阅 连接到 Tenant

连接到 Tenant

MinIO Operator 会为 Silo Tenant 创建 Kubernetes Service;这些生成名称仍属于 Operator 契约。

使用 kubectl get svc -n NAMESPACE 命令查看已部署的服务。 如果你的 Kubernetes 环境使用自定义的 kubectl 替代程序,也可以替换为对应程序名。

kubectl 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
TENANT-NAMESPACE-console           LoadBalancer   10.106.103.247   <pending>     9443:32095/TCP   2d3h
TENANT-NAMESPACE-hl                ClusterIP      None             <none>        9000/TCP         2d3h
  • minio 服务暴露 Tenant S3 API。应用程序应通过该服务对 Silo 执行 S3 操作。
  • *-console 服务暴露 Silo Console。管理员可以通过该服务进行浏览器管理。

其余服务用于支撑 Tenant 内部操作,并不面向用户或管理员直接使用。

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

位于 Kubernetes 集群外部的应用可以通过 EXTERNAL-IP 访问这些服务。 该值只有在 Kubernetes 集群配置了 Ingress 或类似网络访问服务时才会被填充。 Kubernetes 提供了多种对 service 开放外部访问的方式。

有关如何配置 service 的外部访问,请参阅 Kubernetes 文档中的 Publishing Services (ServiceTypes)Ingress

对于 OpenShift、Rancher 等特定 Kubernetes 发行版,请以其服务文档中关于对内或对外暴露 Service 的首选或可用方式为准。

5 - 使用 cert-manager 管理 Operator 证书

MinIO Operator 负责管理 minio-operator 命名空间中各服务的 TLS 证书签发。

本页说明如何使用 cert-manager 管理 Operator 的 TLS 证书。

前提条件

1) 为 minio-operator 命名空间创建 CA Issuer

本指南将 禁用 MinIO Operator 的自动证书生成功能,改为使用 cert-manager 签发证书。

minio-operator 命名空间必须拥有自己的证书颁发机构(CA),该 CA 派生自你在 配置 cert-manager 时创建的集群 ClusterIssuer 证书。 请使用 cert-manager 创建此 CA 证书。

警告

重要

该 CA 证书 必须 在安装 MinIO Operator 之前 已存在。

  1. 如果 minio-operator 命名空间尚不存在,请先创建:

    kubectl create ns minio-operator
  2. 申请一个新的 Certificate,并设置 spec.isCA: true

    该证书将作为 minio-operator 命名空间的 CA 使用。

    创建一个名为 operator-ca-tls-secret.yaml 的文件,内容如下:

    # operator-ca-tls-secret.yaml
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: minio-operator-ca-certificate
      namespace: minio-operator
    spec:
      isCA: true
      commonName: operator
      secretName: operator-ca-tls
      duration: 70128h # 8y
      privateKey:
        algorithm: ECDSA
        size: 256
      issuerRef:
        name: selfsigned-root
        kind: ClusterIssuer
        group: cert-manager.io
    警告

    重要

    spec.issueRef.name 必须与 配置 cert-manager 时创建的 ClusterIssuer 名称一致。 如果你使用了不同的 ClusterIssuer 名称,或者使用了与本指南不同的 Issuer,请根据你的环境调整 issuerRef

  3. 应用该资源:

    kubectl apply -f operator-ca-tls-secret.yaml

Kubernetes 会在 minio-operator 命名空间中创建一个名为 operator-ca-tls 的新 Secret。

警告

重要

任何需要与 MinIO Operator 交互的应用都必须信任此证书。

2) 使用该 Secret 创建 Issuer

使用 operator-ca-tls Secret 为 minio-operator 命名空间创建一个 Issuer 资源。

  1. 创建一个名为 operator-ca-issuer.yaml 的文件,内容如下:

    # operator-ca-issuer.yaml
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: minio-operator-ca-issuer
      namespace: minio-operator
    spec:
      ca:
        secretName: operator-ca-tls
  2. 应用该资源:

    kubectl apply -f operator-ca-issuer.yaml

3) 创建 TLS 证书

现在 Issuer 已存在于 minio-operator 命名空间中,cert-manager 可以开始签发证书。

cert-manager 签发的证书必须对以下 DNS 名称有效:

  • sts

  • sts.minio-operator.svc.

  • sts.minio-operator.svc.<cluster domain>

    警告

    重要

    <cluster domain> 替换为你的环境实际使用的值。 cluster domain 是 Kubernetes 集群内部的根 DNS 域。 该值通常为 cluster.local,但你仍应检查 CoreDNS 配置,以确认 Kubernetes 集群实际使用的值。

    例如:

    kubectl get configmap coredns -n kube-system -o jsonpath="{.data}"

    不同 Kubernetes 发行版或托管平台对根域名的管理方式可能不同。 更多信息请参阅你的 Kubernetes 提供方文档。

  1. 为上述 DNS 名称创建一个 Certificate

    创建一个名为 sts-tls-certificate.yaml 的文件,内容如下:

    # sts-tls-certificate.yaml
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: sts-certmanager-cert
      namespace: minio-operator
    spec:
      dnsNames:
        - sts
        - sts.minio-operator.svc
        - sts.minio-operator.svc.cluster.local # Replace cluster.local with the value for your domain.
      secretName: sts-tls
      issuerRef:
        name: minio-operator-ca-issuer
    警告

    重要

    spec.secretName 不是可选项。

    Secret 名称 必须sts-tls。 请确认在证书 YAML 中按照高亮所示设置 spec.secretName: sts-tls

  2. 应用该资源:

    kubectl apply -f sts-tls-certificate.yaml

这会在 minio-operator 命名空间中创建一个名为 sts-tls 的 Secret。

注意

警告

如果包含 TLS 证书的 sts-tls Secret 缺失,或者其中包含无效的 key-value 对,则 STS service 无法启动。

4) 在禁用 Auto TLS 的情况下安装 Operator

现在你可以 安装 MinIO Operator

安装 Operator 时,请在 minio-operator 容器中将环境变量 OPERATOR_STS_AUTO_TLS_ENABLED 设置为 off

禁用该环境变量后,MinIO Operator 将不再自行签发证书。 此时 Operator 将依赖 cert-manager 签发 TLS 证书。

环境变量的具体定义方式取决于你的 Operator 安装方式。 以下步骤演示如何使用 kustomize 配置该变量。

  1. 创建一个名为 kustomization.yaml 的 kustomization patch 文件,内容如下:

    # minio-operator/kustomization.yaml
    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    resources:
    - github.com/minio/operator/resources
    
    patches:
    - patch: |-
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: minio-operator
          namespace: minio-operator
        spec:
          template:
            spec:
              containers:
                - name: minio-operator
                  env:
                    - name: OPERATOR_STS_AUTO_TLS_ENABLED
                      value: "off"
                    - name: OPERATOR_STS_ENABLED
                      value: "on"
  2. 将该 kustomization 资源应用到集群:

    kubectl apply -k minio-operator

将现有 MinIO Operator 部署迁移到 cert-manager

如果要将现有 MinIO Operator 部署从 AutoCert 迁移到 cert-manager,请完成以下步骤:

  1. 完成 安装 cert-manager 的步骤,并禁用 auto-cert。
  2. 完成本页步骤 1 到 3,为 Operator 创建证书颁发机构。
  3. 执行本页中的安装步骤时,不再使用原有的 Operator TLS 证书,而改用 cert-manager 签发的证书。
  4. 参照 用于租户的 cert-manager 页面,为每个租户创建新的 cert-manager 证书。
  5. 使用每个租户对应的 cert-manager 证书 Secret,替换 MinIO Operator 命名空间中租户正在使用的 Secret。

后续步骤

继续配置 用于 MinIO 租户的 cert-manager

6 - 使用 Helm 部署 Operator

概览

Helm 是一个用于将应用自动部署到 Kubernetes 集群的工具。 Helm chart 是一组定义部署细节的 YAML 文件、模板和其他文件。 以下步骤使用 Helm Chart 将 MinIO Kubernetes Operator 安装到 Kubernetes 集群中。

警告

上游 MinIO Operator 仓库已于 2026 年 3 月 20 日归档。本流程固定到其最终版本 v7.1.1,仅作为冻结的兼容基线;这不代表上游仍在维护或提供支持。用于生产环境前,请针对你的 Kubernetes 平台完成验证。

前提条件

基础要求请参阅 Operator 前提条件。 使用 Helm 安装还需要满足以下额外要求:

  • Helm 使用与你的 Kubernetes API 版本匹配的 Helm 版本。
  • yq

有关 Operator 安装要求的更多信息,包括受支持的 Kubernetes 版本和 TLS 证书,请参阅 Operator 部署前提条件

本步骤默认你已经熟悉相关 Kubernetes 概念和工具。 虽然本文档可能会以 best-effort 方式提供 Kubernetes 相关资源的配置或部署指导,但它不能替代官方 Kubernetes Documentation

使用 Helm Charts 安装 MinIO Operator

以下步骤使用 MinIO Operator Chart Repository 安装 Operator。 与 本地 chart 安装 相比,这种方式的安装路径更简单。 安装完成后,你仍可继续修改 Operator 部署。

警告

重要

如果你使用 Helm charts 安装 Operator,就必须使用 Helm 来管理该安装。 不要使用 kubectl krew、Kustomize 或类似方式更新或管理 MinIO Operator 安装。

  1. 将 MinIO Operator Repo 添加到 Helm

    已归档项目的仓库端点 https://operator.min.io 当前仍提供 v7.1.1 Chart。将该仓库添加到 Helm:

    helm repo add minio-operator https://operator.min.io

    你可以使用 helm search 验证仓库内容:

    helm search repo minio-operator

    返回结果应类似如下:

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION
    minio-operator/minio-operator   4.3.7           v4.3.7          A Helm chart for MinIO Operator
    minio-operator/operator         7.1.1           v7.1.1          A Helm chart for MinIO Operator
    minio-operator/tenant           7.1.1           v7.1.1          A Helm chart for MinIO Operator

    minio-operator/minio-operator 是旧版 chart,正常情况下 不应 安装。

  2. 安装 Operator

    运行 helm install 命令安装 Operator。 以下命令会指定并创建一个专用命名空间 minio-operator 用于安装。 MinIO 强烈建议为 Operator 使用专用命名空间。

    helm install \
      --namespace minio-operator \
      --create-namespace \
      --version 7.1.1 \
      operator minio-operator/operator
  3. 验证 Operator 安装

    检查指定命名空间(minio-operator)中的内容,确保所有 pod 和 service 均已成功启动。

    kubectl get all -n minio-operator

    返回结果应类似如下:

    NAME                                  READY   STATUS    RESTARTS   AGE
    pod/minio-operator-699f797b8b-th5bk   1/1     Running   0          25h
    pod/minio-operator-699f797b8b-nkrn9   1/1     Running   0          25h
    
    NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/operator   ClusterIP   10.43.44.204    <none>        4221/TCP            25h
    service/sts        ClusterIP   10.43.70.4      <none>        4223/TCP            25h
    
    NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/minio-operator   2/2     2            2           25h
    
    NAME                                        DESIRED   CURRENT   READY   AGE
    replicaset.apps/minio-operator-79f7bfc48    2         2         2       123m

现在你可以 使用 Helm Charts 部署租户

使用本地 Helm Charts 安装 MinIO Operator

以下步骤使用 Helm Charts 的本地副本安装 Operator。 与 基于仓库的安装 相比,这种方式可能更便于在安装前完成 Operator 预配置。

  1. 下载 Helm charts

    在本地主机上,将 Operator Helm charts 下载到一个合适的目录:

    curl -O https://operator.min.io/helm-releases/operator-7.1.1.tgz
  2. (可选)修改 values.yaml

    该 chart 包含一个可按需定制的 values.yaml 文件。 有关 MinIO Operator values.yaml 可用选项的详细信息,请参阅 Operator Helm 图表

    例如,你可以修改 operator.replicaCount 的副本数,以增加或减少部署中的 pod 可用性。 有关 Operator Helm Chart 和 Values 的更完整文档,请参阅 Operator Helm 图表

    有关定制方式的更多信息,请参阅 Helm Charts

  3. 安装 Helm Chart

    使用 helm install 命令安装已下载的 Chart 归档文件。

    helm install \
    --namespace minio-operator \
    --create-namespace \
    minio-operator ./operator-7.1.1.tgz
  4. 要验证安装,请运行以下命令:

    kubectl get all --namespace minio-operator

    如果你使用自定义命名空间初始化了 Operator,请将 minio-operator 替换为该命名空间。

    使用 Chart 默认值时,该命名空间中应包含一个具有两个就绪副本的 minio-operator Deployment、端口为 4221operator ClusterIP Service,以及端口为 4223sts ClusterIP Service。Pod 哈希、Cluster IP 与运行时长会因安装而异。

现在你可以 使用 Helm Charts 部署租户

7 - 在 Kubernetes 上部署 Silo

Silo 是可在 Kubernetes 中运行的 S3 兼容对象存储服务端。MinIO Kubernetes Operator 的最后一个上游版本 v7.1.1 可以部署使用 Silo 镜像的 Tenant:将 tenant.image.repository 覆盖为 pgsty/minio,并固定经过测试的标签或摘要。

这些指南默认你熟悉所引用的 Kubernetes 概念、工具和操作流程。它们不能替代官方 Kubernetes Documentation;Silo 项目也不继承原 MinIO 厂商针对各 Kubernetes 发行版的支持矩阵。

MinIO Operator、Helm Chart、CRD 与 Tenant Kind 都是独立于 Silo 发布的上游契约。上游 minio/operator 仓库已于 2026-03-20 归档并设为只读,因此其发布周期已经冻结,这些指南只是一份兼容快照。

归档的 Operator 代码提供 MinIO 兼容的 Tenant 管理与配置功能。在部署或升级前,请针对实际集群验证固定的 Operator 与 Chart;上游不再提供持续的兼容性或支持承诺。

你可以通过 Operator 的 Custom Resource Definition (CRD) 与其交互。

CRD 为 Kustomize、Helm 和 kubectl 等工具部署与管理使用 Silo 镜像的 Tenant 提供可定制入口。

警告

重要

MinIO Operator Console UI 已被弃用,并在 MinIO Operator 6.0.0 中移除。

你仍可继续使用标准 Kubernetes 方式管理 MinIO 租户,例如 Kustomize 模板、Helm Charts,以及用于查看租户命名空间和资源的 kubectl 命令。

8 - 在 RHEL 兼容 Linux 上部署 Silo

本页介绍如何在 RHEL 及其二进制兼容 Linux 发行版上部署 Silo。

Silo 为 x86-64 与 ARM64 发布 RPM 软件包和独立 Linux 归档。项目没有单独发布 RHEL 支持生命周期矩阵,因此已删除继承文档中的时间点版本清单。请选择仍处于发行商支持期内的版本,保持内核与系统库更新,并在生产使用前验证精确的存储与工作负载配置。

本步骤重点介绍生产级 多机多盘 (MNMD)“Distributed”配置。 MNMD 部署可提供企业级性能、可用性和可扩展性,是所有生产工作负载的推荐拓扑。

本步骤也包含对 单机多盘 (SNMD) 和 单机单盘 (SNSD) 拓扑的指导,适用于早期开发和评估环境。

注意事项

检查清单

在执行本步骤前,请先阅读我们发布的硬件、软件和安全检查清单。

纠删码校验

MinIO 会根据拓扑中的节点和驱动器总数,自动为集群确定默认的 纠删码 配置。 你可以在设置集群时配置按对象生效的 parity,也可以让 MinIO 选择默认值(生产级集群默认为 EC:4)。

校验值决定了对象可用性与磁盘存储占用之间的关系。 可使用 MinIO 纠删码计算器 选择适合你集群的纠删码校验级别。

虽然你可以随时更改纠删码校验设置,但以既有校验值写入的对象 不会 自动更新为新的校验设置。

基于容量的规划

MinIO 建议在存储使用率达到 70% 之前,预先规划足以存放 至少 2 年数据的存储容量。 过于频繁地执行 服务器池 扩容,或按“just-in-time”方式扩容,通常说明架构或规划存在问题。

例如,假设某套应用每年预计至少生成 100 TiB 数据,并以 3 年后再扩容为目标。 若在部署初期就提供约 500 TiB 可用存储,集群即可在安全满足 70% 阈值的同时,为每年的数据增长预留额外缓冲。

建议使用 MinIO 纠删码计算器,围绕具体纠删码设置进行容量规划。

步骤

1. 下载 Silo RPM 包

下载与安装获取 x86-64 或 ARM64 RPM,校验发布摘要后安装:

sudo dnf install ./minio-*.rpm

当前 Silo 发布不提供继承文档中提到的 ppc64les390x 软件包变体。

2. 查看 systemd 服务文件

.rpm 软件包会将以下 systemd 服务文件安装到 /usr/lib/systemd/system/minio.service

[Unit]
Description=MinIO
Documentation=https://silo.pgsty.com/zh/docs/
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
Type=notify

WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Turn-off memory accounting by systemd, which is buggy.
MemoryAccounting=no

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity

# Disable killing of MinIO by the kernel's OOM killer
OOMScoreAdjust=-1000

SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

3. 为 MinIO 创建用户和组

minio.service 文件默认以 minio-user 用户和组身份运行。 你可以使用 groupadduseradd 命令创建该用户和组。 以下示例创建用户、组,并为计划供 MinIO 使用的文件夹路径设置访问权限。 这些命令通常需要 root(sudo)权限。

groupadd -r minio-user
useradd -M -r -g minio-user minio-user

以上命令创建的用户 不包含 主目录,这对系统服务账户来说是典型做法。

必须 对计划供 MinIO 使用的驱动器路径执行 chown。 如果 minio-user 用户或组无法读取、写入或列出任一驱动器的内容,MinIO 进程会在启动时返回错误。

例如,以下命令将 /mnt/drives-n 下所有驱动器的属主和属组设置为 minio-user:minio-user,其中 n 的范围为 1 到 16:

chown -R minio-user:minio-user /mnt/drives-{1...16}

4. 启用 TLS 连接

为 MinIO 创建或提供 传输层安全 (TLS) 证书,以自动启用 server 与客户端之间的 HTTPS 安全连接。

请将证书放置在 minio-user 用户/组可访问的目录中:

mkdir -p /opt/minio/certs
chown -R minio-user:minio-user /opt/minio/certs

cp private.key /opt/minio/certs
cp public.crt /opt/minio/certs

对于本地测试或开发环境,你可以使用 MinIO certgen 生成自签名证书。 例如,以下命令会生成一组带有 IP 和 DNS Subject Alternate Names (SANs) 的自签名证书,这些 SAN 与 MinIO 服务端 主机关联:

certgen -host "localhost,minio-*.example.net"

将生成的 public.crtprivate.key 放入 /path/to/certs 目录,以为 MinIO 部署启用 TLS。 应用程序可以将 public.crt 作为受信任的证书颁发机构,从而在不禁用证书校验的情况下连接到 MinIO 部署。

当 MinIO 启用 TLS 运行时,它还会根据操作系统中的受信任证书颁发机构列表来验证连接客户端的证书。 若要启用对第三方证书或内部签发证书的验证,请将 CA 文件放入 /opt/minio/certs/CAs 目录。 CA 文件应包含从叶子证书到根证书的完整信任链,以确保验证成功。

有关为 MinIO 配置 TLS 的更具体指导,包括通过 Server Name Indication (SNI) 支持多域名,请参阅 网络加密(TLS)。 你也可以跳过此步骤,以在未启用 TLS 的情况下部署。MinIO 强烈 不建议 在早期开发之外的场景中进行非 TLS 部署。

5. 创建 MinIO 环境文件

/etc/default/minio 创建环境文件。 MinIO 服务将该文件作为 MinIO 以及 minio.service 文件所用全部 环境变量 的来源。

请根据你的部署拓扑修改示例。

在生产环境中使用 多机多盘(“Distributed”)部署拓扑。

# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
#
# The command includes the port that each MinIO server listens on
# (default 9000).
# If you run without TLS, change https -> http

MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

在开发和评估环境中使用 单机多盘 部署。 对于能够容忍节点停机带来数据丢失或不可用的小型存储工作负载,也可以使用该拓扑。

# Set the volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following specifies a single host with 4 drives at the specified location
#
# The command includes the port that the MinIO server listens on
# (default 9000).
# If you run without TLS, change https -> http

MINIO_VOLUMES="https://minio1.example.net:9000/mnt/drive{1...4}/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

在早期开发和评估环境中使用 单机单盘(“Standalone”)部署。 MinIO 不建议在生产环境中使用 单机部署,因为节点或其存储介质丢失会导致数据丢失。

警告

重要

SNSD 部署不支持通过添加新的 服务器池 来扩展存储。

# Set the volume MinIO uses at startup
#
# The following specifies the drive or folder path

MINIO_VOLUMES="/mnt/drive1/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

请根据部署需要,指定其他 环境变量 或 server 命令行选项。

对于分布式部署,所有节点的 /etc/default/minio 环境文件 必须 完全一致。 可在每个节点上使用 shasum -a 256 /etc/default/minio 等工具验证其是否完全匹配。

6. 启动 MinIO 部署

使用 systemctl start minio 启动部署中的每个节点。

你可以在每个节点上使用 journalctl -u minio 跟踪启动状态。

启动成功后,MinIO 进程会输出一段部署摘要,类似如下:

MinIO 对象存储服务端
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2024-06-07T16-42-07Z (go1.22.4 linux/amd64)

API: https://minio-1.example.net:9000 https://203.0.113.10:9000 https://127.0.0.1:9000
   RootUser: minioadmin
   RootPass: minioadmin

WebUI: https://minio-1.example.net:9001 https://203.0.113.10:9001 https://127.0.0.1:9001
   RootUser: minioadmin
   RootPass: minioadmin

CLI: https://silo.pgsty.com/zh/reference/minio-mc/#quickstart
   $ mc alias set 'myminio' 'https://minio-1.example.net:9000' 'minioadmin' 'minioadmin'

Docs: https://silo.pgsty.com/zh/docs/
Status:         16 Online, 0 Offline.

在集群启动和同步期间,你可能会看到日志明显增多。

启动失败的常见原因包括:

  • MinIO 进程对指定驱动器没有读、写、列出权限
  • 驱动器不是空的,或其中包含非 MinIO 数据
  • 驱动器未正确格式化或挂载
  • 一个或多个主机无法通过网络访问

遵循我们的检查清单通常可以降低遇到这些或类似问题的风险。

7. 连接到部署

打开浏览器,并通过任一 MinIO 主机名的 :9001 端口访问 MinIO Console 登录页。 例如:https://minio1.example.com:9001

使用上一步中的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 登录。

MinIO Console 登录页

你可以使用 MinIO Console 执行常规管理任务,例如身份与访问管理、指标和日志监控,或 Server 配置。 每个 MinIO server 都包含自身内嵌的 MinIO Console。

请按照本地主机上的 mc 安装说明 完成安装。 运行 mc --version 验证安装结果。

如果你的 MinIO 部署使用第三方或自签名 TLS 证书,请将 CA 文件复制到 ~/.mc/certs/CAs,以便 mc 信任该证书链。

安装完成后,为该 MinIO 部署创建一个别名:

mc alias set myminio https://minio-1.example.net:9000 USERNAME PASSWORD

请根据你的部署修改主机名、用户名和密码。 主机名可以是部署中的任意一个 MinIO 节点。 你也可以指定负责处理部署连接的负载均衡器、反向代理或类似网络控制平面的主机名。

8. 后续步骤

9 - 升级 MinIO Operator

你可以随时升级 MinIO Operator,而不会影响其管理的 MinIO Tenant。

在升级过程中,Operator 可能会更新并重启 Tenant,以支持 MinIO 自定义资源定义(CRD)的变更。 这些变更不需要操作员或管理员采取额外操作,也不会影响 Tenant 的运行。

本页说明如何将 Operator 从 5.0.15 升级到 7.1.1。 如果在开始本流程前需要先升级到 Operator 5.0.15,请参阅 将 MinIO Operator 4.5.8 及更高版本升级到 5.0.15

说明

Operator 6.0.0 弃用 Operator Console

从 Operator 6.0.0 开始,MinIO Operator Console 已被弃用并移除。

你可以继续使用 Kustomize 或 Helm 等标准 Kubernetes 方式来管理和部署 MinIO Tenant。

将 MinIO Operator 从 5.0.15 升级到 7.1.1

警告

重要

Operator 6.0.0 弃用 MinIO Operator Console,并从 MinIO Operator CRD 中移除相关资源。 其中包括 Operator Console 的 service、pod 等资源。

后续请改用 Kustomize 或 Helm 来管理 Tenant。

以下步骤使用 Kustomize 升级 MinIO Operator。 对于使用 Operator 5.0.0 到 5.0.14 的部署,请先按照 将 MinIO Operator 4.5.8 及更高版本升级到 5.0.15 完成升级,再执行本流程。

如果你是通过 Helm 安装 Operator,请改用 使用 Helm 升级 步骤。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。 在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。 升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 验证现有 Operator 安装。 使用 kubectl get all -n minio-operator 验证所有 Operator pod 和 service 的健康状态与运行状态。

    如果你将 Operator 安装到了自定义命名空间,请在命令中指定 -n <NAMESPACE>

    你可以通过获取该命名空间中某个 operator pod 的对象规范,确认当前安装的 Operator 版本。 以下示例使用 jq 工具从 kubectl 输出中过滤出所需信息:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

    输出类似如下:

    {
       "env": [
          {
             "name": "CLUSTER_DOMAIN",
             "value": "cluster.local"
          }
       ],
       "image": "minio/operator:v5.0.15",
       "imagePullPolicy": "IfNotPresent",
       "name": "minio-operator"
    }

    如果本地主机未安装 jq,你也可以只执行命令的前半部分,然后在输出中查找 spec.containers 段落。

  3. 使用 Kustomize 升级 Operator

    以下命令会将 Operator 升级到 7.1.1:

    kubectl apply -k github.com/minio/operator

    在下面的示例输出中,configured 表示更新后的 CRD 已应用对应变更:

    namespace/minio-operator unchanged
    customresourcedefinition.apiextensions.k8s.io/miniojobs.job.min.io configured
    customresourcedefinition.apiextensions.k8s.io/policybindings.sts.min.io configured
    customresourcedefinition.apiextensions.k8s.io/tenants.minio.min.io configured
    serviceaccount/minio-operator unchanged
    clusterrole.rbac.authorization.k8s.io/minio-operator-role configured
    clusterrolebinding.rbac.authorization.k8s.io/minio-operator-binding unchanged
    service/operator unchanged
    service/sts unchanged
    deployment.apps/minio-operator configured
  4. 验证 Operator 升级结果

    你可以使用前面相同的 kubectl 命令检查新的 Operator 版本:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

以下步骤使用 Helm 升级现有的 MinIO Operator 安装。

如果你是使用 Kustomize 安装 Operator,请改用 使用 Kustomize 升级 步骤。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。 在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。 升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 验证现有 Operator 安装。

    使用 kubectl get all -n minio-operator 验证所有 Operator pod 和 service 的健康状态与运行状态。

    如果你将 Operator 安装到了自定义命名空间,请在命令中指定 -n <NAMESPACE>

    使用 helm list 查看该命名空间中已安装的 chart:

    helm list -n minio-operator

    结果应类似如下:

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    operator        minio-operator  1               2023-11-01 15:49:54.539724775 -0400 EDT deployed        operator-5.0.x v5.0.x
  3. 更新 Operator 仓库

    使用 helm repo update minio-operator 更新 MinIO Operator 仓库。 如果你为 MinIO Operator 仓库设置了不同别名,请在命令中使用该别名替代 minio-operator。 你可以使用 helm repo list 查看当前已安装的仓库。

    更新 Operator 仓库后,使用 helm search 检查最新可用的 chart 版本:

    helm search repo minio-operator

    返回结果应类似如下:

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION
    minio-operator/minio-operator   4.3.7           v4.3.7          A Helm chart for MinIO Operator
    minio-operator/operator         7.1.1          v7.1.1         A Helm chart for MinIO Operator
    minio-operator/tenant           7.1.1          v7.1.1         A Helm chart for MinIO Operator

    minio-operator/minio-operator 是旧版 chart,正常情况下 不应 安装。

  4. 运行 helm upgrade

    Helm 会使用最新 chart 升级 MinIO Operator:

    helm upgrade -n minio-operator \
    operator minio-operator/operator

    如果你将 MinIO Operator 安装到了其他命名空间,请在 -n 参数中指定该命名空间。

    如果你使用的安装名不是 operator,请将上面的值替换为实际安装名。

    命令应返回成功,并且 REVISION 值会递增。

  5. 验证 Operator 升级结果

    你可以使用前面相同的 kubectl 命令检查新的 Operator 版本:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

10 - 升级 Silo 部署

警告

从上游旧版本迁移

如果部署仍运行早于 RELEASE.2024-03-30T09-41-56Z 的上游 MinIO,且启用了 AD/LDAP,请先阅读上游 RELEASE.2024-04-18T19-09-19Z 的发布说明,并完成其中的迁移步骤,再切换到 Silo。这里的名称与链接用于标识上游发布契约,刻意保留不改。

升级 Silo 时,应先在每个节点安装经过校验的服务端制品,再把整个部署作为一次协调操作重启。全量集群重启会造成短暂不可用;应用应重试失败或中断的请求,对象操作的原子性并不能替代重试处理。

本页覆盖由 systemctl 管理和手工管理的裸机部署。若服务由 Ansible、Terraform、容器或其他编排器管理,请通过该工具落实同样的发布、校验与重启边界,不要手工修改其管理的文件。

升级前准备

  1. 备份集群设置。 使用 mc admin cluster bucket exportmc admin cluster iam export 导出存储桶元数据和 IAM 配置。
  2. 选择已经公开发布的 Silo 版本。下载与安装Silo 发布说明GitHub Releases为准。本地标签、分支提交、草稿 Release 或上传到草稿中的制品都不等于公开发布。
  3. 校验制品。 将 SHA-256 摘要与该精确版本随附的校验和核对;所有节点固定到同一个版本。
  4. 阅读跨越的全部发布说明。 特别关注格式、身份认证、配置和降级限制。
  5. 在低环境验证完全相同的升级。 上生产前覆盖代表性的读写、策略、生命周期、复制、通知与恢复流程。
  6. 禁用继承的原地更新器。 在服务端环境中设置 MINIO_UPDATE=off,并重启服务让配置生效。
  7. 检查桶级策略中的对象级资源。 在导出的 IAM 配置里,查找那些把十二个桶级写动作之一(或 s3:*)授在含 / 的资源模式上、且同一个桶没有裸桶 ARN 的语句。这些语句不再授权那些动作。请在对象模式旁边补上裸桶 ARN,参见存储桶资源与对象资源。内置策略以及任何使用 arn:aws:s3:::* 的语句都不受影响。
注意

不要对 Silo 使用 mc admin update ALIAS

截至 2026-08-05,最新公开 Silo 服务端在省略更新 URL 时,仍会选择上游 dl.min.io 发布源和上游 MinIO 签名密钥。因此该命令可能把 Silo 替换成上游二进制。请使用下面经过校验的软件包或二进制流程。另一个客户端命令 mc update 已被禁用,不能执行升级。

systemctl 管理的部署

  1. 下载与安装为每个节点下载同一个公开服务端版本,并校验其摘要。

  2. 不单独重启部分集群 的前提下,在每个节点安装软件包或替换二进制:

    sudo dnf install /path/to/minio.rpm
    sudo dpkg -i /path/to/minio.deb
    sha256sum ./minio
    sudo install -m 0755 ./minio /usr/local/bin/minio

    如果安装位置不同,请把 /usr/local/bin/minio 替换成 command -v minio 返回的路径。

  3. 在每个节点运行 minio --version。只有所有节点都报告同一个预期版本时才能继续。

  4. 把所有服务端进程作为一次协调操作重启。管理 API 可用时执行:

    mc admin service restart ALIAS

    否则通过自动化在所有节点协调执行 systemctl restart minio。除非目标发布明确支持混合版本,否则不要临时改成滚动升级。

  5. 使用 mc admin info 验证部署,然后测试代表性的 S3 读写、控制台访问、身份登录以及已配置的复制或通知。

  6. 下载与安装单独升级客户端。独立制品使用 mcli,源码构建与容器保留 mc

手工管理的部署

对于由用户脚本或其他 supervisor 管理的进程,请在每个节点下载并校验同一个 Silo 二进制,替换 supervisor 实际使用路径上的可执行文件,确认 minio --version,再把所有节点作为一次协调操作重启。服务账户必须能够执行新二进制,执行替换的运维用户必须能够写入安装路径。

重启后执行与上文相同的验证。验证完成前保留上一个经过校验的二进制,使任何回滚决定都能遵循目标版本发布说明中的降级限制。

11 - 使用 Helm Charts 部署 Silo Tenant

概览

Helm 是一个用于将应用自动部署到 Kubernetes 集群的工具。 Helm chart 是一组定义部署细节的 YAML 文件、模板和其他文件。 以下步骤使用 Helm Chart 部署由 MinIO Operator 管理的 Tenant。

本步骤要求 Kubernetes 集群中已存在一个有效的 Operator 部署。 你不能使用 MinIO Operator Tenant chart 在脱离 Operator 的情况下独立部署 Tenant。

警告

重要

MinIO Operator Tenant Chart 与服务端仓库中的旧社区 MinIO Chart 不同。本指南使用 Operator Tenant Chart,因为它提供明确的 Tenant 镜像覆盖。上游 Operator 仓库已于 2026 年 3 月 20 日归档,因此本文固定其最终 v7.1.1 Chart,仅作为冻结的兼容基线;Silo 不继承上游厂商的支持承诺。

前提条件

要使用 Helm 安装 MinIO Tenant,你必须满足以下要求:

  • 一个现有的 Kubernetes 集群
  • 本地主机上安装了与集群版本匹配的 kubectl CLI 工具
  • Helm 3.8 或更高版本
  • yq 4.18.1 或更高版本
  • 一个现有的 MinIO Operator 安装

本步骤默认你对 Kubernetes 集群的访问权限具备较广泛的管理能力。

有关 Tenant 安装要求的更多信息,包括受支持的 Kubernetes 版本和 TLS 证书,请参阅 Tenant 部署前提条件

本步骤默认你已经熟悉相关 Kubernetes 概念和工具。 虽然本文档可能会以 best-effort 方式提供 Kubernetes 相关资源的配置或部署指导,但它不能替代官方 Kubernetes Documentation

命名空间

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

使用 Helm Charts 部署 Silo Tenant

以下步骤使用 MinIO Operator Chart Repository 部署 MinIO Tenant。 与 本地 chart 安装 相比,这种方式的安装路径更简单。

以下步骤使用 Helm 通过已归档上游项目的 v7.1.1 Tenant Chart 部署 MinIO Tenant。

警告

重要

如果你使用 Helm 部署 MinIO Tenant,就必须使用 Helm 来管理或升级该部署。 不要使用 kubectl krew、Kustomize 或类似方式来管理或升级 MinIO Tenant。

本步骤并未穷尽 Tenant Chart 中所有可能的配置项。 它只提供一个基线,你可以在此基础上按需修改和定制 Tenant。

  1. 验证 MinIO Operator Repo 配置

    已归档项目的端点 https://operator.min.io 当前仍提供 v7.1.1 Chart。 如果该仓库尚未存在于本地 Helm 配置中,请先添加后再继续:

    helm repo add minio-operator https://operator.min.io

    你可以使用 helm search 验证仓库内容:

    helm search repo minio-operator

    返回结果应类似如下:

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION
    minio-operator/minio-operator   4.3.7           v4.3.7          A Helm chart for MinIO Operator
    minio-operator/operator         7.1.1           v7.1.1          A Helm chart for MinIO Operator
    minio-operator/tenant           7.1.1           v7.1.1          A Helm chart for MinIO Operator
  2. 创建 Helm values.yaml 的本地副本以供修改

    curl -sLo values.yaml https://raw.githubusercontent.com/minio/operator/v7.1.1/helm/tenant/values.yaml

    请使用文本编辑器打开 values.yaml。继续之前,替换上游服务端镜像默认值,并禁用继承的原地更新器:

    tenant:
      image:
        repository: pgsty/minio
        tag: RELEASE.2026-08-04T00-00-00Z
        pullPolicy: IfNotPresent
      env:
        - name: MINIO_UPDATE
          value: "off"

    仅当更新标签已在 Silo 下载页 发布,并通过你的部署验证后才应使用。Silo 生产环境的 values 文件不应保留 quay.io/minio/miniolatest

  3. 配置 Tenant 拓扑

    以下字段都带有 tenant.pools[0] 前缀,用于控制 Tenant 中所有 pod 的 server 数量、每个 server 的卷数量以及存储类:

    字段

    描述

    servers

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

    volumesPerServer

    每个 MinIO pod(servers)要挂载的持久卷数量。 Operator 会为该 Tenant 生成 volumesPerServer x servers 个 Persistent Volume Claim。

    storageClassName

    与生成的 Persistent Volume Claim 关联的 Kubernetes 存储类。

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

    size

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

  4. 配置 Tenant Affinity 或 Anti-Affinity

    Tenant Chart 支持以下 Kubernetes Selector、Affinity 和 Anti-Affinity 配置:

    • Node Selector (tenant.nodeSelector)
    • Node/Pod Affinity or Anti-Affinity (spec.pools[n].affinity)

    MinIO 建议为 Tenant 配置 Pod Anti-Affinity,以确保 Kubernetes 调度器不会将多个 pod 调度到同一个 worker node 上。

    如果你希望将租户部署到特定 worker node 上,请将对应的 node label 或过滤条件传入 nodeSelectoraffinity 字段,以约束调度器仅在这些节点上放置 pod。

  5. 配置网络加密

    MinIO Tenant CRD 提供了以下字段,你可以通过它们配置租户的 TLS 网络加密:

    字段

    描述

    tenant.certificate.requestAutoCert

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

    若省略该字段,默认值为 true,即启用。

    tenant.certificate.certConfig

    在启用的情况下,自定义 自动 TLS 的行为。

    tenant.certificate.externalCertSecret

    通过 Server Name Indication (SNI) 为多个主机名启用 TLS。

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

    tenant.certificate.externalCACertSecret

    启用对由未知、第三方或内部 Certificate Authorities (CA) 签发的客户端 TLS 证书的校验。

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

  6. 配置 Silo 环境变量

    你可以使用 tenant.configuration 字段设置服务端 MINIO_* 环境变量。这些名称属于 MinIO 兼容契约,不得改名。

    字段

    描述

    tenant.configuration

    指定一个 Kubernetes opaque secret,其数据负载 config.env 包含你希望设置的每一个 MinIO 环境变量。

    config.env 数据负载 必须 是一个 base64 编码字符串。 你可以先创建一个本地文件,在其中设置环境变量,再通过 cat LOCALFILE | base64 生成该负载。

    该 YAML 中包含一个 kind: Secretmetadata.name: storage-configuration 的对象,用于设置 root 用户名、密码、纠删码校验设置,以及启用 Tenant Console。

    请根据 Tenant 的实际需求修改这些值。

  7. 部署 Tenant

    使用 helm 安装 Tenant Chart,并将 values.yaml 作为覆盖配置:

    helm install \
    --namespace TENANT-NAMESPACE \
    --create-namespace \
    --version 7.1.1 \
    --values values.yaml \
    TENANT-NAME minio-operator/tenant

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

    watch kubectl get all -n TENANT-NAMESPACE
  8. 暴露 Tenant 的 MinIO S3 API 端口

    若要在本地机器上测试 MinIO Client mc,请转发 MinIO 端口并创建别名。

    • 转发 Tenant 的 MinIO 端口:
    kubectl port-forward svc/TENANT-NAME-hl 9000 -n TENANT-NAMESPACE
    • 为 Tenant 服务创建别名:
    mc alias set myminio https://localhost:9000 minio minio123 --insecure

    你可以使用 mc mb 在 Tenant 上创建存储桶:

    mc mb myminio/mybucket --insecure

    如果你为 MinIO Tenant 部署的是由受信任 Certificate Authority (CA) 签发的 TLS 证书,则可以省略 --insecure 参数。

    有关连接 Tenant 的更多文档,请参阅 连接到 Tenant

使用本地 Helm Chart 部署 Tenant

以下步骤使用 Helm Charts 的本地副本部署 Tenant。 与 基于仓库的安装 相比,这种方式可能更便于在安装前完成 Tenant 预配置。

  1. 下载 Helm charts

    在本地主机上拉取已固定的 Tenant Chart,并将默认 values 提取为单独覆盖文件:

    helm pull minio-operator/tenant --version 7.1.1
    helm show values tenant-7.1.1.tgz > values.yaml

    每个 chart 都包含一个可按需定制的 values.yaml 文件。 有关 MinIO Tenant values.yaml 可用选项的详细信息,请参阅 租户 Helm Charts

    请使用文本编辑器打开 values.yaml:将 tenant.image.repository 设为 pgsty/minio,将 tenant.image.tag 固定为已发布 Silo 版本,并在 tenant.env 中加入 MINIO_UPDATE=off,与 基于仓库的流程 中的示例一致。

  2. 配置 Tenant 拓扑

    以下字段都带有 tenant.pools[0] 前缀,用于控制 Tenant 中所有 pod 的 server 数量、每个 server 的卷数量以及存储类:

    字段

    描述

    servers

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

    volumesPerServer

    每个 MinIO pod(servers)要挂载的持久卷数量。 Operator 会为该 Tenant 生成 volumesPerServer x servers 个 Persistent Volume Claim。

    storageClassName

    与生成的 Persistent Volume Claim 关联的 Kubernetes 存储类。

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

    size

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

  3. 配置 Tenant Affinity 或 Anti-Affinity

    Tenant Chart 支持以下 Kubernetes Selector、Affinity 和 Anti-Affinity 配置:

    • Node Selector (tenant.nodeSelector)
    • Node/Pod Affinity or Anti-Affinity (spec.pools[n].affinity)

    MinIO 建议为 Tenant 配置 Pod Anti-Affinity,以确保 Kubernetes 调度器不会将多个 pod 调度到同一个 worker node 上。

    如果你希望将租户部署到特定 worker node 上,请将对应的 node label 或过滤条件传入 nodeSelectoraffinity 字段,以约束调度器仅在这些节点上放置 pod。

  4. 配置网络加密

    MinIO Tenant CRD 提供了以下字段,你可以通过它们配置租户的 TLS 网络加密:

    字段 描述
    tenant.certificate.requestAutoCert 启用或禁用 MinIO 自动 TLS 证书生成
    tenant.certificate.certConfig 控制 自动 TLS 的设置。 需要 spec.requestAutoCert: true
    tenant.certificate.externalCertSecret 指定一个或多个类型为 kubernetes.io/tlscert-manager 的 Kubernetes secret。 MinIO 会基于主机名(Server Name Indication)使用这些证书执行 TLS 握手。
    tenant.certificate.externalCACertSecret 指定一个或多个类型为 kubernetes.io/tls 的 Kubernetes secret,其中包含 Tenant 为允许客户端 TLS 连接而必须信任的 Certificate Authority (CA) 证书链。
  5. 配置 Silo 环境变量

    你可以使用 tenant.configuration 字段设置服务端 MINIO_* 环境变量。这些名称仍属兼容契约。

    该字段必须指定一个 Kubernetes opaque secret,其数据负载 config.env 包含你希望设置的每一个 MinIO 环境变量。

    该 YAML 中包含一个 kind: Secretmetadata.name: storage-configuration 的对象,用于设置 root 用户名、密码、纠删码校验设置,以及启用 Tenant Console。

    请根据 Tenant 的实际需求修改这些值。

  6. 以下 Helm 命令使用已固定的本地 Chart 与经审查 values 创建 Silo Tenant:

    helm install \
    --namespace TENANT-NAMESPACE \
    --create-namespace \
    --values values.yaml \
    TENANT-NAME tenant-7.1.1.tgz

    若要部署多个 Tenant,请创建一个包含新 Tenant 详细配置的 Helm chart,并重复上述部署步骤。 重新部署同一个 chart 会更新此前已部署的 Tenant。

  7. 暴露 Tenant 的 MinIO 端口

    若要在本地机器上测试 MinIO Client mc,请转发 MinIO 端口并创建别名。

    • 转发 Tenant 的 MinIO 端口:

      kubectl port-forward svc/TENANT-NAME-hl 9000 -n TENANT-NAMESPACE
    • 为 Tenant 服务创建别名:

      mc alias set myminio https://localhost:9000 minio minio123 --insecure

      该示例使用 HTTPS,但本地客户端可能不信任 Tenant 提供的证书,因此包含 --insecure。如果 Tenant 提供客户端信任的证书,请省略该参数。应确认当前 Tenant 实际生成的服务名,而不要假定固定为 svc/minio

    你可以使用 mc mb 在 Tenant 上创建存储桶:

    mc mb myminio/mybucket --insecure

有关连接 Tenant 的更多文档,请参阅 连接到 Tenant

12 - 使用 MinIO Operator 的 Silo 租户

一个 MinIO 租户由部署在单个命名空间中的一整组 Kubernetes 资源组成,用于支撑 MinIO 对象存储服务。

本文默认目标 Kubernetes 基础设施上已经完成 MinIO Operator 安装

前提条件

你的 Kubernetes 基础设施必须满足以下前提,才能部署 MinIO 租户。

MinIO Kubernetes Operator

本页步骤 要求 已有一个有效的 MinIO Kubernetes Operator 安装,并默认本地主机也安装了与之匹配的 Operator。本页使用仓库归档前的最终上游版本 v7.1.1,仅作为冻结的兼容基线。

有关部署 MinIO Operator 的完整文档,请参阅 在 Kubernetes 上部署 MinIO

带本地存储的 Worker Node

MinIO 强烈建议 将租户部署到带有本地直连存储的 Kubernetes worker node 上。

这些 Worker Node 应满足 MinIO 面向生产环境的 硬件检查清单

应避免将 MinIO 租户与其他高性能软件部署在同一 worker node 上;如果确有必要,则必须配置合适的限制和约束,以保证 MinIO 获得所需的计算与存储资源。

持久卷

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

MinIO 通常可以使用任何支持 ReadWriteOnce 访问模式的 Kubernetes Persistent Volume (PV)。 MinIO 的一致性保证依赖于 ReadWriteOnce 提供的独占存储访问。 此外,MinIO 建议将 PVC StorageClass 的回收策略设置为 Retain。 在条件允许的情况下,应配置 PV 底层的 Storage Class、CSI 或其他 provisioner 使用 XFS 格式化卷,以确保最佳性能。

对于节点具有 Direct Attached Storage 的 Kubernetes 集群,MinIO 强烈建议使用 DirectPV CSI driver。 DirectPV 提供了一个分布式持久卷管理器,可在 Kubernetes 节点之间发现、格式化、挂载、调度和监控驱动器。 DirectPV 解决了手动配置和监控 local persistent volumes 的局限性。

对于部署到 Amazon Elastic、Azure 或 Google Kubernetes 上的租户,请选择下方标签页查看针对 PV 配置的具体建议:

EKS 上的 MinIO 租户必须使用 EBS CSI Driver 来配置所需的底层持久卷。 MinIO 强烈建议使用基于 SSD 的 EBS 卷以获得最佳性能。 MinIO 也强烈建议为基于 EBS 的 PV 使用 XFS 文件系统。 请为 MinIO EBS PV 创建一个 StorageClass,并将 csi.storage.k8s.io/fstype parameter 设置为 xfs

MinIO 推荐以下 EBS 卷类型

  • io2 (Provisioned IOPS SSD) Preferred
  • io1 (Provisioned IOPS SSD)
  • gp3 (General Purpose SSD)
  • gp2 (General Purpose SSD)

有关 EBS 资源的更多信息,请参阅 EBS Volume Types。 有关 StorageClass 参数的更多信息,请参阅 StorageClass Parameters

GKE 上的 MinIO 租户应使用 Compute Engine Persistent Disk CSI Driver 来配置所需的底层持久卷。

MinIO 推荐以下 GKE CSI Driver 存储类:

  • standard-rwo (Balanced Persistent SSD)
  • premium-rwo (Performance Persistent SSD)

MinIO 强烈建议使用基于 SSD 的磁盘类型以获得最佳性能。 有关 GKE 磁盘类型的更多信息,请参阅 Persistent Disks

AKS 上的 MinIO 租户应使用 Azure Disks CSI 驱动配置所需的底层持久卷。

MinIO 推荐以下 AKS CSI Driver 存储类:

  • managed-csi (Standard SSD)
  • managed-csi-premium (Premium SSD)

MinIO 强烈建议使用 SSD 磁盘以获得最佳性能。有关 AKS 磁盘类型的更多信息,请参阅 Azure 磁盘类型

租户命名空间

当你使用 Operator 创建租户时,该租户 必须 拥有自己的命名空间。 在该命名空间内,Operator 会根据租户配置生成所需的 pod。

每个租户 pod 运行三个容器:

  • MinIO Container:运行所有标准 MinIO 功能,等价于裸机场景下的基础 MinIO 安装。 该容器在提供的挂载点(持久卷)上存储和读取对象。
  • InitContainer:仅在 pod 启动期间存在,用于在启动过程中管理配置 secret。 启动完成后,该容器会终止。
  • SideCar container:监控租户的配置 secret,并在其发生变化时进行更新。 该容器还会检查 root 凭证,如果未找到 root 凭证则会产生错误。

从 v5.0.6 起,MinIO Operator 支持自定义 init containers,以满足特定环境所需的额外 pod 初始化逻辑。

租户通过 Persistent Volume Claim 与实际存储对象的 Persistent Volume 交互。

展示 MinIO Operator 使用或维护的命名空间和 pod 的示意图。

13 - 在 Ubuntu Linux 上部署 Silo

本页介绍如何在 Ubuntu Linux 上部署 Silo。

Silo 为 x86-64 与 ARM64 发布 DEB 软件包和独立 Linux 归档。项目没有单独发布 Ubuntu 支持生命周期矩阵,因此已删除继承文档中的时间点版本清单。请选择仍处于发行商支持期内的 Ubuntu 版本,保持内核与系统库更新,并在生产使用前验证精确的存储与工作负载配置。

本步骤重点介绍生产级 多机多盘 (MNMD)“Distributed”配置。 MNMD 部署可提供企业级性能、可用性和可扩展性,是所有生产工作负载的推荐拓扑。

本步骤也包含对 单机多盘 (SNMD) 和 单机单盘 (SNSD) 拓扑的指导,适用于早期开发和评估环境。

注意事项

检查清单

在执行本步骤前,请先阅读我们发布的硬件、软件和安全检查清单。

纠删码校验

MinIO 会根据拓扑中的节点和驱动器总数,自动为集群确定默认的 纠删码 配置。 你可以在设置集群时配置按对象生效的 parity,也可以让 MinIO 选择默认值(生产级集群默认为 EC:4)。

校验值决定了对象可用性与磁盘存储占用之间的关系。 可使用 MinIO 纠删码计算器 选择适合你集群的纠删码校验级别。

虽然你可以随时更改纠删码校验设置,但以既有校验值写入的对象 不会 自动更新为新的校验设置。

基于容量的规划

MinIO 建议在存储使用率达到 70% 之前,预先规划足以存放 至少 2 年数据的存储容量。 过于频繁地执行 服务器池 扩容,或按“just-in-time”方式扩容,通常说明架构或规划存在问题。

例如,假设某套应用每年预计至少生成 100 TiB 数据,并以 3 年后再扩容为目标。 若在部署初期就提供约 500 TiB 可用存储,集群即可在安全满足 70% 阈值的同时,为每年的数据增长预留额外缓冲。

建议使用 MinIO 纠删码计算器,围绕具体纠删码设置进行容量规划。

步骤

1. 下载 Silo DEB 包

下载与安装获取对应架构的 DEB,校验发布摘要后安装。ARM64 主机请使用名称中带 arm64 的文件。

sudo dpkg -i ./minio_*_amd64.deb

2. 查看 systemd 服务文件

.deb 软件包会将以下 systemd 服务文件安装到 /usr/lib/systemd/system/minio.service

[Unit]
Description=MinIO
Documentation=https://silo.pgsty.com/zh/docs/
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
Type=notify

WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Turn-off memory accounting by systemd, which is buggy.
MemoryAccounting=no

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity

# Disable killing of MinIO by the kernel's OOM killer
OOMScoreAdjust=-1000

SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

3. 为 MinIO 创建用户和组

minio.service 文件默认以 minio-user 用户和组身份运行。 你可以使用 groupadduseradd 命令创建该用户和组。 以下示例创建用户、组,并为计划供 MinIO 使用的文件夹路径设置访问权限。 这些命令通常需要 root(sudo)权限。

groupadd -r minio-user
useradd -M -r -g minio-user minio-user

以上命令创建的用户 不包含 主目录,这对系统服务账户来说是典型做法。

必须 对计划供 MinIO 使用的驱动器路径执行 chown。 如果 minio-user 用户或组无法读取、写入或列出任一驱动器的内容,MinIO 进程会在启动时返回错误。

例如,以下命令将 /mnt/drives-n 下所有驱动器的属主和属组设置为 minio-user:minio-user,其中 n 的范围为 1 到 16:

chown -R minio-user:minio-user /mnt/drives-{1...16}

4. 启用 TLS 连接

你可以跳过此步骤,以在未启用 TLS 的情况下部署。 MinIO 强烈 不建议 在早期开发之外的场景中进行非 TLS 部署。

为 MinIO 创建或提供 传输层安全 (TLS) 证书,以自动启用服务端与客户端之间的 HTTPS 安全连接。

MinIO 要求私钥和公钥证书的默认文件名分别为 private.keypublic.crt。 请将证书放置在 minio-user 用户/组可访问的目录中:

mkdir -p /opt/minio/certs
chown -R minio-user:minio-user /opt/minio/certs

cp private.key /opt/minio/certs
cp public.crt /opt/minio/certs

MinIO 会根据操作系统/系统默认的受信任证书颁发机构列表来验证客户端证书。 若要启用对第三方证书或内部签发证书的验证,请将 CA 文件放入 /opt/minio/certs/CAs 目录。 CA 文件应包含从叶子证书到根证书的完整信任链,以确保验证成功。

有关为 MinIO 配置 TLS 的更具体指导,包括通过 Server Name Indication (SNI) 支持多域名,请参阅 网络加密(TLS)

早期开发环境证书

对于本地测试或开发环境,你可以使用 MinIO certgen 生成自签名证书。 例如,以下命令会生成一组带有 IP 和 DNS Subject Alternate Names (SANs) 的自签名证书,这些 SAN 与 MinIO 服务端 主机关联:

certgen -host "localhost,minio-*.example.net"

将生成的 public.crtprivate.key 放入 /path/to/certs 目录,以为 MinIO 部署启用 TLS。 应用程序可以将 public.crt 作为受信任的证书颁发机构,从而在不禁用证书校验的情况下连接到 MinIO 部署。

5. 创建 MinIO 环境文件

/etc/default/minio 创建环境文件。 MinIO 服务将该文件作为 MinIO 以及 minio.service 文件所用全部 环境变量 的来源。

请根据你的部署拓扑修改示例。

在生产环境中使用 多机多盘(“Distributed”)部署拓扑。

# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
#
# The command includes the port that each MinIO server listens on
# (default 9000).
# If you run without TLS, change https -> http

MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

在开发和评估环境中使用 单机多盘 部署。 对于能够容忍节点停机带来数据丢失或不可用的小型存储工作负载,也可以使用该拓扑。

# Set the volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following specifies a single host with 4 drives at the specified location
#
# The command includes the port that the MinIO server listens on
# (default 9000).
# If you run without TLS, change https -> http

MINIO_VOLUMES="https://minio1.example.net:9000/mnt/drive{1...4}/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

在早期开发和评估环境中使用 单机单盘(“Standalone”)部署。 MinIO 不建议在生产环境中使用 单机部署,因为节点或其存储介质丢失会导致数据丢失。

警告

重要

SNSD 部署不支持通过添加新的 服务器池 来扩展存储。

# Set the volume MinIO uses at startup
#
# The following specifies the drive or folder path

MINIO_VOLUMES="/mnt/drive1/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

请根据部署需要,指定其他 环境变量 或 server 命令行选项。

对于分布式部署,所有节点的 /etc/default/minio 环境文件 必须 完全一致。 可在每个节点上使用 shasum -a 256 /etc/default/minio 等工具验证其是否完全匹配。

6. 启动 MinIO 部署

使用 systemctl start minio 启动部署中的每个节点。

你可以在每个节点上使用 journalctl -u minio 跟踪启动状态。

启动成功后,MinIO 进程会输出一段部署摘要,类似如下:

MinIO 对象存储服务端
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2024-06-07T16-42-07Z (go1.22.4 linux/amd64)

API: https://minio-1.example.net:9000 https://203.0.113.10:9000 https://127.0.0.1:9000
   RootUser: minioadmin
   RootPass: minioadmin

WebUI: https://minio-1.example.net:9001 https://203.0.113.10:9001 https://127.0.0.1:9001
   RootUser: minioadmin
   RootPass: minioadmin

CLI: https://silo.pgsty.com/zh/reference/minio-mc/#quickstart
   $ mc alias set 'myminio' 'https://minio-1.example.net:9000' 'minioadmin' 'minioadmin'

Docs: https://silo.pgsty.com/zh/docs/
Status:         16 Online, 0 Offline.

在集群启动和同步期间,你可能会看到日志明显增多。

启动失败的常见原因包括:

  • MinIO 进程对指定驱动器没有读、写、列出权限
  • 驱动器不是空的,或其中包含非 MinIO 数据
  • 驱动器未正确格式化或挂载
  • 一个或多个主机无法通过网络访问

遵循我们的检查清单通常可以降低遇到这些或类似问题的风险。

7. 连接到部署

打开浏览器,并通过任一 MinIO 主机名的 :9001 端口访问 MinIO Console 登录页。 例如:https://minio1.example.com:9001

使用上一步中的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 登录。

MinIO Console 登录页

你可以使用 MinIO Console 执行常规管理任务,例如身份与访问管理、指标和日志监控,或 Server 配置。 每个 MinIO Server 都包含自身内嵌的 MinIO Console。

请按照本地主机上的 mc 安装说明 完成安装。 运行 mc --version 验证安装结果。

如果你的 MinIO 部署使用第三方或自签名 TLS 证书,请将 CA 文件复制到 ~/.mc/certs/CAs,以便 mc 信任该证书链。

安装完成后,为该 MinIO 部署创建一个别名:

mc alias set myminio https://minio-1.example.net:9000 USERNAME PASSWORD

请根据你的部署修改主机名、用户名和密码。 主机名可以是部署中的任意一个 MinIO 节点。 你也可以指定负责处理部署连接的负载均衡器、反向代理或类似网络控制平面的主机名。

8. 后续步骤

14 - 在裸机上部署 Silo

Silo 可以运行在物理机、虚拟化主机或容器中。当前下载页面提供 Linux、macOS 和 Windows 的 x86-64 与 ARM64 服务端制品;请遵循各平台页面的说明,不要假定所有操作系统拥有相同的生产验证范围。

15 - 站点复制概览

站点复制将多个相互独立的 MinIO 部署配置为一个由副本组成的集群,这些副本称为对等站点。

Diagram of a site replication deployment with two sites
一个包含两个对等站点的站点复制部署。 负载均衡器负责将操作路由到两个站点中的任意一个。 写入一个站点的数据会自动复制到另一个对等站点。

站点复制要求使用内置的 MinIO Identity Provider (IDP) 外部 IDP。 所有已配置的部署都必须使用同一个 IDP。 使用外部 IDP 的部署必须在各站点之间使用相同的配置。

有关站点复制架构和部署概念的更多信息,请参阅 Deployment Architecture: Replicated MinIO Deployments

除早期开发、评估或一般性实验外,MinIO 不建议在站点复制中使用 macOS、Windows 或未编排的容器部署。生产环境请使用受支持的 LinuxKubernetes 部署,并按照本页的站点复制流程操作。

概览

所有站点之间会复制哪些内容

每个 MinIO 部署(“对等站点”)都会将以下变更同步到其他对等站点:

  • 存储桶和对象的创建、修改与删除,包括

  • IAM 用户、组、策略以及策略到用户或组的映射(针对 LDAP 用户或组)的创建与删除

  • 为可由本地 root 凭证验证的会话令牌创建 Security Token Service (STS) 凭证

  • 访问密钥 的创建与删除 (不包括 root 用户拥有的访问密钥)

站点复制会在所有复制站点上,为所有新建和现有存储桶启用 存储桶版本控制

说明

新增: mc

RELEASE.2023-12-02T02-03-28Z

你可以选择在对等站点之间复制 ILM 过期规则。 对于新的站点复制配置,可使用带有 --replicate-ilm-expiry 标志的 mc admin replicate add。 对于现有站点复制配置,则可根据需要使用 mc admin replicate update 配合 --enable-ilm-expiry-replication--disable-ilm-expiry-replication 标志启用或禁用该行为。

哪些内容不会在站点之间复制

处于站点复制配置中的 MinIO 部署 不会 复制以下项目的创建或修改:

站点复制的初始流程

启用站点复制后,身份与访问管理(IAM)设置会按以下顺序同步:

  1. 策略

  2. 用户账户(针对本地用户)

  3. Access Keys

    root 的 Access Keys 不会同步。

  4. 已同步用户账户的策略映射

  5. Security Token Service (STS) users 的策略映射

  1. 策略
  2. 与具有有效 MinIO Policy 的 OIDC 账户关联的 Access Keys。root 的 Access Keys 不会同步。
  3. 已同步用户账户的策略映射
  4. Security Token Service (STS) users 的策略映射
  1. 策略
  2. 与具有有效 MinIO Policy 的 LDAP 账户关联的 Access Keys。root 的 Access Keys 不会同步。
  3. 已同步用户账户的策略映射
  4. Security Token Service (STS) users 的策略映射

在对等站点之间完成初始数据同步后,MinIO 会持续在所有站点之间复制并同步任何站点上新发生的 可复制数据

站点自愈

站点复制配置中的任意 MinIO 部署,都可以从拥有该数据最新版本的对等站点重新同步受损的 可复制数据

说明

变更: RELEASE.2023-07-18T17-49-40Z

站点复制操作最多重试三(3)次。

对于重试三次后仍复制失败的操作,MinIO 会将其移出队列。 scanner 会在稍后重新扫描这些受影响对象,并将其重新加入复制队列。

说明

变更: RELEASE.2022-08-11T04-37-28Z

执行任意 GETHEAD API 方法时,失败或待处理的复制会自动重新入队。 例如,某个站点恢复在线后,使用 mc statmc catmc ls 命令会触发自愈重新入队。

说明

变更: RELEASE.2022-12-02T23-48-47Z

如果某个站点因任何原因丢失数据,可使用 mc admin replicate resync 从另一个健康站点重新同步数据。 这会启动一个主动进程来重新同步数据,而无需等待被动的 MinIO scanner 识别缺失数据。

你可以使用 MINIO_SCANNER_SPEED 环境变量或 scanner speed 配置项, 调整 MinIO 在扫描器性能与读写操作之间的平衡方式。

同步复制与异步复制

对于给定的远端目标,MinIO 支持指定异步复制(默认)或同步复制。

在异步复制模式下,MinIO 会在将对象放入 复制队列 之前 完成发起的 PUT 操作。 因此,发起请求的客户端可能会在对象完成复制 之前 就看到 PUT 操作成功。 虽然这可能导致远端对象陈旧或缺失,但它降低了因复制负载而导致写入变慢的风险。

在同步复制模式下,MinIO 会在完成发起的 PUT 操作 之前 尝试复制对象。 无论复制尝试是否成功,MinIO 都会返回一个成功的 PUT 操作结果。 这降低了写入变慢的风险,但代价是远端位置可能出现陈旧或缺失对象。

MinIO 强烈建议使用默认的异步站点复制。 同步站点复制的性能高度依赖站点之间的延迟,较高的延迟可能导致更低的 PUT 性能和复制滞后。 要配置同步站点复制,请使用 mc admin replicate update 并带上 --mode 选项。

代理到其他站点

MinIO 对等站点可以将对象的 GET/HEAD 请求代理到其他对等站点,以检查该对象是否存在。 这样一来,即使某个站点正在自愈或落后于其他对等站点,仍然可以返回已持久化到其他站点的对象。

例如:

  1. 客户端向 Site1 发起 GET("data/invoices/january.xls")
  2. Site1 无法定位该对象
  3. Site1 将请求代理到 Site2
  4. Site2 返回请求对象的最新版本
  5. Site1 将代理返回的对象响应给客户端

对于 包含唯一版本 ID 的 GET/HEAD 请求,代理请求会返回该对象在对等站点上的 最新 版本。 这可能导致取回对象的非当前版本,例如响应请求的对等站点本身也存在复制滞后时。

MinIO 不会代理 LISTDELETEPUT 操作。

前提条件

先备份集群设置

在配置站点复制之前,使用 mc admin cluster bucket exportmc admin cluster iam export 命令分别对存储桶元数据和 IAM 配置进行快照。 如果在配置站点复制过程中发生误配置,可以使用这些快照恢复存储桶/IAM 设置。

初始化时仅允许一个站点包含数据

在初始化时,只允许 一个 站点包含数据。 其他站点必须不包含任何存储桶和对象。

配置站点复制后,第一个部署上的所有数据都会复制到其他站点。

所有站点必须使用相同的 IDP

所有站点都必须使用相同的 Identity Provider。 站点复制支持内置的 MinIO IDP、OIDC 或 LDAP。

所有站点必须使用相同的 MinIO 服务端版本

所有站点都必须使用一致且匹配的 MinIO 服务端版本。 在 MinIO 服务端版本不匹配的站点之间配置复制,可能导致意外或不符合预期的复制行为。

还应确保用于配置复制的 mc 版本尽量与服务器版本保持接近。

访问同一个加密服务

如果通过 Key Management Service (KMS) 使用 SSE-S3SSE-KMS 加密,则所有站点都必须能够访问同一个中心化 KMS 部署。

可以通过一个中心化 KES 服务器,或多个 KES 服务器(例如每个站点一个)连接到同一个受支持的中心化 key vault server 来实现。

复制要求启用版本控制

站点复制 要求 启用 存储桶版本控制,并会自动为所有新建存储桶启用该功能。 在站点复制部署中,不能禁用版本控制。

对于存储桶中被排除在版本控制之外的前缀,MinIO 无法复制其中的对象。

每个站点都应部署负载均衡器

指定该站点的负载均衡器、反向代理或类似网络控制平面组件的 URL 或 IP 地址。 请求会自动路由到部署中的各个节点。

MinIO 不建议为对等站点使用单个节点主机名。 这会形成单点故障:如果该节点离线,复制就会失败。

从存储桶复制切换到站点复制

存储桶复制 与多站点复制是互斥的。 不能在同一组部署上同时使用这两种复制方式。

如果此前已经配置了存储桶复制,而现在希望改用站点复制,则在初始化站点复制时,必须先删除包含数据的那个部署上的全部存储桶复制规则。 可在命令行中使用 mc replicate rm 删除存储桶复制规则。

设置站点复制时,只允许一个站点包含数据。 其他所有站点都必须为空。

教程

配置站点复制

以下步骤将为三个 分布式部署 创建一个新的站点复制配置。 其中一个站点包含 可复制数据

这三个站点分别使用别名 minio1minio2minio3,且仅 minio1 包含数据。

  1. 使用相同的 IDP部署 三个或更多彼此独立的 MinIO 站点

    从空站点开始, 确保最多只有一个站点包含任何 可复制数据

  2. 为每个站点配置别名

    指定该站点的负载均衡器、反向代理或类似网络控制平面组件的 URL 或 IP 地址。 请求会自动路由到部署中的各个节点。

    MinIO 不建议为对等站点使用单个节点主机名。 这会形成单点故障:如果该节点离线,复制就会失败。

    例如,对于三个 MinIO 站点,可以创建别名 minio1minio2minio3

    使用 mc alias set 定义管理该站点连接的负载均衡器主机名或 IP。

    mc alias set minio1 https://minio1.example.com:9000 adminuser adminpassword
    mc alias set minio2 https://minio2.example.com:9000 adminuser adminpassword
    mc alias set minio3 https://minio3.example.com:9000 adminuser adminpassword

    或定义环境变量

    export MC_HOST_minio1=https://adminuser:[email protected]
    export MC_HOST_minio2=https://adminuser:[email protected]
    export MC_HOST_minio3=https://adminuser:[email protected]
  3. 添加站点复制配置

    mc admin replicate add minio1 minio2 minio3

    如果所有站点均为空,则别名顺序无关紧要。 如果其中一个站点包含任何 可复制数据,则必须将其列在第一位。

    最多只能有一个站点包含可复制数据。

  4. 查询站点复制配置进行验证

    mc admin replicate info minio1

    可以使用站点复制配置中任意对等站点的别名。

  5. 查询站点复制状态,确认初始数据已复制到所有对等站点。

    mc admin replicate status minio1

    可以使用站点复制配置中任意对等站点的别名。 输出应表明所有 可复制数据 均已同步。

    输出可能类似如下:

    Bucket replication status:
    ●  1/1 Buckets in sync
    
    Policy replication status:
    ●  5/5 Policies in sync
    
    User replication status:
    No Users present
    
    Group replication status:
    No Groups present

    有关检查站点复制的更多信息,请参阅 站点复制状态教程

扩展站点复制

可以向现有站点复制配置中添加更多站点。

新站点必须满足以下要求:

  • 站点已完成部署,并可通过主机名或 IP 访问
  • 与配置中的其他站点共享相同的 IDP 配置
  • 使用与其他已配置站点相同的 root 用户凭证
  • 不包含任何存储桶或对象数据
  1. 按照上述要求部署新的 MinIO 对等站点

  2. 为新站点配置别名

    指定该站点的负载均衡器、反向代理或类似网络控制平面组件的 URL 或 IP 地址。 请求会自动路由到部署中的各个节点。

    MinIO 不建议为对等站点使用单个节点主机名。 这会形成单点故障:如果该节点离线,复制就会失败。

    要检查现有别名,请使用 mc alias list

    使用 mc alias set 定义管理新站点连接的负载均衡器主机名或 IP。

    mc alias set minio4 https://minio4.example.com:9000 adminuser adminpassword

    或定义环境变量

    export MC_HOST_minio4=https://adminuser:[email protected]
  3. 添加站点复制配置

    使用 mc admin replicate add 命令,将新的对等站点加入站点复制配置中。 先指定 所有 现有对等站点的别名,再指定要添加的新站点别名。

    例如,以下命令将新的对等站点 minio4 添加到现有站点复制配置中,该配置已包含 minio1minio2minio3 三个站点。

    mc admin replicate add minio1 minio2 minio3 minio4
    说明

    说明

    如果任一站点不可达或已永久丢失,则在使用新站点进行扩展前,必须先使用 mc admin replicate rm 移除不可达站点。

  4. 查询站点复制配置进行验证

    mc admin replicate info minio1

修改站点的端点

如果某个对等站点变更了主机名,可以修改复制配置以反映新的主机名。

  1. 使用 mc admin replicate info 获取站点的 Deployment ID

    mc admin replicate info <ALIAS>
  2. 使用 mc admin replicate update 更新站点的端点

    mc admin replicate update ALIAS --deployment-id [DEPLOYMENT-ID] --endpoint [NEW-ENDPOINT]

    将 [DEPLOYMENT-ID] 替换为要更新站点的 deployment ID。

    将 [NEW-ENDPOINT] 替换为该站点的新端点。

    指定该站点的负载均衡器、反向代理或类似网络控制平面组件的 URL 或 IP 地址。 请求会自动路由到部署中的各个节点。

    MinIO 不建议为对等站点使用单个节点主机名。 这会形成单点故障:如果该节点离线,复制就会失败。

从复制中移除站点

可以随时将某个站点从复制中移除。 后续也可以重新添加该站点,但必须先彻底清除该站点上的存储桶和对象数据。

使用 mc admin replicate rm

mc admin replicate rm ALIAS PEER_TO_REMOVE --force
  • ALIAS 替换为复制配置中任意对等站点的 alias
  • PEER_TO_REMOVE 替换为要移除的对等站点别名。

站点复制配置中的所有健康对等站点都会自动更新,以移除指定的对等站点。

MinIO 要求使用 --force 标志,才能将该对等站点从站点复制配置中移除。

查看复制状态

MinIO 提供跨站点的用户、组、策略或存储桶复制信息。

汇总信息包括各类别中 SyncedFailed 项目的数量。

使用 mc admin replicate status

mc admin replicate status <ALIAS> --<flag> <value>

例如:

  • mc admin replicate status minio3 --bucket images

    显示 minio3 站点上 images 存储桶的复制状态。

    输出类似如下:

    ●  Bucket config replication summary for: images
    
    Bucket          | MINIO2          | MINIO3          | MINIO4
    Tags            |                 |                 |
    Policy          |                 |                 |
    Quota           |                 |                 |
    Retention       |                 |                 |
    Encryption      |                 |                 |
    Replication     | ✔               | ✔               | ✔
  • mc admin replicate status minio3 --all

    显示 minio3 所属全部复制站点的复制状态摘要。

    输出类似如下:

    Bucket replication status:
    ●  1/1 Buckets in sync
    
    Policy replication status:
    ●  5/5 Policies in sync
    
    User replication status:
    ●  1/1 Users in sync
    
    Group replication status:
    ●  0/2 Groups in sync
    
    Group           | MINIO2          | MINIO3          | MINIO4
    ittechs         | ✗  in-sync      |                 | ✗  in-sync
    managers        | ✗  in-sync      |                 | ✗  in-sync

16 - 租户的 cert-manager

以下过程用于创建并应用在租户内使用 cert-manager 管理 TLS 证书所需的资源。

说明

说明

本过程使用 tenant-1 作为租户名称。

请在整个过程中将 tenant-1 替换为你的租户名称。

前提条件

1) 创建租户命名空间的 CA Issuer

在部署新租户之前,先为该租户的命名空间创建 Certificate Authority 和 Issuer

  1. 如有必要,先创建租户命名空间。

    kubectl create ns tenant-1

    该值必须与租户 YAML 中 metadata.namespace 字段的值一致。

  2. 为新的 Certificate Authority 申请一个 Certificate,并将 spec.isCA 设为 true

    创建一个名为 tenant-1-ca-certificate.yaml 的文件,内容如下:

    # tenant-1-ca-certificate.yaml
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: tenant-1-ca-certificate
      namespace: tenant-1
    spec:
      isCA: true
      commonName: tenant-1-ca
      secretName: tenant-1-ca-tls
      duration: 70128h # 8y
      privateKey:
        algorithm: ECDSA
        size: 256
      issuerRef:
        name: selfsigned-root
        kind: ClusterIssuer
        group: cert-manager.io
    警告

    重要

    spec.issueRef.name 必须与 设置 cert-manager 时创建的 ClusterIssuer 名称一致。 如果你使用了不同的 ClusterIssuer 名称,或者采用了与本指南不同的 Issuer,请按你的环境修改 issuerRef

  3. 应用该资源:

    kubectl apply -f tenant-1-ca-certificate.yaml

2) 创建 Issuer

Issuer 负责在租户命名空间内签发证书。

  1. 生成一个 Issuer 的资源定义。

    创建一个名为 tenant-1-ca-issuer.yaml 的文件,内容如下:

    # tenant-1-ca-issuer.yaml
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: tenant-1-ca-issuer
      namespace: tenant-1
    spec:
      ca:
        secretName: tenant-1-ca-tls
  2. 应用该 Issuer 资源定义:

    kubectl apply -f tenant-1-ca-issuer.yaml

3) 为租户创建证书

请求 cert-manager 为 MinIO 签发新的 TLS server 证书。 该证书必须对以下 DNS 域名有效:

  • minio.<namespace>
  • minio.<namespace>.svc
  • minio.<namespace>.svc.<cluster domain>
  • *.<tenant-name>-hl.<namespace>.svc.<cluster domain>
  • *.<namespace>.svc.<cluster domain>
  • *.<tenant-name>.minio.<namespace>.svc.<cluster domain>'
警告

重要

请将占位符文本(由 <> 标识)替换为你的租户实际值:

  • <cluster domain> 是 Kubernetes 集群内部的根 DNS 域。 通常为 cluster.local,但你仍应检查 CoreDNS 配置,以确认 Kubernetes 集群实际使用的值。

    例如:

    kubectl get configmap coredns -n kube-system -o jsonpath="{.data}"

    不同 Kubernetes 提供方对根域名的管理方式各不相同。 更多信息请参考你的 Kubernetes 提供方文档。

  • tenant-name 是 Tenant YAML 中 metadata.name 字段指定的名称。 在本例中该值为 myminio

  • namespace 是前面创建、将用于安装租户的命名空间值。 在 Tenant YAML 中,它定义在 metadata.namespace 字段。 在本例中该值为 tenant-1

  1. 为指定域名申请一个 Certificate

    创建一个名为 tenant-1-minio-certificate.yaml 的文件。 文件内容应类似如下,并根据你的集群和租户配置进行调整:

    # tenant-1-minio-certificate.yaml
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: tenant-certmanager-cert
      namespace: tenant-1
    spec:
      dnsNames:
        - "minio.tenant-1"
        - "minio.tenant-1.svc"
        - 'minio.tenant-1.svc.cluster.local'
        - '*.minio.tenant-1.svc.cluster.local'
        - '*.myminio-hl.tenant-1.svc.cluster.local'
        - '*.myminio.minio.tenant-1.svc.cluster.local'
      secretName: myminio-tls
      issuerRef:
        name: tenant-1-ca-issuer
    说明

    提示

    在本例中,Tenant 名称为 myminio。 作为命名约定,建议将 spec.secretName 字段中的 secret 命名为 <tenant-name>-tls

  2. 应用该证书资源:

    kubectl apply -f tenant-1-minio-certificate.yaml
  3. 验证变更是否已生效:

    kubectl describe secret/myminio-tls -n tenant-1
    说明

    说明

    • tenant-1 替换为你的租户命名空间。
    • 如果 secret 名称不同,请将 myminio-tls 替换为实际值。

4) 使用 cert-manager 部署租户并管理 TLS 证书

部署 Tenant 时,必须将 TLS 配置设置为以下状态:

  • Tenant 不会自动生成自己的证书(spec.requestAutoCert: false并且
  • Tenant 具有有效的 cert-manager 引用(spec.externalCertSecret

这会指示 Operator 在部署 Tenant 时仅使用 cert-manager 管理的证书。

以下 YAML spec 提供了满足这些要求的基线配置:

apiVersion: minio.min.io/v2
kind: Tenant
metadata:
  name: myminio
  namespace: tenant-1
spec:
...
  ## Disable default tls certificates.
  requestAutoCert: false
  ## Use certificates generated by cert-manager.
  externalCertSecret:
    - name: myminio-tls
      type: cert-manager.io/v1
...

5) 在 MinIO Operator 中信任租户 CA

默认情况下,MinIO Operator 不信任租户的 CA。 若要让 Operator 信任该 CA,你必须将该证书作为 secret 传递给 Operator。

为此,请在 minio-operator 命名空间中创建一个以 operator-ca-tls- 为前缀、后接唯一标识符命名的 secret。

MinIO Operator 会挂载并信任由所提供的 Certificate Authority 签发的 所有 证书。 这是必需的,因为 MinIO Operator 会通过 /minio/health/cluster 端点执行健康检查。

创建 operator-ca-tls-tenant-1 secret

将租户中由 cert-manager 生成的 CA 公钥(ca.crt)复制到 minio-operator 命名空间中。 这样 Operator 就能信任该 cert-manager 颁发的 CA 及其派生的所有证书。

  1. 创建一个包含该 CA 的 ca.crt 文件:

    kubectl get secrets -n tenant-1 tenant-1-ca-tls -o=jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  2. 创建 secret:

    kubectl create secret generic operator-ca-tls-tenant-1 --from-file=ca.crt -n minio-operator
说明

提示

在本例中,我们选择将 secret 命名为 operator-ca-tls-tenant-1。 我们使用租户命名空间 tenant-1 作为后缀,以便更容易识别该 CA 来自哪个命名空间。 建议使用你的租户命名空间名称作为后缀,以便将 secret 与相关资源更容易关联起来。

6) 部署租户

租户命名空间中的 Certificate Authority 和 Issuer 就绪后,你现在可以 部署对象存储租户

请使用修改后的基线 Tenant YAML,禁用 AutoCert 并引用刚刚生成的 secret。

17 - 核心运维概念

MinIO 部署由哪些组件构成?

一个 MinIO 部署由一组存储和计算资源构成,这些资源运行一个或多个 minio server 节点,并共同作为单一对象存储库。

一个单机 MinIO 实例由单个 服务器池 和单个 minio server 节点组成。 单机实例最适合初期开发和评估。

MinIO 部署既可以直接运行在 裸金属 或非虚拟化基础设施中的物理设备上。 MinIO 也可以运行在云服务中的虚拟机上,例如使用 Docker、Podman 或 Kubernetes。 MinIO 可以运行在本地、私有云或市场上的众多公有云中。

你设计、架构和构建系统的具体方式称为系统的 拓扑。

MinIO 支持哪些系统拓扑?

MinIO 可以部署到以下三种拓扑:

  1. 单机单盘,单个 MinIO server,使用单个驱动器或文件夹存储数据

    例如,在本地 PC 上使用硬盘中的一个文件夹进行测试。

  2. 单机多盘,单个 MinIO server,使用多个挂载驱动器或文件夹存储数据

    例如,一个挂载了两个或更多卷的单容器。

  3. 多机多盘,多个 MinIO server,使用多个挂载驱动器或卷存储数据

    对于裸金属 基础设施,你可以使用 Ansible、Terraform 或手动流程安装并管理分布式 MinIO 部署。

    对于 Kubernetes 基础设施,请使用 MinIO Operator 来管理和部署分布式 MinIO Tenant。

分布式 MinIO 部署如何工作?

分布式部署会利用多台物理机或虚拟机的计算和存储资源。 在现代场景中,这通常意味着在私有云或公有云环境中运行 MinIO,例如 Amazon Web Services、Google Cloud Platform、Microsoft Azure 等。

MinIO 如何管理多个虚拟或物理服务器?

虽然测试 MinIO 可能只涉及一台计算机上的单个驱动器,但大多数生产级 MinIO 部署都会使用多个计算和存储设备来构建高可用环境。 服务器池 是一组 minio server 节点,它们汇聚各自的驱动器和资源,以支持对象存储写入和读取请求。

MinIO 支持向现有部署中添加一个或多个 服务器池,以实现横向扩容。 当 MinIO 拥有多个可用 服务器池 时,单个对象始终会写入同一个 服务器池 中的同一个纠删码集合。

如果某个 服务器池 发生故障,MinIO 会停止所有服务器池的 I/O,直到集群恢复正常运行。 你必须将该服务器池恢复到可工作状态,部署的 I/O 才能恢复。 在执行修复操作期间,写入其他服务器池的对象仍会安全保留在磁盘上。

传递给 minio server 命令的 HOSTNAME 参数表示一个 服务器池:

请看下面的启动命令示例。该命令会创建一个单独的 服务器池,其中包含 4 个 minio server 节点,每个节点有 4 块驱动器,总计 16 块驱动器。

minio server https://minio{1...4}.example.net/mnt/disk{1...4}

             |                    服务器池                |

在同一条 minio server 启动命令中启动多个 服务器池,可使各个 服务器池 对等节点彼此可感知。

有关完整语法和用法,请参阅 minio server

MinIO 如何将多个 服务器池 连接为单一 MinIO 集群?

cluster 指由一个或多个 服务器池 组成的完整 MinIO 部署。

请看下面的命令。它创建了一个由两个 服务器池 组成的 cluster,每个服务器池都包含 4 个 minio server 节点,且每个节点有 4 块驱动器,总计 32 块驱动器。

minio server https://minio{1...4}.example.net/mnt/disk{1...4} \
             https://minio{5...8}.example.net/mnt/disk{1...4}

             |                    服务器池                |

每个 服务器池 根据其中的驱动器和节点数量,包含一个或多个 纠删码集合

MinIO 强烈建议生产集群中的每个 服务器池 至少包含 4 个 minio server 节点,以获得恰当的高可用性和持久性保障。

我可以更改现有 MinIO 部署的大小吗?

MinIO 分布式部署 支持通过扩容和退役来增加或减少可用存储。

扩容是指向现有部署中添加一个或多个 服务器池。 每个 服务器池 都由专用节点和存储组成,并为部署的总体容量作出贡献。 服务器池 一旦创建,其大小便无法更改,但你可以随时通过添加或退役服务器池 来增加或移除容量。

有关在裸金属 和 Kubernetes 基础设施上进行扩容的更多信息,请分别参阅 裸金属:扩展 MinIO 部署Kubernetes:扩展 MinIO Tenant

对于包含多个 服务器池 的部署,你可以 退役 较旧的 pool,并将其中的数据迁移到部署中的较新 pool。 退役一旦开始就无法停止。 MinIO 将退役功能设计为移除硬件老旧的 pool,而不是在任何部署中定期执行的操作。

说明

先下线再新增时保持 pool 顺序

如果你在多 pool 部署中下线了一个 pool,就不能在新 pool 中复用相同的节点编号序列。 例如,假设某个部署包含以下几个 pool:

https://minio-{1...4}.example.net/mnt/drive-{1...4}
https://minio-{5...8}.example.net/mnt/drive-{1...4}
https://minio-{9...12}.example.net/mnt/drive-{1...4}

如果你下线了 minio-{5...8} 这个 pool,就不能再用相同的节点编号新增一个 pool。你必须将新 pool 添加在 minio-{9...12} 之后

https://minio-{1...4}.example.net/mnt/drive-{1...4}
https://minio-{9...12}.example.net/mnt/drive-{1...4}
https://minio-{13...16}.example.net/mnt/drive-{1...4}

如何管理一个或多个 MinIO 实例或集群?

你可以通过多种方式管理 MinIO 部署和集群:

MinIO 如何管理对象在部署中的分布?

MinIO 会根据各个服务器池 的空闲空间占所有可用 服务器池 总空闲空间的比例,将新对象(即没有现有版本的对象)写入空闲空间最多的 服务器池。 MinIO 不会执行将对象从旧服务器池重新平衡到新服务器池 这类成本高昂的操作。 相反,新对象通常会首先路由到新 pool,因为它拥有最多空闲空间。 随着该服务器池逐渐填满,新的写操作最终会在部署中的所有服务器池之间趋于平衡。 有关写入偏好计算逻辑的更多信息,请参阅下文 写入文件

扩容后在所有服务器池之间重新平衡数据是一项昂贵操作,需要扫描整个部署并在服务器池之间移动对象。 完成所需时间取决于需要移动的数据量。

从 MinIO 客户端版本 RELEASE.2022-11-07T23-47-39Z 开始,你可以使用 mc admin rebalance 手动在所有 服务器池 之间发起重新平衡操作。

重新平衡不会阻塞现有操作,而是与其他 I/O 并行运行。 这可能导致常规操作性能下降。 建议在非高峰时段安排重新平衡操作,以避免影响生产工作负载。 你可以随时启动和停止重新平衡。

如何向 MinIO 上传对象?

你可以使用任何兼容 S3 的 SDK 向 MinIO 部署上传对象。 每个 SDK 都会执行等价于 PUT 的操作,将对象传输到 MinIO 进行存储。

MinIO 还支持 multipart uploads。 借助该机制,客户端可以将对象拆分为多个 part,以提高吞吐量和传输可靠性。 MinIO 会重组这些 part,直到对象完整,然后将其存储到指定路径。

MinIO 如何提供可用性、冗余性和可靠性?

MinIO 使用 纠删码 提供数据冗余和可靠性

MinIO 纠删码是一项数据冗余和可用性特性,可让具有多块驱动器的 MinIO 部署在集群中丢失多个驱动器或节点的情况下,仍然自动实时重建对象。 与 RAID 或复制等同类技术相比,纠删码以显著更低的开销提供对象级 自愈

MinIO 通过 bit rot 自愈保护静态数据

bit rot 是一种可能发生在任何存储设备上的随机、静默数据损坏。 bit rot 损坏并非由用户活动触发,系统本身的操作系统通常也无法感知该损坏,因此无法通知用户或管理员数据已发生变化。

bit rot 的常见原因包括:

  • 驱动器老化
  • 电流尖峰
  • 驱动器固件 bug
  • 幻写
  • 错误定向的读写
  • 驱动程序错误
  • 意外覆写

MinIO 使用哈希算法确认对象完整性。 该算法会在对象执行任何 GETHEAD 操作时自动生效。 对于启用了版本控制的存储桶,如果 MinIO 识别到版本不一致,PUT 操作也可能触发自愈。 如果对象因 bit rot 而损坏,MinIO 可根据该对象校验分片的可用性,自动 自愈 该对象。

MinIO 还可以使用 MinIO 扫描器 执行 bit rot 检查和自愈。 不过,扫描器的 bit rot 检查默认 关闭。 与 bit rot 同时影响分布在多个驱动器和节点上的多个对象分片这一低概率事件相比,扫描期间主动执行 bit rot 自愈的性能影响较高。 正常操作期间的自动检查通常已足够应对 bit rot,MinIO 不建议将扫描器用于这类健康检查。

MinIO 将数据分布到 纠删码集合 中,以实现高可用性和韧性

纠删码集合是一组支持 MinIO 纠删码 的驱动器。 纠删码为存储在 MinIO 部署上的数据提供高可用性、可靠性和冗余性。

MinIO 会将对象拆分为称作 shards 的块,并将其均匀分布到纠删码集合中的各块驱动器上。 即使任意单块驱动器丢失,MinIO 也可以继续无缝响应读写请求。 在最高冗余级别下,即使部署中最多有一半 (N/2N / 2) 驱动器丢失,MinIO 仍能以很小的性能影响继续提供读取请求。

MinIO 会根据集合中的驱动器总数以及集合中的 minio server 数量,计算 服务器池 中纠删码集合的大小和数量。 更多信息请参阅 纠删码基础

MinIO 自动实时自愈损坏或丢失的数据

自愈 是 MinIO 在某些事件导致数据丢失后恢复数据的能力。 数据丢失可能来自 bit rot、驱动器丢失或节点丢失。

如果对象只是部分丢失,纠删码 可继续提供读写访问。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

MinIO 使用校验在对象级提供数据保护

包含多块驱动器的 MinIO 部署会将可用驱动器划分为数据驱动器和校验驱动器。 MinIO 纠删码会在写入对象时,将关于对象内容的附加哈希信息写入校验驱动器。 MinIO 使用这些校验信息确认对象完整性,并在必要时恢复某个驱动器或某组驱动器上丢失、缺失或损坏的对象分片。

即使丢失的驱动器总数达到纠删码集合中可用校验设备的数量,MinIO 仍可以继续提供对象的完整访问能力。

通过仲裁提供读写能力

仲裁指执行某项任务所必须可用的最少驱动器数量。 MinIO 为读取数据和写入数据分别定义了不同的仲裁值。

通常,为保持写入对象的能力,MinIO 所需的可用驱动器数量会高于读取对象所需的数量。

17.1 - 部署架构

Silo 生产部署架构与拓扑

本页从生产视角概述 MinIO 的部署架构。 有关具体硬件或软件配置的信息,请参阅:

分布式 MinIO 部署

生产级 MinIO 部署至少由 4 台具有同构存储和计算资源的 MinIO 主机构成。

MinIO 会将这些资源聚合为一个 pool,并以单一对象存储服务的形式对外提供。

4 节点 MinIO 部署,存储和计算资源同构
该 服务器池中的每台 MinIO 主机都具有一致的计算、存储和网络配置

使用本地直连存储时,MinIO 可提供最佳性能,例如连接到主机 PCI-E 控制器板上的 NVMe 或 SSD 驱动器。

存储控制器应以 XFS 格式化驱动器并采用 “Just a Bunch of Drives” (JBOD) 配置呈现,不使用 RAID、池化或其他硬件/软件韧性层。 MinIO 不建议使用缓存,无论是在驱动器层还是控制器层。 任意一种缓存都会在填充和清空时导致 I/O 尖峰,从而带来不可预测的性能。

通过 SAS 连接到 PCI-E 存储控制器的直连存储 MinIO Server 示意图
每块 SSD 都通过 SAS 连接到以 HBA 模式运行的 PCI-E 直连存储控制器

MinIO 会自动将 服务器池中的驱动器分组为 纠删码集合

纠删码集合是 MinIO 可用性与韧性 的基础组件。 MinIO 会在 服务器池的各节点间对纠删码集合进行对称条带化,以保持纠删码集合驱动器分布均匀。 随后,MinIO 会根据部署的 校验 将对象拆分为数据分片和校验分片,并将其分布到纠删码集合中。

如需更完整地了解 MinIO 的冗余和自愈机制,请参阅 纠删码对象自愈

对象被拆分为 8 个数据块和 8 个校验块,并分布到 16 块驱动器上的示意图
当校验值为最高的 EC:8 时,MinIO 会将对象切分为 8 个数据块和 8 个校验块,并分布到纠删码集合中的各块驱动器上。 此 服务器池中的所有纠删码集合都具有相同的条带大小和分片分布。

MinIO 使用基于对象名称和路径的确定性哈希算法,为给定对象选择纠删码集合。

对于每个唯一对象命名空间 BUCKET/PREFIX/[PREFIX/...]/OBJECT.EXTENSION,MinIO 在读写操作中始终会选择相同的纠删码集合。 MinIO 会处理 服务器池和纠删码集合内部的所有路由,使选择、读取和写入过程对应用完全透明。

仅从数据分片恢复对象的示意图
MinIO 会在将对象返回给请求客户端之前,透明地从数据分片或校验分片重建对象。

每个 MinIO server 都完整掌握分布式拓扑,因此应用可以连接到部署中的任意节点并对其发起操作。

响应请求的 MinIO 节点会自动处理对部署中其他节点的内部路由,并将最终响应返回给客户端。

应用通常不应自行管理这些连接,因为部署拓扑的任何变化都可能要求应用随之更新。 生产环境应部署负载均衡器或类似网络控制平面组件,以管理到 MinIO 部署的连接。 例如,你可以部署 NGINX 负载均衡器,对部署中的可用节点执行 “least connections” 或 “round robin” 负载均衡。

位于负载均衡器后的 8 节点 MinIO 部署示意图
负载均衡器会将请求路由到部署中的任意节点。 之后由接收请求的节点处理所有节点间请求。

你可以通过 pool 扩容 增加 MinIO 部署的可用存储。

每个 服务器池都是由自身纠删码集合组成的独立节点组。 MinIO 必须查询每个 服务器池,才能确定读写操作应定向到哪个纠删码集合,因此每增加一个 服务器池,每次调用的节点间流量都会相应增加。 包含目标纠删码集合的 服务器池随后会响应该操作,而这一过程对应用完全透明。

如果你通过 服务器池扩容修改了 MinIO 拓扑,可以通过更新负载均衡器,将新 服务器池的节点纳入应用流量。 应用仍可继续使用该 MinIO 部署的负载均衡器地址,而无需更新或修改。 这样既能保证请求在所有 服务器池之间均匀分布,又能让应用继续使用单一负载均衡器 URL 访问 MinIO。

位于负载均衡器后的多 服务器池MinIO 部署示意图
PUT 请求需要检查每个 服务器池,以确定目标纠删码集合。 一旦识别完成,MinIO 就会切分对象,并将数据分片和校验分片分布到对应集合中。

客户端应用可以使用任意兼容 S3 的 SDK 或库与 MinIO 部署交互。

MinIO 也发布了专门面向兼容 S3 部署使用的 SDK

多个兼容 S3 的客户端通过 SDK 连接到 MinIO 的示意图
使用不同兼容 S3 SDK 的客户端可以对同一个 MinIO 部署执行操作。

MinIO 严格实现 S3 API,包括要求客户端对所有操作使用 AWS Signature V4 或 legacy Signature V2 进行签名。 AWS 签名计算依赖客户端提供的 header,因此负载均衡器、代理、安全程序或其他组件若修改这些 header,就会导致签名不匹配错误并使请求失败。 请确保任何此类中间组件都支持将 header 从客户端到服务器原样透传。

虽然 S3 API 的所有操作都使用 GETPOST 等 HTTP 方法,应用通常仍会使用 SDK 来执行 S3 操作。 特别是签名计算的复杂性,通常使通过 curl 或类似 REST 客户端直接交互变得不切实际。 MinIO 建议使用能够自动完成签名计算的兼容 S3 SDK 或库。

复制型 MinIO 部署

MinIO 站点复制 支持在彼此独立的部署之间进行同步。

你可以将对等站点部署在不同机架、数据中心或地理区域,以支持 BC/DR,或为全球分布式 MinIO 对象存储提供地理就近的读写性能。

含三个 MinIO 对等站点的多站点部署示意图
一个包含三个对等站点的 MinIO 多站点部署。 写入某个对等站点的操作会自动复制到配置中的其他所有对等站点。

复制性能主要取决于各对等站点之间的网络延迟。

当对等站点跨地理区域分布时,站点间的高延迟可能导致显著复制滞后。 如果工作负载已经接近或达到部署的总体性能上限,这一问题会进一步放大,因为复制过程本身也需要足够的空闲 I/O 来同步对象。

含站点间延迟的多站点部署示意图
在此对等配置中,站点 A 与其他对等站点之间的延迟为 100ms。 对象最早也要在 110ms 之后才能完成对所有站点的同步。

部署支持站点间故障切换协议的全局负载均衡器或类似网络设备,是多站点部署正常工作的关键。

负载均衡器应支持 health probe/check 设置,以检测某个站点故障,并自动将应用重定向到其他健康对等站点。

含两个站点的站点复制部署示意图
负载均衡器会根据配置逻辑(地理就近、延迟等)自动路由客户端请求。 写入某个站点的数据会自动复制到另一个对等站点。

在连接均衡和 header 保留方面,负载均衡器应满足与单站点部署相同的要求。 MinIO 复制会通过排队对象来处理瞬时故障。

17.2 - 可用性与韧性

Silo 生产环境的可用性与韧性

本页从生产视角概述 MinIO 在可用性与韧性方面的设计和特性。

说明

说明

本页内容旨在尽力帮助你理解 MinIO 在可用性与韧性方面的预期设计和理念。 它不能替代 MinIO SUBNET 的能力。使用 MinIO SUBNET 可以在规划 MinIO 部署时与 MinIO Engineering 协同。

社区用户可以通过 MinIO Community Slack 寻求支持。 社区支持仅为 best-effort,不提供关于响应时间的 SLA。

分布式 MinIO 部署

MinIO 将 纠删码 作为在驱动器级或节点级故障期间提供可用性与韧性的核心组件。

MinIO 会将每个对象拆分为数据分片和 校验 分片,并将这些分片分布到单个 纠删码集合 中。

纠删码对象被拆分为 12 个数据分片和 4 个校验分片的示意图
这个小型单节点部署在一个纠删码集合中拥有 16 块驱动器。 假设使用默认 校验 EC:4,MinIO 会将对象拆分为 4 个校验分片和 12 个数据分片。 MinIO 会将这些分片均匀分布到纠删码集合中的各块驱动器上。

MinIO 使用确定性算法为给定对象选择纠删码集合。

对于每个唯一对象命名空间 BUCKET/PREFIX/[PREFIX/...]/OBJECT.EXTENSION,MinIO 在读写操作中始终会选择相同的纠删码集合。 这也包括同一对象的所有 版本

基于对象命名空间选择纠删码集合的示意图
MinIO 使用完整对象命名空间来计算目标纠删码集合。

MinIO 需要满足 读写仲裁 才能对纠删码集合执行读写操作。

仲裁取决于部署配置的校验值。 读仲裁始终等于配置的校验值,因此只要某个纠删码集合丢失的驱动器数不超过校验值,MinIO 就可以对其执行读操作。

降级纠删码集合示意图,其中两个校验分片替换了两个数据分片
该节点有两块驱动器故障。 MinIO 会自动使用校验分片替换丢失的数据分片,并将重建后的对象返回给请求客户端。

当默认校验值为 EC:4 时,部署中的每个纠删码集合最多可容忍 4 块驱动器丢失,同时仍能继续提供读操作。

写仲裁取决于配置的校验值和纠删码集合大小。

如果校验值小于纠删码集合驱动器数量的 1/2,则写仲裁等于校验值,其行为与读仲裁相似。

MinIO 会自动提高写入降级纠删码集合的对象校验值,以确保该对象能够满足与健康纠删码集合中对象相同的 SLA。 这种校验升级行为提供了额外的风险缓解层,但无法替代修复或更换损坏驱动器这一长期解决方案,后者才是让纠删码集合恢复到完全健康状态的根本方法。

降级纠删码集合示意图,其中两块驱动器发生故障
该节点有两块驱动器故障。 MinIO 会以升级后的 EC:6 校验值写入对象,以确保该对象满足与其他对象相同的 SLA。

当默认校验值为 EC:4 时,部署中的每个纠删码集合最多可容忍 4 块驱动器丢失,同时仍能继续提供写操作。

如果校验值等于纠删码集合驱动器数量的 1/2,则写仲裁等于校验值加 1,以避免因 “split brain” 场景导致数据不一致。

例如,如果纠删码集合中恰好一半驱动器因网络故障而被隔离,MinIO 会认为仲裁丢失,因为它无法为写操作建立一个 N+1 驱动器组。

一半驱动器故障的纠删码集合示意图
该节点有 50% 的驱动器故障。 如果校验值为 EC:8,该纠删码集合就无法满足写仲裁,MinIO 会拒绝对此集合的写操作。 由于该纠删码集合仍然满足读仲裁,对现有对象的读操作仍可能成功。

纠删码集合如果永久丢失的驱动器数量超过配置校验值,就意味着已经发生数据丢失。

对于最高校验配置,如果驱动器丢失数量等于校验值,纠删码集合就会进入 read only 模式。 对于最大纠删码集合大小 16 和最大校验值 8 的情况,需要丢失 9 块驱动器才会发生数据丢失。

完全降级的纠删码集合示意图
该纠删码集合丢失的驱动器数量超过了配置的 EC:4 校验值,因此已经同时失去读仲裁和写仲裁。 MinIO 无法恢复存储在该纠删码集合中的任何数据。

某些瞬时或临时驱动器故障,例如由存储控制器或连接硬件故障引起的情况,仍可能在该纠删码集合内恢复到正常运行状态。

MinIO 还会通过在 pool 的每个节点间对纠删码集合驱动器进行对称条带化,进一步降低纠删码集合故障风险。

MinIO 会根据节点数和驱动器数自动计算最佳纠删码集合大小,其中最大集合大小为 16。 随后,它会跨 pool 为每个纠删码集合从每个节点选择一块驱动器;如果纠删码集合条带大小大于节点数,则会循环选择。 这种拓扑可对单节点故障,甚至该节点上的单个存储控制器故障提供韧性。

一个由 16 节点、每节点 8 块驱动器组成的集群示意图,包含 8 个 16 驱动器纠删码集合,并在各节点上均匀条带化
在此 16 x 8 部署中,MinIO 会计算出 8 个纠删码集合,每个集合 16 块驱动器。 它会在所有可用节点上为每个纠删码集合分配每节点 1 块驱动器。 如果只有 8 个节点,则 MinIO 需要为每个纠删码集合从每个节点选择 2 块驱动器。

在上述拓扑中,该 pool 具有 8 个跨 16 个节点条带化的 16 驱动器纠删码集合。 每个节点都会为每个纠删码集合分配 1 块驱动器。 虽然丢失一个节点在技术上意味着丢失 8 块驱动器,但每个纠删码集合实际上只会各丢失 1 块驱动器。 这使得即使节点停机,系统仍能保持仲裁。

同一 pool 中的每个纠删码集合彼此独立。

即使一个纠删码集合完全降级,MinIO 仍可对其他纠删码集合执行读写操作。

一个 MinIO 多 pool 部署中某个 pool 内一个纠删码集合故障的示意图
一个 pool 中有一个降级纠删码集合。 虽然 MinIO 已无法对该纠删码集合执行读写操作,但它仍能继续对该 pool 中健康的纠删码集合提供服务。

不过,丢失的数据仍可能影响依赖 100% 数据可用性假设的工作负载。 此外,每个纠删码集合都与其他集合完全独立,因此你不能使用其他纠删码集合来恢复一个完全降级的纠删码集合中的数据。 你必须使用 站点存储桶 复制,创建一个具备 BC/DR 能力的远端部署,用于恢复丢失的数据。

对于多 pool MinIO 部署,每个 pool 都至少需要有一个纠删码集合保持读写仲裁,才能继续提供操作能力。

如果某个 pool 丢失了全部纠删码集合,MinIO 就无法再判断某次读写操作原本是否应被路由到该 pool。 因此,即使其他 pool 仍然可用,MinIO 也会停止整个部署中的所有 I/O。

一个 MinIO 多 pool 部署中某个 pool 故障的示意图
该部署中的一个 pool 已完全故障。 MinIO 无法再确定 I/O 应路由到哪个 pool 或纠删码集合。 如果继续操作,就可能产生不一致状态,使对象及其版本分布在不同纠删码集合中。 因此,MinIO 会暂停部署中的所有 I/O,直到该 pool 恢复。

要恢复对该部署的访问,管理员必须将该 pool 恢复到正常运行状态。 这可能需要根据故障严重程度执行磁盘格式化、硬件更换或节点更换。 更完整的文档请参阅 硬件故障恢复

你可以使用复制远端将丢失数据恢复回该部署。 存储在健康 pool 中的所有数据仍会安全保留在磁盘上。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

复制型 MinIO 部署

对于 MinIO 部署中发生的小规模或大规模数据丢失,MinIO 将 站点复制 作为保证业务连续性和灾难恢复 (BC/DR) 的主要手段。

初始设置期间的多站点部署示意图
每个对等站点都部署在独立数据中心,以防范大规模故障或灾难。 如果某个数据中心完全离线,客户端可以故障切换到另一个站点。

MinIO 复制可以在站点因瞬时或持续停机而发生部分或全部数据丢失时,自动 自愈 该站点。

自愈过程中的多站点部署示意图
Datacenter 2 曾经离线,Site B 需要重新同步。 负载均衡器会将操作路由到 Datacenter 1 中的 Site A。 Site A 会持续将数据复制到 Site B。

一旦所有数据同步完成,你就可以恢复对该站点的正常连接。 根据复制滞后量、站点间延迟以及整体工作负载的 I/O 情况,你可能需要临时停止写操作,让各站点完全追平。

如果某个对等站点彻底故障,你可以将其从配置中完全移除。 负载均衡器配置也应移除该站点,以避免将客户端请求路由到离线站点。

然后,你可以在修复原始硬件或完全更换硬件后,通过 将其重新加入站点复制配置 来恢复该对等站点。 MinIO 会在持续复制新数据的同时,自动开始重同步已有数据。

站点在重同步期间仍可通过将 GET/HEAD 请求代理到健康对等站点来继续处理操作

重同步期间的多站点部署示意图
Site B 不具备所请求的对象,可能是由于复制滞后。 它会将 GET 请求代理到 Site A。 Site A 返回对象后,Site B 再将其返回给请求客户端。

客户端会收到首个返回所请求对象任意版本的对等站点结果。

PUTDELETE 操作通过常规复制流程进行同步。 LIST 操作不会代理,客户端必须只对健康对等站点发起这类请求。

17.3 - 纠删码

Silo 纠删码

MinIO 将纠删码作为提供数据冗余和可用性的核心组件。 本页介绍 MinIO 的纠删码机制。

有关 MinIO 如何在生产部署中使用纠删码的更多信息,请参阅 可用性与韧性部署架构

纠删码基础

说明

说明

本节中的图示和内容仅用于说明 MinIO 纠删码操作的简化视图,并不完整呈现 MinIO 纠删码实现的全部复杂性。

MinIO 会将每个 服务器池 中的驱动器分组为一个或多个相同大小的纠删码集合。

Diagram of erasure set covering 4 nodes and 16 drives
上述示例部署由 4 个节点组成,每个节点有 4 块驱动器。 MinIO 初始化后会生成一个纠删码集合,覆盖这 4 个节点上的全部 16 块驱动器。

MinIO 会在初始化 服务器池 时确定纠删码集合的最佳数量和大小。 初次设置完成后,便无法再修改这些参数。

对于每次写操作,MinIO 都会将对象切分为数据和校验分片。

纠删码集合的条带大小决定了部署可用的最大 校验 值。 生成数据分片和校验分片数量的公式如下:

N (ERASURE SET SIZE) = K (DATA) + M (PARITY)
Diagram of possible erasure set parity settings
上述示例部署的纠删码集合包含 16 块驱动器。 这意味着它支持从 EC:0 到纠删码集合驱动器数量 1/2 的校验值,也就是最高 EC:8

你可以将校验值设置在 0 到纠删码集合大小的 1/2 之间。

Diagram of an object being sharded using MinIO's Reed-Solomon Erasure Coding algorithm.
MinIO 使用 Reed-Solomon 纠删码实现来切分对象,并将其分布到纠删码集合中。 上述示例部署的纠删码集合大小为 16,校验值为 EC:4

对象一旦按某个校验设置写入,即使之后修改校验值,也不会自动更新。

MinIO 至少需要 K 个任意类型的分片才能读取对象。

这里的 K 构成部署的读仲裁。 因此,纠删码集合中至少要有 K 块健康驱动器,才能支持读操作。

Diagram of a 4-node 16-drive deployment with one node offline.
该部署中有一个节点离线,因此只剩下 12 块健康驱动器。 该对象按 EC:4 写入,其读仲裁为 K=12。 因此该对象仍满足读仲裁,MinIO 可以重建对象并响应读操作。

对于已经失去读仲裁的对象,MinIO 无法进行重建。 这类对象可能需要通过其他方式恢复,例如 复制重同步

MinIO 至少需要 K 块纠删码集合驱动器才能写入对象。

这里的 K 构成部署的写仲裁。 因此,纠删码集合中至少要有 K 块可用驱动器在线,才能支持写操作。

Diagram of a 4-node 16-drive deployment where one node is offline.
该部署中有一个节点离线,因此只剩下 12 块健康驱动器。 客户端按 EC:4 校验设置写入对象,此时该纠删码集合的写仲裁为 K=12。 该纠删码集合仍满足写仲裁,因此 MinIO 可以用它执行写操作。

当校验 EC:M 恰好等于纠删码集合大小的 1/2 时,写仲裁为 K+1

这样可以防止 split-brain 场景,例如网络故障导致纠删码集合中的一半驱动器与另一半完全隔离。

Diagram of an erasure set where parity EC:M is 1/2 the set size
该部署中有两个节点因临时网络故障而离线。 客户端按 EC:8 校验设置写入对象,此时该纠删码集合的写仲裁为 K=9。 该纠删码集合已经失去写仲裁,因此 MinIO 无法将其用于写操作。

K+1 逻辑可确保客户端不会把同一个对象分别写入纠删码集合的两个“半边”,从而避免潜在的不一致。

对于仍满足读仲裁的对象,MinIO 可以使用任意数据分片或校验分片来 自愈 受损分片。

Diagram of MinIO using parity shards to heal lost data shards on a node.
一个按 EC:4 写入的对象由于驱动器故障,在 12 个数据分片中丢失了 4 个。 由于该对象仍满足读仲裁,MinIO 可以使用现有的校验分片对丢失的数据分片执行自愈。

你可以使用 MinIO 纠删码计算器,为计划中的拓扑探索可能的纠删码集合大小和分布方式。 如无特殊原因,建议使用偶数个节点和每节点偶数块驱动器,以简化拓扑规划以及驱动器和纠删码集合分布的理解。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

纠删码校验与存储效率

为部署设置校验值,本质上是在可用性与总可用存储之间做平衡。 更高的校验值会提高对驱动器或节点故障的容忍度,但会减少可用存储;更低的校验值则提供更高的可用存储,但对驱动器或节点故障的容忍度也更低。 你可以使用 MinIO 纠删码计算器,查看不同校验值对计划中集群部署的影响。

下表列出了由 1 个节点和 16 块 1TB 驱动器组成的 MinIO 部署在不同纠删码校验级别下的结果:

校验 总存储 存储比例 读操作所需最少驱动器 写操作所需最少驱动器
EC: 4 (默认) 12 Tebibytes 0.750 12 12
EC: 6 10 Tebibytes 0.625 10 10
EC: 8 8 Tebibytes 0.500 8 9

位腐化防护

Bit rot 是一种静默数据损坏,由存储介质层面的随机变化引起。 对于数据驱动器而言,它通常来自表示数据的电荷衰减或磁取向变化。 成因可以从停电时的微小电流尖峰,到导致比特翻转的随机宇宙射线。 这种“bit rot”会在不触发监控工具或硬件告警的情况下,对数据介质造成细微错误或损坏。

MinIO 对 HighwayHash algorithm 的优化实现,确保其能够在运行时捕获并自愈受损对象。 它通过在 READ 时计算哈希并在 WRITE 时进行校验,确保从应用、网络到内存或驱动器的端到端完整性。 该实现专为速度设计,在 Intel CPU 上单核即可达到超过 10 GB/sec 的哈希速度。

17.4 - 对象自愈

什么是自愈?

自愈是 MinIO 恢复受损、损坏或部分丢失对象的能力。 这类丢失或损坏可能来自多种情况,包括但不限于:

  • 驱动器级错误或故障
  • 操作系统或文件系统错误或故障
  • bit rot

自愈与纠删码

MinIO 恢复受损对象的能力,直接取决于以下因素:

  • 对象所在 纠删码集合 的驱动器总数

  • 保留对象完整分片的可用驱动器数量

  • 该纠删码集合的 校验设置

    Parity 指 MinIO 在写入对象时创建的专用恢复分片数量。 例如,一个纠删码集合可能总共有 8 块驱动器,其中 3 块用于校验。 在这种情况下,MinIO 会把对象拆分为 5 个数据分片和 3 个校验分片。 MinIO 会将这 8 个分片分布到纠删码集合中的各块驱动器上。 不会有某一块驱动器只包含校验分片或只包含数据分片。 相反,MinIO 会以随机化方式写入每个对象的分片,以便将读取均匀分散到各块驱动器上。

    当 MinIO 需要返回该对象时,它会查找对象对应的数据分片。 如果某些数据分片丢失或损坏,MinIO 会使用一个或多个校验分片来恢复对象。 如果在查找校验分片时发现某些校验分片也丢失或损坏,只要仍有足够的其他分片可供返回对象,MinIO 也会一并恢复这些校验分片。 在上述场景中,即使最多有 3 个数据分片丢失或损坏,MinIO 仍然可以成功恢复并返回该对象。

    保留对象完整数据分片或校验分片的可用驱动器数量,必须大于或等于该纠删码集合中用于数据分片的驱动器数量。 在上述场景中,至少需要 5 块保留完整分片的驱动器在线且可用,MinIO 才能成功返回该对象。

MinIO 何时对对象执行自愈?

MinIO 提供了一套健壮的对象自愈机制。

GET 请求期间自愈

每当你通过 GETHEAD 请求对象时,MinIO 都会自动检查该对象数据分片的一致性。 对于启用了版本控制的存储桶,MinIO 在 PUT 操作期间也会执行一致性检查。

如果所有数据分片都完好无损,MinIO 会直接从数据分片返回对象,而不会检查对应的校验分片。

如果对象存在丢失或损坏的数据分片,MinIO 会先使用可用的校验分片对对象执行自愈,然后再作为本次操作的一部分返回。 每个丢失或损坏的数据分片都 必须 有一个完好的校验分片可用,否则对象无法恢复。 如果某些校验分片丢失或损坏,只要仍有足够的其他校验分片可用于返回对象,MinIO 也会恢复这些校验分片。

通过对象扫描器自愈

MinIO 使用 对象扫描器 执行多项与对象相关的任务。 其中一项任务就是检查对象完整性,并在发现损坏或损毁时执行自愈。

在每一轮扫描中,MinIO 会根据对象名称的哈希值,从每 1,024 个对象中选择 1 个进行检查。

如果发现对象存在分片丢失,MinIO 会使用可用分片对对象执行自愈。 默认情况下,MinIO 不会 使用扫描器检查 bit rot 损坏。 这类操作的成本较高,而多个磁盘同时发生 bit rot 的概率较低。

通过手动请求自愈

管理员可以使用 mc admin heal 发起一次全系统自愈。 该过程会大量消耗资源,通常并非必需。

在部署上手动启动自愈流程之前,请先与 MinIO 工程师沟通。

自愈指标

MinIO 提供了若干自愈指标(英文),用于监控部署中的自愈过程状态。

有关可用 endpoint 和配置的更多信息,请参阅 指标与告警

17.5 - 对象扫描器

概览

MinIO 使用内置扫描器检查对象是否需要自愈,并执行任何已计划的对象操作。 这类操作可能包括:

扫描器在两个层级执行这些功能:集群层级和存储桶层级。 在集群层级,扫描器会将所有存储桶划分为多个组,并一次扫描其中一组。 扫描器会先处理自上次扫描以来新增的存储桶,然后再以随机顺序扫描其他存储桶。 在完成所有存储桶组的检查后,扫描器会重新开始新一轮扫描。

在存储桶层级,扫描器会对存储桶内条目分组,并从该存储桶中选择部分条目进行扫描。 扫描器会根据对象名称的哈希值来选择要扫描的对象。 在 16 轮扫描的周期内,MinIO 会检查命名空间中的每个对象。 对于自上次扫描以来确认新增的任何前缀,MinIO 会执行完整扫描。

扫描时长

影响一次扫描完成时间的因素有很多。

其中包括:

  • 提供给 MinIO 的驱动器类型
  • 可用吞吐量和 iops
  • 对象数量和大小
  • MinIO Server 上的其他活动

例如,默认情况下,MinIO 会暂停扫描器,以便将 I/O 资源让给读写请求。 这会拉长扫描完成所需的时间。

MinIO 在每次扫描之间的等待时间,会按本次扫描操作耗时乘以一个系数来计算。 默认情况下,该系数为 10.0,表示 MinIO 会在一次扫描完成后等待相当于该操作耗时 10 倍的时间,再开始下一次扫描。 这个系数会根据配置的 扫描器速度设置 发生变化。

扫描器性能

影响扫描器性能的因素有很多。 其中包括:

  • 可用节点资源
  • 集群规模
  • 纠删码集合数量相对于驱动器数量的关系
  • 存储桶层级结构的复杂度(对象和前缀)

例如,在相同硬件和工作负载条件下,一个从 100TB 数据增长到 200TB 数据的集群,扫描完整个存储桶和对象命名空间所需的时间会更长。 同样地,单个包含 16 块驱动器的纠删码集合,其扫描耗时会长于把相同数量驱动器拆分为两个 8 驱动器纠删码集合的情况。

MinIO 将扫描器视为后台任务,并会暂停它以优先完成集群中的读写请求。 随着集群规模或工作负载增长,为保证普通 S3 操作的优先级,扫描器会更频繁地让出资源,因此其性能会下降。

你可以使用 MINIO_SCANNER_SPEED 环境变量或 scanner speed 配置项, 调整 MinIO 在扫描器性能与读写操作之间的平衡方式。

扫描器指标

MinIO 提供了若干与扫描器相关的指标(英文)

使用 mc admin scanner info 可以查看扫描器当前状态,以及距离上次完整扫描所经过的时间。 这有助于理解扫描器操作提供的各项指标。

扫描器指标(包括 usage 指标)反映的是最近一次完成的扫描结果。 自上次扫描以来发生的 PUTDELETE 操作,不会在 usage 中体现,直到受影响的存储桶完成下一次扫描。

输出类似如下:

Overall Statistics
------------------
Last full scan time:   0d0h14m; Estimated 2885.28/month
Current cycle:         70464; Started: 2024-04-19 20:02:34.568479139 +0000 UTC
Active drives:         2

Last Minute Statistics
----------------------
Objects Scanned:       620 objects; Avg: 124.929µs; Rate: 892800/day
Versions Scanned:      620 versions; Avg: 2.801µs; Rate: 892800/day
Versions Heal Checked: 0 versions; Avg: 0ms
Read Metadata:         621 objects; Avg: 88.416µs, Size:
ILM checks:            656 versions; Avg: 663ns
Check Replication:     656 versions; Avg: 1.061µs
Verify Deleted:        0 folders; Avg: 0ms
Yield:                 3.086s total; Avg: 4.705ms/obj

17.6 - 阈值与限制

本页列出了适用于 MinIO 的阈值与限制。

有关相关建议和要求,请参阅 hardwaresoftware

S3 API 限制

项目

规格

最大对象大小

50 TiB

最小对象大小

0 B

单次 PUT 操作的最大对象大小

非 multipart upload 为 5 TiB
multipart upload 为 50 TiB

每次上传的最大分片数

10,000

分片大小范围

5 MiB 到 5 GiB。最后一个分片可为 0 B 到 5 GiB

每次 list parts 请求返回的最大分片数

10,000

每次 list objects 请求返回的最大对象数

1,000

每次 list multipart uploads 请求返回的最大 multipart upload 数

1,000

存储桶名称最大长度

63

对象名称最大长度

1024

对象名称中每个以 / 分隔段的最大长度

255

单个唯一对象允许的最大版本数

10000(可配置)

纠删码限制

项目 规格
每个集群的最大服务器数 无限制
最小服务器数 1
当服务器数为 1 时,每台服务器的最少驱动器数 1(适用于 SNSD 部署,此类部署不提供额外可靠性或可用性)
当服务器数为 2 或更多时,每台服务器的最少驱动器数 1
每台服务器的最大驱动器数 无限制
读仲裁 N/2N/2
写仲裁 (N/2)+1(N/2)+1

对象名称限制

文件系统和操作系统限制

MinIO 中的对象名称主要受本地操作系统和文件系统限制。 Windows 和某些其他操作系统会限制包含特定特殊字符的文件系统名称,例如 ^*|\/&";

此列表并不完整,也不一定适用于你的操作系统和文件系统组合。

在类 Unix 操作系统上,路径名为 .../ 的对象会返回 file access denied 错误。

请查阅你的操作系统供应商或文件系统文档,以获得适用于当前环境的完整列表。

MinIO 建议生产工作负载使用基于 XFS 文件系统的 Linux 操作系统。

冲突对象

应用必须为所有对象分配不冲突的唯一键。 这包括避免创建与父对象或同级对象名称发生冲突的对象。 当名称发生冲突时,MinIO 在该位置的 LIST 操作会返回空结果集。

例如,以下操作会创建命名空间冲突:

PUT data/invoices/2024/january/vendors.csv
PUT data/invoices/2024/january <- collides with existing object prefix
PUT data/invoices/2024/january
PUT data/invoices/2024/january/vendors.csv <- collides with existing object

虽然你仍然可以对这些对象执行 GET 或 HEAD 操作,但名称冲突会导致在 /invoices/2024/january 路径上的 LIST 操作返回空结果集。

18 - 扩展分布式 Silo 部署

Silo 支持通过添加新的服务器池扩展现有分布式部署。每个 pool 都会增加集群的总可用存储容量。

扩容并不能提供 Business Continuity/Disaster Recovery (BC/DR) 级别的保护。 虽然每个 pool 都是一组相互独立的服务器,并通过各自的 纠删码集合 提供可用性,但只要其中一个 pool 完全丢失,MinIO 就会停止该部署中所有 pool 的 I/O。 同样地,只要某个 pool 中的某个纠删码集合失去 quorum,该集合中存储的对象就会发生数据丢失,而不受其他纠删码集合或 pool 数量的影响。

新的 服务器池 不必 与现有任一 服务器池 使用相同类型或规格的硬件和软件配置,不过保持一致通常有助于简化集群管理,并让各 pool 间的性能表现更可预测。 新 pool 内的所有驱动器 应当 保持相同类型和容量。 有关如何选择合适配置的完整建议,请参阅 MinIO 的 硬件建议

若要为单 pool 或多 pool 的 MinIO 部署提供 BC/DR 级别的故障切换与恢复支持,请使用 站点复制

本页步骤用于为现有 分布式 MinIO 部署增加一个额外的 服务器池。

警告

重要

MinIO 不支持扩展 单机单盘 拓扑。

前提条件

网络与防火墙

部署中的每个节点都应当与其他所有节点具备完整的双向网络访问能力。 对于容器化或编排式基础设施,这可能需要针对 Ingress、负载均衡器等网络和路由组件进行专门配置。 某些操作系统还可能需要设置防火墙规则。 例如,以下命令会在使用 firewalld 的服务器上显式开放 MinIO server 默认 API 端口 9000

firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload

部署中的所有 MinIO server 必须 使用相同的监听端口。

如果你为 MinIO Console 设置了静态端口(例如 :9001), 则还必须允许外部客户端访问该端口,以确保连接可用。

MinIO 强烈建议 使用负载均衡器管理到集群的连接。 由于部署中的任意 MinIO 节点都可以接收、转发或处理客户端请求,因此负载均衡器应采用 “Least Connections” 算法将请求路由到 MinIO 部署。

以下负载均衡器已知可与 MinIO 良好配合:

如何配置防火墙或负载均衡器以支持 MinIO 不在本步骤范围内。 为 MinIO Server 配置 NGINX 代理 参考页提供了一个将 NGINX 作为反向代理并启用基础负载均衡的基线配置。

连续主机名

MinIO 在创建 服务器池 时,要求 使用扩展表示法 {x...y} 来表示一组连续的 MinIO 主机。 因此,MinIO 要求 使用连续编号的主机名来表示 pool 中的每个 minio server 进程。

在开始本步骤之前,请先创建所需的 DNS 主机名映射。 例如,以下主机名可用于一个 4 节点分布式 服务器池:

  • minio5.example.com
  • minio6.example.com
  • minio7.example.com
  • minio8.example.com

你可以使用扩展表示法 minio{5...8}.example.com 来指定完整的主机名范围。

如何配置 DNS 以支持 MinIO 不在本步骤范围内。

存储要求

以下要求概括了 MinIO 硬件建议中的 存储 一节:

使用本地存储

直连存储(DAS)相比网络存储 (NASSANNFS)在性能和一致性方面具有显著优势。 对于主数据或“热”数据,MinIO 强烈建议使用闪存存储(NVMe、SSD)。

磁盘使用 XFS 格式

MinIO 强烈建议为存储配置使用 XFS 格式化的磁盘。 MinIO 在内部测试和验证套件中使用 XFS,因此对其在各种规模下的性能和行为更有信心。

对于 EXT4、BTRFS 或 ZFS 等其他文件系统,MinIO 既不 测试,也不推荐。

使用一致的磁盘类型

MinIO 不区分磁盘类型,也无法从混合存储类型中获益。 每个 pool 都必须使用相同类型的磁盘(NVMe、SSD)

例如,部署一个仅由 NVMe 磁盘组成的 pool。 如果你在其中混用 SSD 或 HDD,MinIO 会将这些磁盘与 NVMe 磁盘一视同仁。 这可能导致性能问题,因为某些磁盘的读写特性不同或更差,无法以与 NVMe 磁盘相同 的速率响应。

使用一致的磁盘容量

MinIO 会将每块磁盘的可用容量限制为 pool 中最小磁盘的容量。

例如,部署一个由相同数量、容量均为 7.68TiB 的 NVMe 磁盘组成的 pool。 如果其中有一块磁盘容量为 3.84TiB,MinIO 会将 pool 中所有磁盘都视为只有 该较小容量。

配置顺序编号的磁盘挂载

MinIO 在创建新的 服务器池 时使用 Go 扩展表示法 {x...y} 表示顺序连续的 磁盘序列,其中 服务器池 中所有节点都挂载了完全相同的一组磁盘。 最好将磁盘挂载路径也配置成顺序序列,以便支持这种表示法。 例如,可按 /mnt/drive-n 的模式挂载磁盘,其中 n1 开始,并随每块 磁盘按 1 递增。

在重启后保持磁盘挂载与映射一致

使用 /etc/fstab 确保节点重启前后磁盘到挂载点的映射保持一致。

非 Linux 操作系统应使用等效的磁盘挂载管理工具。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

满足纠删码校验的最小驱动器数量

MinIO 要求每个 pool 都满足部署的 纠删码 设置。 具体来说,新 pool 的拓扑必须为每个 纠删码集合 提供至少 2 x EC:N 个驱动器,其中 EC:N 是该部署的 Standard 校验存储类。 这一要求可确保新的 服务器池 满足该部署预期的 SLA

你可以使用 MinIO Erasure Code Calculator 检查新 pool 的 Erasure Code Stripe Size (K+M)。 如果列出的最大值至少为 2 x EC:N,则该 pool 支持部署当前的纠删码校验设置。

时间同步

多节点系统必须保持时间和日期同步,才能维持稳定的节点间操作与交互。 请确保所有节点都定期同步到同一时间服务器。 不同操作系统可采用不同方式同步时间和日期,例如 ntptimedatectltimesyncd

请查阅所用操作系统的文档,了解如何在各节点之间建立并维护准确且一致的系统时钟。

先备份集群设置

在开始扩容前,使用 mc admin cluster bucket exportmc admin cluster iam export 命令分别为存储桶元数据和 IAM 配置创建快照。 必要时,你可以使用这些快照恢复 存储桶IAM 设置,以从用户错误或流程错误中恢复。

注意事项

写入文件

MinIO 不会自动在新的 服务器池 之间重新平衡对象。 相反,MinIO 会根据某个 pool 的空闲空间占所有可用 pool 总空闲空间的比例,将新的写入操作分配到空闲空间最多的 pool。

用于计算某个 pool 被选中执行写操作概率的公式如下:

FreeSpaceOnPoolA/FreeSpaceOnAllPoolsFreeSpaceOnPoolA / FreeSpaceOnAllPools

假设有一个由三个 pool 组成的部署,总空闲空间为 10 TiB,分布如下:

  • Pool A 有 3 TiB 空闲空间
  • Pool B 有 2 TiB 空闲空间
  • Pool C 有 5 TiB 空闲空间

MinIO 计算各 pool 被用于写入操作的概率如下:

  • Pool A:30% (3TiB/10TiB3TiB / 10TiB)
  • Pool B:20% (2TiB/10TiB2TiB / 10TiB)
  • Pool C:50% (5TiB/10TiB5TiB / 10TiB)

除空闲空间计算外,如果某次写入(含校验)会导致驱动器使用率超过 99%,或已知剩余 inode 数量低于 1000,MinIO 也不会写入该 pool。

如有需要,你可以使用 mc admin rebalance 手动启动重平衡过程。 有关重平衡工作方式的更多信息,请参阅 跨部署管理对象

同样地,MinIO 不会向正在退役中的 pool 执行写入。

扩容是无中断的

新增 服务器池 需要在大致同一时间重启部署中的 所有 MinIO server 进程。

MinIO 强烈建议同时重启一个部署中的所有 MinIO 服务端进程。 MinIO 操作具有原子性并保持严格一致。 因此,该重启过程不会中断应用或正在进行的操作。

不要 执行“滚动”重启(例如一次只重启一个节点)。

基于容量的规划

MinIO 建议预先规划足以存放 至少 2 年数据的存储容量,并在使用率达到 70% 之前完成准备。 如果过于频繁地执行 服务器池 扩容,或按“just-in-time”方式扩容,通常意味着架构或规划存在问题。

例如,假设某套应用每年预计至少产生 100 TiB 数据,并计划在 3 年后再扩容。 初始 服务器池 为该部署提供了约 500 TiB 的可用存储,使集群能够在安全满足 70% 阈值的同时,为数据增长保留一定缓冲。 理想情况下,新 服务器池 至少 也应提供 500 TiB 的额外存储,以便在下次扩容前维持类似的生命周期。

由于 MinIO 纠删码 需要预留部分存储用于校验,因此总 原始 存储容量必须高于计划中的 可用 容量。 建议使用 MinIO 纠删码计算器,围绕具体纠删码设置进行容量规划。

推荐的操作系统

本教程默认所有运行 MinIO 的主机都使用 推荐的 Linux 操作系统

部署中的所有主机都应采用一致的 软件配置

扩展分布式 MinIO 部署

以下步骤将向现有 MinIO 部署中添加一个 服务器池。 每个 Pool 都会在保持集群整体 可用性 的同时,扩展集群的总可用存储容量。

以下所有命令都使用示例值。 请将这些值替换为适用于你部署的实际值。

开始本步骤前,请先阅读 前提条件

退役旧硬件 pool 之前,请先完成所有计划中的硬件扩容。

1) 在新服务器池的每个节点上安装 Silo 二进制

安装与现有 pool 完全相同的公开 Silo 版本。从下载与安装获取 x86-64 或 ARM64 的 RPM、DEB 或独立归档,并在安装前校验摘要。当前 Silo 发布只提供这两种 Linux 架构,因此已删除继承文档中指向未发布 ppc64les390x 制品的说明。

sudo dnf install ./minio-*.rpm
sudo dpkg -i ./minio_*_amd64.deb

ARM64 主机请使用名称中带 arm64 的软件包。

tar -xzf minio_*_linux_*.tar.gz
sudo install -m 0755 ./minio /usr/local/bin/minio
minio --version

在每个新节点运行 minio --version 并与现有 pool 比对;不要把版本不同的节点加入集群。需要升级时,请遵循systemctl 管理的 Silo 升级流程

2) 添加 TLS/SSL 证书

当 MinIO 检测到 ${HOME}/.minio/certs 目录中存在有效的 x.509 证书 (.crt)和私钥(.key)时,会自动启用 传输层安全(TLS) 1.2+。

对于由 systemd 管理的部署,请使用运行 MinIO server 进程的用户对应的 $HOME 目录。提供的 minio.service 文件会以 minio-user 身份运行 该进程。前一步已经包含了如何创建该用户及其主目录 /home/minio-user 的说明。

  • 在每个主机上将 TLS 证书放置到 /home/minio-user/.minio/certs 中。
  • 如果 任何 MinIO server 或客户端使用了由未知证书颁发机构签名的证书 (自签或内部 CA),你 必须 将 CA 证书放到该部署中所有 MinIO 主机的 /home/minio-user/.minio/certs/CAs 下。MinIO 会拒绝无效证书 (不受信任、已过期或格式错误)。

如果 minio.service 文件指定了其他用户账户,请改用该账户对应的 $HOME 目录。或者,也可以通过 minio server --certs-dir 命令行参数指定 自定义证书目录。修改 /etc/default/minio 中的 MINIO_OPTS 变量即可设置 此选项。运行 MinIO server 进程的 systemd 用户 必须 对指定目录具有读取和 列目录权限。

有关为 MinIO 配置 TLS 的更具体指导,包括通过 Server Name Indication (SNI) 支持多域名,请参见 网络加密(TLS)。你也可以跳过这一步,以不启用 TLS 的方式 部署。除了早期开发阶段以外,MinIO 强烈 不建议 使用非 TLS 部署。

3) 创建 systemd 服务文件

.deb.rpm 软件包会将以下 systemd 服务文件 安装到 /usr/lib/systemd/system/minio.service。 对于二进制安装方式,请在所有 MinIO 主机上手动创建该文件。

说明

说明

systemd 会先检查 /etc/systemd/... 路径,再检查 /usr/lib/systemd/... 路径, 并使用它找到的第一个文件。 为避免配置冲突或意外选项,请确认该文件仅存在于 /usr/lib/systemd/system/minio.service 路径下。

关于文件路径搜索顺序的详细信息,请参阅 systemd.unit 的 man page

[Unit]
Description=MinIO
Documentation=https://silo.pgsty.com/zh/docs/
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
Type=notify

WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Turn-off memory accounting by systemd, which is buggy.
MemoryAccounting=no

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity

# Disable killing of MinIO by the kernel's OOM killer
OOMScoreAdjust=-1000

SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

The minio.service file runs as the minio-user User and Group by default. You can create the user and group using the groupadd and useradd commands. The following example creates the user, group, and sets permissions to access the folder paths intended for use by MinIO. These commands typically require root (sudo) permissions.

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4

The specified drive paths are provided as an example. Change them to match the path to those drives intended for use by MinIO.

Alternatively, change the User and Group values to another user and group on the system host with the necessary access and permissions.

MinIO publishes additional startup script examples on github.com/minio/minio-service.

To update deployments managed using systemctl, see 升级由 systemctl 管理的 MinIO 部署.

4) 创建服务环境文件

/etc/default/minio 创建环境文件。 MinIO 服务会将该文件作为 MinIO 以及 minio.service 文件所用全部 环境变量 的来源。

以下示例假设:

  • 该部署当前只有一个 服务器池,由四台使用连续主机名的 MinIO server 主机构成。

    minio1.example.com   minio3.example.com
    minio2.example.com   minio4.example.com

    每台主机都有 4 块本地直连驱动器,挂载点连续:

    /mnt/disk1/minio   /mnt/disk3/minio
    /mnt/disk2/minio   /mnt/disk4/minio
  • 新的 服务器池 由八台使用连续主机名的新 MinIO 主机构成:

    minio5.example.com   minio9.example.com
    minio6.example.com   minio10.example.com
    minio7.example.com   minio11.example.com
    minio8.example.com   minio12.example.com
  • 所有主机都具有八块本地直连驱动器,挂载点连续:

    /mnt/disk1/minio  /mnt/disk5/minio
    /mnt/disk2/minio  /mnt/disk6/minio
    /mnt/disk3/minio  /mnt/disk7/minio
    /mnt/disk4/minio  /mnt/disk8/minio
  • 该部署有一个运行在 https://minio.example.net 的负载均衡器,用于管理到所有 MinIO 主机的连接。 在此步骤中,负载均衡器不应将请求路由到新主机,但应已准备好所需的配置更新计划。

请根据你的部署拓扑修改示例:

# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example starts the MinIO server with two 服务器池s.
#
# The space delimiter indicates a seperate 服务器池
#
# The second set of hostnames and volumes is the newly added pool.
# The pool has sufficient stripe size to meet the existing erasure code
# parity of the deployment (2 x EC:4)
#
# The command includes the port on which the MinIO servers listen for each
# 服务器池.

MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio{5...12}.example.net:9000/mnt/disk{1...8}/minio"

# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.

MINIO_OPTS="--console-address :9001"

# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

你可以根据部署需要指定其他 环境变量 或 server 命令行选项。 部署中的所有 MinIO 节点都应包含相同且取值一致的环境变量。

5) 使用扩展后的配置重启 MinIO 部署

在部署中的每个节点上 同时 执行以下命令,以重启 MinIO 服务:

sudo systemctl restart minio.service

Use the following commands to confirm the service is online and functional:

sudo systemctl status minio.service
journalctl -f -u minio.service

MinIO may log an increased number of non-critical warnings while the server processes connect and synchronize. These warnings are typically transient and should resolve as the deployment comes online.

MinIO 强烈建议同时重启一个部署中的所有 MinIO 服务端进程。 MinIO 操作具有原子性并保持严格一致。 因此,该重启过程不会中断应用或正在进行的操作。

不要 执行“滚动”重启(例如一次只重启一个节点)。

6) 后续步骤

  • 更新所有负载均衡器、反向代理或其他网络控制平面,使客户端请求能够路由到 MinIO 分布式部署中的新主机。 虽然 MinIO 会在内部自动管理路由,但由控制平面处理初始连接通常可以减少网络跳数并提升效率。
  • 查看 MinIO Console,确认更新后的集群拓扑并监控性能。

19 - 修改 Silo Tenant

部署完成后,你可以修改租户以调整可变配置项。 有关 MinIO Custom Resource Definition 中可用设置的完整说明,请参阅 MinIO 自定义资源定义

修改租户的方法取决于你最初如何部署该租户:

对于使用 Kustomize 部署的租户,你可以修改基础 Kustomization 资源,并在包含 kustomization.yaml 的目录上运行 kubectl apply -k 进行应用。

kubectl apply -k ~/kustomization/TENANT-NAME/

请根据本地配置修改 Kustomization 目录路径。

对于使用 Helm 部署的租户,你可以修改基础 values.yaml,并通过 chart 升级租户:

helm upgrade TENANT-NAME minio-operator/tenant -f values.yaml -n TENANT-NAMESPACE

上述命令默认使用的是 MinIO Operator Chart 仓库。 如果你是手动安装 Chart,或使用了不同的仓库名称,请在命令中指定相应的 chart 或名称。

分别将 TENANT-NAMETENANT-NAMESPACE 替换为租户的名称和命名空间。 你可以使用 helm list -n TENANT-NAMESPACE 验证租户名称。

添加受信任的证书颁发机构

MinIO 租户会使用主机系统的受信任根证书存储,校验每个连接客户端提供的 TLS 证书。 MinIO Operator 可以为租户挂载额外的第三方 Certificate Authorities (CA),以便校验由这些 CA 签发的客户端 TLS 证书。

若要自定义挂载到每个租户 MinIO pod 的受信任 CA,请启用 Custom Certificates 开关。 点击 Add CA Certificate + 按钮即可添加第三方 CA 证书。

如果 MinIO 租户无法在容器操作系统的信任库 显式挂载的 CA 中匹配到传入客户端 TLS 证书的签发者,MinIO 会将该连接视为无效并拒绝。

管理租户 Pool

指定 Runtime Class

说明

新增: Console

0.23.1

在为租户添加新 pool 或修改现有 pool 时,你可以为这些 pool 指定 Runtime Class Name

退役租户 服务器池

MinIO Operator 4.4.13 及更高版本支持退役租户中的 服务器池。 具体而言,你可以遵循 Decommission a Server pool 步骤先从租户中移除该 pool,然后编辑租户 YAML,将该 pool 从 StatefulSet 中移除。 移除租户 pool 时,请确保所有剩余 pool 的 spec.pools.[n].name 字段都具有明确取值。

说明

先下线再新增时保持 pool 顺序

如果你在多 pool 部署中下线了一个 pool,就不能在新 pool 中复用相同的节点编号序列。 例如,假设某个部署包含以下几个 pool:

https://minio-{1...4}.example.net/mnt/drive-{1...4}
https://minio-{5...8}.example.net/mnt/drive-{1...4}
https://minio-{9...12}.example.net/mnt/drive-{1...4}

如果你下线了 minio-{5...8} 这个 pool,就不能再用相同的节点编号新增一个 pool。你必须将新 pool 添加在 minio-{9...12} 之后

https://minio-{1...4}.example.net/mnt/drive-{1...4}
https://minio-{9...12}.example.net/mnt/drive-{1...4}
https://minio-{13...16}.example.net/mnt/drive-{1...4}

20 - 以容器方式部署 Silo

本页说明如何在支持容器化进程的操作系统上以容器方式部署 Silo。

本文档假定已安装 Docker、Podman 或其他支持标准容器镜像格式的类似 runtime。已发布的 pgsty/minio 发行镜像使用 Red Hat Universal Base Image 9 Micro

Silo 容器的功能和性能可能会受到基础操作系统的限制。

本步骤包含对 单机多盘 (SNMD) 和 单机单盘 (SNSD) 拓扑的指导,适用于早期开发和评估环境。

警告

重要

下面的示例仅覆盖用于开发或评估的单机单盘和单机多盘部署;它们不构成 Docker Compose、Docker Swarm 或其他容器编排器上的生产级多机多盘拓扑或升级契约。生产环境的分布式部署应使用经过验证的 Kubernetes Tenant 流程,并针对实际环境验证持久化、网络、故障域与升级。

为便于阅读,示例使用 pgsty/minio:latest。生产环境必须固定经过测试的 Silo 发行标签或镜像摘要;latest 不是版本契约。

MINIO_UPDATE=off 用于刻意禁用服务端原地更新。当前更新器仍保留上游 MinIO 发布源与签名密钥,因此容器应通过替换为经验证的 Silo 标签或摘要升级,不要运行 mc admin update

注意事项

检查清单

在执行本步骤前,请先阅读我们发布的硬件、软件和安全检查清单。

纠删码校验

Silo 会根据拓扑中的节点和驱动器总数,自动为集群确定默认的 纠删码 配置。你可以在设置集群时配置按对象生效的 parity,也可以让 Silo 选择默认值(生产级集群默认为 EC:4)。

校验值决定了对象可用性与磁盘存储占用之间的关系。可使用上游 MinIO 纠删码计算器 比较校验级别,但应将它视为上游规划工具,而不是 Silo 支持契约。

虽然你可以随时更改纠删码校验设置,但以既有校验值写入的对象 不会 自动更新为新的校验设置。

容器存储

本步骤假定你会将一个或多个专用存储设备挂载到容器中,作为 Silo 的持久化存储。

存储在容器临时路径上的数据会在容器重启或删除时丢失。 使用此类路径的风险需自行承担。

步骤

  1. 启动容器

本步骤提供 Podman 和 Docker 在 rootfull 模式下的说明。 对于 rootless 部署,请参考各 runtime 自身的文档完成配置和容器启动。

对于其他容器 runtime,请参阅对应文档,并使用等效的选项、参数或配置。

以下命令会先在你的主目录中创建一个文件夹,然后使用 Podman 启动 Silo 容器:

mkdir -p ~/silo/data

podman run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name silo \
   -v ~/silo/data:/data \
   -e "MINIO_UPDATE=off" \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   pgsty/minio:latest server /data --console-address ":9001"

该命令分别将端口 90009001 绑定到 S3 API 和 Web Console。

本地驱动器 ~/silo/data 会挂载到容器内的 /data 目录。你可以按需修改 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 变量,以变更 root 登录信息。

对于多驱动器部署,请将每个本地驱动器或其所在文件夹绑定到容器中按顺序编号的路径。 然后修改 minio server 启动命令以指定这些路径:

mkdir -p ~/minio/data-{1..4}

podman run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name silo \
   -v /mnt/drive-1:/mnt/drive-1 \
   -v /mnt/drive-2:/mnt/drive-2 \
   -v /mnt/drive-3:/mnt/drive-3 \
   -v /mnt/drive-4:/mnt/drive-4 \
   -e "MINIO_UPDATE=off" \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   pgsty/minio:latest server /mnt/drive-{1...4} --console-address ":9001"

对于 Windows 主机,请使用 Windows 文件系统语义指定本地文件夹路径,例如 C:\minio\:/data

以下命令会先在你的主目录中创建一个文件夹,然后使用 Docker 启动 Silo 容器:

mkdir -p ~/silo/data

docker run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name silo \
   -v ~/silo/data:/data \
   -e "MINIO_UPDATE=off" \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   pgsty/minio:latest server /data --console-address ":9001"

该命令分别将端口 90009001 绑定到 S3 API 和 Web Console。

本地驱动器 ~/silo/data 会挂载到容器内的 /data 目录。你可以按需修改 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 变量,以变更 root 登录信息。

对于多驱动器部署,请将每个本地驱动器或其所在文件夹绑定到容器中按顺序编号的路径。 然后修改 minio server 启动命令以指定这些路径:

mkdir -p ~/minio/data-{1..4}

docker run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name silo \
   -v /mnt/drive-1:/mnt/drive-1 \
   -v /mnt/drive-2:/mnt/drive-2 \
   -v /mnt/drive-3:/mnt/drive-3 \
   -v /mnt/drive-4:/mnt/drive-4 \
   -e "MINIO_UPDATE=off" \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   pgsty/minio:latest server /mnt/drive-{1...4} --console-address ":9001"

对于 Windows 主机,请使用 Windows 文件系统语义指定本地文件夹路径,例如 C:\minio\:/data

2. 连接到部署

在浏览器中打开 http://localhost:9001 以访问 Silo Console 登录页。

使用上一步中的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 进行登录。

MinIO Console 登录页

你可以使用内嵌 Console 执行常规管理任务,例如身份与访问管理、指标和日志监控,或 Server 配置。

请按照 Silo 客户端安装说明 安装 mcli,并运行 mcli --version 验证。已发布的独立归档与 Linux 软件包安装 mcli;源码构建和客户端容器则保留 mc 可执行文件名。

安装完成后,为该 Silo 部署创建一个别名:

mcli alias set silo http://localhost:9000 USERNAME PASSWORD

请根据你的部署修改主机名、用户名和密码。

21 - 监控与告警

指标与告警

MinIO 使用 Prometheus 数据模型 发布时点指标。 你可以使用任何支持该数据模型的抓取工具,将这些指标拉取到数据库中,以生成历史视图、执行指标查询与分析,或基于关注的数据点创建告警。

下表列出了将 MinIO 指标接入部分第三方监控软件的教程。

使用 Prometheus 进行监控与告警

配置 Prometheus,对 MinIO 部署进行监控与告警

使用 InfluxDB 进行监控与告警

配置 InfluxDB,对 MinIO 部署进行监控与告警。

其他支持 Prometheus 数据模型的指标与分析软件套件,即使未出现在上表中,也可能同样可用。

日志

MinIO 会将所有 minio server 操作输出到系统控制台。 MinIO 还支持将服务日志和审计日志发布到 HTTP Webhook。

  • 服务日志 包含与系统控制台中相同的 minio server 操作日志。 服务日志适用于常规监控与运维排障。
  • 审计日志 会以更细粒度描述 MinIO 部署上的每一次操作。 审计日志适用于需要对操作进行详细追踪的安全标准与合规要求。

MinIO 会将日志作为 JSON 文档,通过 PUT 请求发送到每个已配置的端点。 端点服务器负责处理这些 JSON 文档。 MinIO 要求显式配置每个 Webhook 端点,默认情况下 不会 向 Webhook 发布日志。

更完整的文档请参见 将服务日志或审计日志发布到外部服务

健康检查

MinIO 提供无需身份验证的端点,用于探测节点在线状态以及集群 高可用性,从而执行简单健康检查。 这些端点只返回 HTTP 状态码。 更多信息请参见 健康检查 API

21.1 - 使用 Prometheus 进行监控与告警

MinIO 使用 Prometheus 数据模型 发布集群、节点、存储桶和资源指标。 本页过程说明了以下内容:

  • 配置 Prometheus 服务,抓取并展示 MinIO 部署的指标
  • 基于某个 MinIO 指标配置 Alert Rule,以触发 AlertManager 动作

本文说明使用 version 2 指标。 关于指标 API 版本的更多信息,请参见 指标与告警

说明

前提条件

此过程要求满足以下条件:

配置 Prometheus 收集 MinIO 指标并触发告警

1) 生成抓取配置

使用 mc admin prometheus generate 命令生成 Prometheus 执行抓取请求所需的 scrape 配置:

以下命令用于抓取 MinIO 集群的指标。

mc admin prometheus generate ALIAS

ALIAS 替换为该 MinIO 部署的 alias

该命令将返回类似如下的输出:

global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/cluster
     scheme: https
     static_configs:
     - targets: [minio.example.net]

以下命令用于抓取 MinIO Server 上某个节点的指标。

mc admin prometheus generate ALIAS node

ALIAS 替换为该 MinIO 部署的 alias

global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job-node
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/node
     scheme: https
     static_configs:
     - targets: [minio-1.example.net, minio-2.example.net, minio-N.example.net]

以下命令用于抓取 MinIO Server 上存储桶的指标。

mc admin prometheus generate ALIAS bucket

ALIAS 替换为该 MinIO 部署的 alias

global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job-bucket
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/bucket
     scheme: https
     static_configs:
     - targets: [minio.example.net]
说明

新增: RELEASE.2023-10-07T15-07-38Z

以下命令用于抓取 MinIO Server 上资源的指标。

mc admin prometheus generate ALIAS resource

ALIAS 替换为该 MinIO 部署的 alias

global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job-resource
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/resource
     scheme: https
     static_configs:
     - targets: [minio.example.net]
  • 设置合适的 scrape_interval,确保每次抓取操作都能在下一次开始前完成。 推荐值为 60 秒。

    某些部署由于需要抓取的指标数量较多,可能需要更长的抓取间隔。 为降低 MinIO 和 Prometheus Server 的负载,请选择满足监控要求的最长间隔。

  • job_name 设置为与该 MinIO 部署相关的值。

    请使用唯一值,以确保该部署的指标与同一 Prometheus 服务采集的其他指标彼此隔离。

  • 对于以 MINIO_PROMETHEUS_AUTH_TYPE 设置为 "public" 启动的 MinIO 部署,可以省略 bearer_token 字段。

  • 对于未使用 TLS 的 MinIO 部署,请将 scheme 设置为 http

  • targets 数组中设置能够解析到 MinIO 部署的主机名。

    这可以是任意单个节点,也可以是负责处理与 MinIO 节点连接的负载均衡器或代理。

    对于 Kubernetes 基础设施上的 MinIO Tenant,如果使用的是同一集群中的 Prometheus 集群,则可以指定 minio service 的 DNS 名称。 否则,你可以指定已配置为向 MinIO Tenant 路由连接的 ingress 或 load balancer 端点。

2) 使用更新后的配置重启 Prometheus

将上一步生成的目标 scrape_configs job 追加到配置文件中:

集群指标会聚合节点级指标,并在适用时为指标附加来源节点的标签。

global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/cluster
     scheme: https
     static_configs:
     - targets: [minio.example.net]

节点指标专用于节点级监控。该配置需要列出所有 MinIO 节点。

global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job-node
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/node
     scheme: https
     static_configs:
     - targets: [minio-1.example.net, minio-2.example.net, minio-N.example.net]
global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job-bucket
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/bucket
     scheme: https
     static_configs:
     - targets: [minio.example.net]
global:
   scrape_interval: 60s

scrape_configs:
   - job_name: minio-job-resource
     bearer_token: TOKEN
     metrics_path: /minio/v2/metrics/resource
     scheme: https
     static_configs:
     - targets: [minio.example.net]

使用该配置文件启动 Prometheus 集群:

prometheus --config.file=prometheus.yaml

3) 分析已采集指标

Prometheus 内置 expression browser。 你可以在其中执行查询,以分析已采集的指标。

以下查询示例会返回抓取任务名为 minio-job 的 Prometheus 每五分钟采集一次的指标:

minio_node_drive_free_bytes{job="minio-job"}[5m]
minio_node_drive_free_inodes{job="minio-job"}[5m]

minio_node_drive_latency_us{job="minio-job"}[5m]

minio_node_drive_offline_total{job="minio-job"}[5m]
minio_node_drive_online_total{job="minio-job"}[5m]

minio_node_drive_total{job="minio-job"}[5m]

minio_node_drive_total_bytes{job="minio-job"}[5m]
minio_node_drive_used_bytes{job="minio-job"}[5m]

minio_node_drive_errors_timeout{job="minio-job"}[5m]
minio_node_drive_errors_availability{job="minio-job"}[5m]

minio_node_drive_io_waiting{job="minio-job"}[5m]

MinIO 建议将以下指标作为基础监控项。

所有可用指标的信息请参见 指标与告警

指标 说明
minio_node_drive_free_bytes 驱动器上的总可用存储空间。
minio_node_drive_free_inodes 总空闲 inode 数量。
minio_node_drive_latency_us 最近一分钟内驱动器 API 存储操作的平均延迟,单位为 µs。
minio_node_drive_offline_total 该节点中离线驱动器的总数。
minio_node_drive_online_total 该节点中在线驱动器的总数。
minio_node_drive_total 该节点中的驱动器总数。
minio_node_drive_total_bytes 驱动器上的总存储空间。
minio_node_drive_used_bytes 驱动器上已使用的存储空间总量。
minio_node_drive_errors_timeout 自 server 启动以来驱动器超时错误的总数。
minio_node_drive_errors_availability 自 server 启动以来驱动器 I/O 错误、权限拒绝和超时的总数。
minio_node_drive_io_waiting 驱动器上等待中的 I/O 操作总数。

4) 使用 MinIO 指标配置告警规则

你必须在 Prometheus 部署上配置 Alert Rules,以根据已采集的 MinIO 指标触发告警。

以下示例告警规则文件为 MinIO 部署提供了一组基础告警。 你可以修改这些示例,或将其作为构建自定义告警的参考。

groups:
- name: minio-alerts
  rules:
  - alert: NodesOffline
    expr: avg_over_time(minio_cluster_nodes_offline_total{job="minio-job"}[5m]) > 0
    for: 10m
    labels:
      severity: warn
    annotations:
      summary: "Node down in MinIO deployment"
      description: "Node(s) in cluster {{ $labels.instance }} offline for more than 5 minutes"

  - alert: DisksOffline
    expr: avg_over_time(minio_cluster_drive_offline_total{job="minio-job"}[5m]) > 0
    for: 10m
    labels:
      severity: warn
    annotations:
      summary: "Disks down in MinIO deployment"
      description: "Disks(s) in cluster {{ $labels.instance }} offline for more than 5 minutes"

在 Prometheus 配置中,请在 rule_files 键中指定告警文件路径:

rule_files:
- minio-alerting.yml

一旦触发,Prometheus 会将告警发送到已配置的 AlertManager 服务。

仪表板

MinIO 提供 Grafana 仪表板,用于展示由 Prometheus 采集的指标。 更多信息请参见 使用 Grafana 监控 MinIO Server

21.2 - 指标与告警

MinIO 使用 Prometheus 数据模型 发布指标。 你可以使用任意抓取工具从 MinIO 拉取指标数据,以执行进一步分析和配置告警。

从 MinIO 服务端 RELEASE.2024-07-15T19-02-30Z 与 MinIO 客户端 RELEASE.2024-07-11T18-01-28Z 开始,metrics version 3 提供了更多端点。 对于新部署,MinIO 建议使用 version 3。

说明

Metrics version 2

现有部署可以继续使用 version 2 指标Grafana 仪表板

Version 3 端点

对于 metrics version 3,所有指标都位于基础端点 /minio/metrics/v3 之下。 你可以抓取该基础端点以一次性收集全部指标,也可以追加可选路径,仅返回特定类别的指标。

警告

重要

本页中的 V3 指标说明可能存在缺漏、不准确或错误信息。 如需最准确的指标定义,请参考 minio/minio 仓库并审阅源代码。

例如,以下端点会返回 audit 指标:

http://HOSTNAME:PORT/minio/metrics/v3/audit

HOSTNAME:PORT 替换为 MinIO 部署的 FQDN 与端口。 对于使用负载均衡器管理 MinIO 节点间连接的部署,请指定负载均衡器地址。

默认情况下,MinIO 要求在抓取指标端点时进行身份验证。 如需生成所需的 bearer token,请使用 mc admin prometheus generate。 你也可以将 MINIO_PROMETHEUS_AUTH_TYPE 设置为 public,以禁用指标端点认证。

相对于基础 URL,MinIO 提供以下抓取端点:

类别

路径

API

/api/requests

/bucket/api

审计

/audit

集群

/cluster/config

/cluster/erasure-set

/cluster/health

/cluster/iam

/cluster/usage/buckets

/cluster/usage/objects

调试

/debug/go

ILM

/ilm

日志 Webhook

/logger/webhook

通知

/notification

复制

/replication

/bucket/replication

扫描器

/scanner

系统

/system/drive

/system/memory

/system/cpu

/system/network/internode

/system/process

各端点对应的完整指标列表,请参见 Available version 3 metrics

如需在 MinIO Console 中启用历史数据可视化,请在 MinIO 部署的每个节点上设置以下环境变量:

可用的 version 3 指标

MinIO 为集群、API 请求、存储桶以及 MinIO 服务的其他方面发布多类指标:

许多指标都包含标签,用于标识生成该指标的资源及其他相关信息。

21.3 - 将服务日志或审计日志发布到外部服务

MinIO 会将所有 minio server 操作输出到系统控制台。 如何读取这些日志取决于 server 进程的管理方式。 例如,如果 server 通过 systemd 脚本进行管理, 你可以使用 journalctl -u SERVICENAME.service 读取日志。 请将 SERVICENAME 替换为 MinIO 服务名称。

MinIO 还支持将服务日志和审计日志发布到 HTTP Webhook。

  • 服务日志 包含与系统控制台中相同的 minio server 操作日志。服务日志适用于常规监控与运维排障。
  • 审计日志 会以更细粒度描述 MinIO 部署上的每一次操作。审计日志适用于要求对操作进行详细追踪的 安全标准与合规规范。

MinIO 会将日志作为 JSON 文档,通过 PUT 请求发送到每个已配置端点。 端点服务器负责处理这些 JSON 文档。 MinIO 要求显式配置每个 Webhook 端点,默认情况下 不会 向 Webhook 发布日志。

将服务日志发布到 HTTP Webhook

你可以通过环境变量 运行时配置项,配置一个新的 HTTP Webhook 端点, 让 MinIO 将 minio server 日志发布到该端点。

MinIO 支持使用 环境变量 指定 minio server 日志 HTTP Webhook 端点及其相关配置项。

下面的示例代码设置了配置日志 HTTP Webhook 端点所需的 全部 环境变量。 其中最少 必须 配置的变量为:

说明

Windows

   set MINIO_LOGGER_WEBHOOK_ENABLE_<IDENTIFIER>="on"
   set MINIO_LOGGER_WEBHOOK_ENDPOINT_<IDENTIFIER>="https://webhook-1.example.net"
   set MINIO_LOGGER_WEBHOOK_AUTH_TOKEN_<IDENTIFIER>="TOKEN"
说明

Linux 与 macOS

   export MINIO_LOGGER_WEBHOOK_ENABLE_<IDENTIFIER>="on"
   export MINIO_LOGGER_WEBHOOK_ENDPOINT_<IDENTIFIER>="https://webhook-1.example.net"
   export MINIO_LOGGER_WEBHOOK_AUTH_TOKEN_<IDENTIFIER>="TOKEN"
  • <IDENTIFIER> 替换为该 HTTP Webhook 端点的唯一描述字符串。 与新日志 HTTP Webhook 相关的所有环境变量都应使用同一个 <IDENTIFIER>

    如果指定的 <IDENTIFIER> 与现有日志端点匹配, 新设置将 覆盖 该端点的现有设置。 可使用 mc admin config get logger_webhook 查看当前已配置的日志 HTTP Webhook 端点。

  • https://webhook-1.example.net 替换为 HTTP Webhook 端点的 URL。

  • TOKEN 替换为适用于该端点的认证令牌类型。 对于无需认证的端点,可省略该项。

为支持多种令牌类型,MinIO 会按 原样 使用该值创建请求认证头。 根据端点不同,你可能需要包含额外信息。

例如,对于 Bearer token,请在前面加上 Bearer

说明

Windows

set MINIO_LOGGER_WEBHOOK_AUTH_TOKEN_myendpoint="Bearer 1a2b3c4f5e"
说明

Linux 与 macOS

export MINIO_LOGGER_WEBHOOK_AUTH_TOKEN_myendpoint="Bearer 1a2b3c4f5e"

请根据端点要求调整该值。 自定义认证格式可能类似如下:

说明

Windows

set MINIO_LOGGER_WEBHOOK_AUTH_TOKEN_xyz="ServiceXYZ 1a2b3c4f5e"
说明

Linux 与 macOS

export MINIO_LOGGER_WEBHOOK_AUTH_TOKEN_xyz="ServiceXYZ 1a2b3c4f5e"

详情请参阅目标服务的文档。

重启 MinIO server 以应用新的配置项。 你必须在部署中的 所有 MinIO server 上指定相同的环境变量和设置。

MinIO 支持在 MinIO 部署上使用 mc admin config set 命令和 logger_webhook 配置键新增或更新日志 HTTP Webhook 端点。 应用任何新增或更新后的配置项都需要重启 MinIO 部署。

下面的示例代码设置了配置日志 HTTP Webhook 端点相关的 全部 配置项。 其中最少 必须 配置的项为 logger_webhook endpoint

mc admin config set ALIAS/ logger_webhook:IDENTIFIER  \
   endpoint="https://webhook-1.example.net"           \
   auth_token="TOKEN"
  • <IDENTIFIER> 替换为该 HTTP Webhook 端点的唯一描述字符串。 与新日志 HTTP Webhook 相关的所有环境变量都应使用同一个 <IDENTIFIER>

    如果指定的 <IDENTIFIER> 与现有日志端点匹配, 新设置将 覆盖 该端点的现有设置。 可使用 mc admin config get logger_webhook 查看当前已配置的日志 HTTP Webhook 端点。

  • https://webhook-1.example.net 替换为 HTTP Webhook 端点的 URL。

  • TOKEN 替换为适用于该端点的认证令牌类型。 对于无需认证的端点,可省略该项。

    为支持多种令牌类型,MinIO 会按 原样 使用该值创建请求认证头。 根据端点不同,你可能需要包含额外信息。

    例如,对于 Bearer token,请在前面加上 Bearer

     mc admin config set ALIAS/ logger_webhook    \
        endpoint="https://webhook-1.example.net"  \
        auth_token="Bearer 1a2b3c4f5e"

    请根据端点要求调整该值。 自定义认证格式可能类似如下:

    mc admin config set ALIAS/ logger_webhook    \
       endpoint="https://webhook-1.example.net"  \
       auth_token="ServiceXYZ 1a2b3c4f5e"

    详情请参阅目标服务的文档。

将审计日志发布到 HTTP Webhook

你可以通过环境变量 运行时配置项,配置一个新的 HTTP Webhook 端点, 让 MinIO 将审计日志发布到该端点:

MinIO 支持使用 环境变量 指定审计日志 HTTP Webhook 端点及其相关配置项。

下面的示例代码设置了配置审计日志 HTTP Webhook 端点所需的 全部 环境变量。 其中最少 必须 配置的变量为:

说明

Windows

set MINIO_AUDIT_WEBHOOK_ENABLE_<IDENTIFIER>="on"
set MINIO_AUDIT_WEBHOOK_ENDPOINT_<IDENTIFIER>="https://webhook-1.example.net"
set MINIO_AUDIT_WEBHOOK_AUTH_TOKEN_<IDENTIFIER>="TOKEN"
set MINIO_AUDIT_WEBHOOK_CLIENT_CERT_<IDENTIFIER>="cert.pem"
set MINIO_AUDIT_WEBHOOK_CLIENT_KEY_<IDENTIFIER>="cert.key"
说明

Linux 与 macOS

export MINIO_AUDIT_WEBHOOK_ENABLE_<IDENTIFIER>="on"
export MINIO_AUDIT_WEBHOOK_ENDPOINT_<IDENTIFIER>="https://webhook-1.example.net"
export MINIO_AUDIT_WEBHOOK_AUTH_TOKEN_<IDENTIFIER>="TOKEN"
export MINIO_AUDIT_WEBHOOK_CLIENT_CERT_<IDENTIFIER>="cert.pem"
export MINIO_AUDIT_WEBHOOK_CLIENT_KEY_<IDENTIFIER>="cert.key"
  • <IDENTIFIER> 替换为该 HTTP Webhook 端点的唯一描述字符串。 与新审计日志 HTTP Webhook 相关的所有环境变量都应使用同一个 <IDENTIFIER>

    如果指定的 <IDENTIFIER> 与现有日志端点匹配, 新设置将 覆盖 该端点的现有设置。 可使用 mc admin config get audit_webhook 查看当前已配置的审计日志 HTTP Webhook 端点。

  • https://webhook-1.example.net 替换为 HTTP Webhook 端点的 URL。

  • TOKEN 替换为适用于该端点的认证令牌类型。 对于无需认证的端点,可省略该项。

为支持多种令牌类型,MinIO 会按 原样 使用该值创建请求认证头。 根据端点不同,你可能需要包含额外信息。

例如,对于 Bearer token,请在前面加上 Bearer

说明

Windows

set MINIO_AUDIT_WEBHOOK_AUTH_TOKEN_myendpoint="Bearer 1a2b3c4f5e"
说明

Linux 与 macOS

export MINIO_AUDIT_WEBHOOK_AUTH_TOKEN_myendpoint="Bearer 1a2b3c4f5e"

请根据端点要求调整该值。 自定义认证格式可能类似如下:

说明

Windows

set MINIO_AUDIT_WEBHOOK_AUTH_TOKEN_xyz="ServiceXYZ 1a2b3c4f5e"
说明

Linux 与 macOS

export MINIO_AUDIT_WEBHOOK_AUTH_TOKEN_xyz="ServiceXYZ 1a2b3c4f5e"

详情请参阅目标服务的文档。

  • cert.pemcert.key 替换为要向 HTTP Webhook server 提交的 x.509 TLS 证书公钥与私钥。 对于不要求客户端出示 TLS 证书的端点,可省略该项。

重启 MinIO server 以应用新的配置项。 你必须在部署中的 所有 MinIO server 上指定相同的环境变量和设置。

MinIO 支持在 MinIO 部署上使用 mc admin config set 命令和 audit_webhook 配置键新增或更新审计日志 HTTP Webhook 端点。 应用任何新增或更新后的配置项都需要重启 MinIO 部署。

下面的示例代码设置了配置审计日志 HTTP Webhook 端点相关的 全部 配置项。 其中最少 必须 配置的项为 audit_webhook endpoint

mc admin config set ALIAS/ audit_webhook:IDENTIFIER  \
   endpoint="https://webhook-1.example.net"          \
   auth_token="TOKEN"                                \
   client_cert="cert.pem"                            \
   client_key="cert.key"
  • <IDENTIFIER> 替换为该 HTTP Webhook 端点的唯一描述字符串。 与新审计日志 HTTP Webhook 相关的所有环境变量都应使用同一个 <IDENTIFIER>

    如果指定的 <IDENTIFIER> 与现有日志端点匹配, 新设置将 覆盖 该端点的现有设置。 可使用 mc admin config get audit_webhook 查看当前已配置的审计日志 HTTP Webhook 端点。

  • https://webhook-1.example.net 替换为 HTTP Webhook 端点的 URL。

  • TOKEN 替换为适用于该端点的认证令牌类型。 对于无需认证的端点,可省略该项。

    为支持多种令牌类型,MinIO 会按 原样 使用该值创建请求认证头。 根据端点不同,你可能需要包含额外信息。

    例如,对于 Bearer token,请在前面加上 Bearer

     mc admin config set ALIAS/ audit_webhook     \
        endpoint="https://webhook-1.example.net"  \
        auth_token="Bearer 1a2b3c4f5e"

    请根据端点要求调整该值。 自定义认证格式可能类似如下:

    mc admin config set ALIAS/ audit_webhook     \
       endpoint="https://webhook-1.example.net"  \
       auth_token="ServiceXYZ 1a2b3c4f5e"

    详情请参阅目标服务的文档。

  • cert.pemcert.key 替换为要向 HTTP Webhook server 提交的 x.509 TLS 证书公钥与私钥。 对于不要求客户端出示 TLS 证书的端点,可省略该项。

审计日志结构

MinIO 审计日志类似于以下 JSON 文档:

  • api.timeToFirstByteapi.timeToResponse 字段以纳秒表示。

  • 对于 纠删码部署tags.objectErasureMap 提供与对象相关的以下详细信息:

    • 执行该对象操作所在的 服务器池
    • 执行该对象操作所在的 纠删码集合
    • 参与该对象操作的纠删码集合驱动器列表。
{
   "version": "1",
   "deploymentid": "8ca2b7ad-20cf-4d07-9efb-28b2f519f4a5",
   "time": "2024-02-29T19:39:25.744431903Z",
   "event": "",
   "trigger": "incoming",
   "api": {
      "name": "CompleteMultipartUpload",
      "bucket": "data",
      "object": "test-data.csv",
      "status": "OK",
      "statusCode": 200,
      "rx": 267,
      "tx": 358,
      "txHeaders": 387,
      "timeToFirstByte": "2096989ns",
      "timeToFirstByteInNS": "2096989",
      "timeToResponse": "2111986ns",
      "timeToResponseInNS": "2111986"
   },
   "remotehost": "127.0.0.1",
   "requestID": "17B86CB0ED88EBE9",
   "userAgent": "MinIO (linux; amd64) minio-go/v7.0.67 mc/RELEASE.2024-02-24T01-33-20Z",
   "requestPath": "/data/test-data.csv",
   "requestHost": "minio.example.net:9000",
   "requestQuery": {
      "uploadId": "OGNhMmI3YWQtMjBjZi00ZDA3LTllZmItMjhiMmY1MTlmNGE1LmU3MjNlNWI4LTNiYWYtNDYyNy1hNzI3LWMyNDE3NTVjMmMzNw"
   },
   "requestHeader": {
      "Accept-Encoding": "zstd,gzip",
      "Authorization": "AWS4-HMAC-SHA256 Credential=minioadmin/20240229/us-east-1/s3/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=ccb3acdc1763509a88a7e4a3d7fe431ef0ee5ca3f66ccb430d5a09326e87e893",
      "Content-Length": "267",
      "Content-Type": "application/octet-stream",
      "User-Agent": "MinIO (linux; amd64) minio-go/v7.0.67 mc/RELEASE.2024-02-24T01-33-20Z",
      "X-Amz-Content-Sha256": "d61969719ee94f43c4e87044229b7a13b54cab320131e9a77259ad0c9344f6d3",
      "X-Amz-Date": "20240229T193925Z"
   },
   "responseHeader": {
      "Accept-Ranges": "bytes",
      "Content-Length": "358",
      "Content-Type": "application/xml",
      "ETag": "1d9fdc88af5e74f5eac0a3dd750ce58e-2",
      "Server": "MinIO",
      "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
      "Vary": "Origin,Accept-Encoding",
      "X-Amz-Id-2": "dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8",
      "X-Amz-Request-Id": "17B86CB0ED88EBE9",
      "X-Content-Type-Options": "nosniff",
      "X-Xss-Protection": "1; mode=block"
   },
   "tags": {
      "objectLocation": {
            "name": "Mousepad Template-v03final.jpg",
            "poolId": 1,
            "setId": 1,
            "disks": [
               "/mnt/drive-1",
               "/mnt/drive-2",
               "/mnt/drive-3",
               "/mnt/drive-4"
            ]
      }
   },
   "accessKey": "minioadmin"
}

21.4 - 使用 InfluxDB 进行监控与告警

MinIO 使用 Prometheus 数据模型 发布集群和节点指标。 InfluxDB 支持抓取 MinIO 指标数据,用于监控和告警。

本页介绍以下内容:

  • 配置 InfluxDB 服务,抓取并展示 MinIO 部署的指标
  • 基于 MinIO 指标配置告警
说明

前提条件

此过程要求满足以下条件:

  • 已有 InfluxDB 部署,并配置一个或多个通知端点
  • 已有可通过网络访问 InfluxDB 部署的 MinIO 部署
  • 本地主机已安装 mc,并已配置为可 访问 MinIO 部署

本文说明使用 version 2 指标。 关于指标 API 版本的更多信息,请参见 指标与告警

对于 Kubernetes 上的 MinIO 部署,本文默认已具备 Ingress、负载均衡器等必要的网络控制组件,以便 MinIO 租户与 InfluxDB 服务之间能够互相访问。

配置 InfluxDB 收集 MinIO 指标并触发告警

警告

重要

本过程专门使用 InfluxDB UI 来创建抓取端点。

InfluxDB UI 提供的配置能力不如 Telegraf 及其对应的 Prometheus plugin 完整。 具体来说:

  • 无法通过 InfluxDB UI 为 MinIO 指标端点启用认证访问
  • 无法为已采集指标设置标签(例如 url_tag),以唯一标识特定 MinIO 部署的指标

Telegraf Prometheus plugin 还支持 Kubernetes 特有能力,例如抓取特定 MinIO 租户的 minio service。

配置 Telegraf 不在本文范围内。 可将本文作为配置 Telegraf 抓取 MinIO 指标的一般指导。

  1. 配置对 MinIO 指标的公开访问

    在 MinIO 部署的所有节点上,将 MINIO_PROMETHEUS_AUTH_TYPE 环境变量设置为 "public"。 随后可重启部署,以允许公开访问 MinIO 指标。

    可通过对指标端点执行 curl 来验证变更是否生效:

    curl https://HOSTNAME/minio/v2/metrics/cluster

    HOSTNAME 替换为访问 MinIO 部署所使用的负载均衡器或反向代理 URL。 也可以将任意单个节点写成 HOSTNAME:PORT,即在节点主机名之外再指定 MinIO server API 端口。

    响应正文中应包含已采集的 MinIO 指标列表。

  2. 登录 InfluxDB UI 并创建 Bucket

    选择用于存储 MinIO 指标的 Organization

    创建一个 New Bucket,用于存储该 MinIO 部署的指标。

  3. 创建新的抓取源

    创建一个 新的 InfluxDB Scraper

    指定 MinIO 部署的完整 URL,其中包含指标端点:

    https://HOSTNAME/minio/v2/metrics/cluster

    HOSTNAME 替换为访问 MinIO 部署所使用的负载均衡器或反向代理 URL。 也可以将任意单个节点写成 HOSTNAME:PORT,即在节点主机名之外再指定 MinIO server API 端口。

  4. 验证数据

    使用 DataExplorer 可视化已采集的 MinIO 数据。

    例如,可针对 minio_cluster_capacity_usable_total_bytesminio_cluster_capacity_usable_free_bytes 设置过滤条件,以比较 MinIO 部署中的总可用空间和剩余可用空间。

  5. 配置 Check

    基于某个 MinIO 指标创建一个新的 Check

    以下示例 Check 规则为 MinIO 部署提供了一组基础告警。 可按需修改这些示例,或将其作为构建自定义 Check 的参考。

    • 创建一个名为 MINIO_NODE_DOWNThreshold Check

      将过滤条件设置为 minio_cluster_nodes_offline_total 键。

      在值大于 1 时,将 Thresholds 设置为 WARN

    • 创建一个名为 MINIO_QUORUM_WARNINGThreshold Check

      将过滤条件设置为 minio_cluster_drive_offline_total 键。

      当该值比已配置的 纠删码校验值 少 1 时,将 Thresholds 设置为 CRITICAL

      例如,使用 EC:4 的部署应将该值设置为 3

    配置 Notification endpointsNotification rules,使各类 Check 都能触发适当响应。

21.5 - Metrics version 2

MinIO 使用 Prometheus 数据模型 发布集群和节点指标。 你可以使用任意抓取工具从 MinIO 拉取指标数据,以执行进一步分析和配置告警。

Version 2 端点

Metrics version 2 将指标划分为以下三个类别:

每个 v2 端点都会返回其所属类别的全部指标。 例如,抓取以下端点会返回所有集群指标:

http://HOSTNAME:PORT/minio/v2/metrics/cluster

仅访问基础端点 /minio/v2/metrics/ 也会返回集群指标。

如需更灵活的抓取方式和更广泛的指标集合,请使用 metrics version 3。 现有部署仍可继续使用 version 2 指标Grafana 仪表板

MinIO Grafana 仪表板

MinIO 提供两个 Grafana 仪表板,用于可视化 v2 指标。 有关为 Grafana 配置兼容 Prometheus 数据源的完整说明,请参见 Prometheus 关于 Grafana 支持的文档

可用的 version 2 指标

以下各节描述 version 2 的端点与指标。

你可以使用以下 URL 端点抓取集群级指标(英文详细表)

http://HOSTNAME:PORT/minio/v2/metrics/cluster

HOSTNAME:PORT 替换为 MinIO 部署的 FQDN 与端口。 对于使用负载均衡器管理 MinIO 节点间连接的部署,请指定负载均衡器地址。

说明

变更: MinIO

RELEASE.2023-07-21T21-12-44Z

存储桶指标已迁移到独立端点。

说明

变更: RELEASE.2023-08-31T15-31-16Z

你可以使用以下 URL 端点抓取存储桶级指标(英文详细表)

说明

变更: RELEASE.2025-03-12T17-29-24Z

出于性能原因,v2 指标最多支持 100 个存储桶。 如果需要覆盖更多存储桶的指标,请改用 v3 指标

http://HOSTNAME:PORT/minio/v2/metrics/bucket

HOSTNAME:PORT 替换为 MinIO 部署的 FQDN 与端口。 对于使用负载均衡器管理 MinIO 节点间连接的部署,请指定负载均衡器地址。

说明

新增: RELEASE.2023-10-07T15-07-38Z

你可以使用以下 URL 端点抓取资源指标(英文详细表)

http://HOSTNAME:PORT/minio/v2/metrics/resource

HOSTNAME:PORT 替换为 MinIO 部署的 FQDN 与端口。 对于使用负载均衡器管理 MinIO 节点间连接的部署,请指定负载均衡器地址。

说明

变更: RELEASE.2025-03-12T17-29-24Z

出于性能原因,v2 指标最多支持 100 个存储桶。 如果需要覆盖更多存储桶的指标,请改用 v3 指标

21.6 - 健康检查 API

MinIO 提供无需身份验证的端点,用于探测节点在线状态以及集群 高可用性,从而执行简单健康检查。这些 端点返回一个 HTTP 状态码,用于表示底层资源是否健康,或是否满足读写仲裁。 MinIO 不会通过这些端点暴露任何其他数据。

节点存活

使用以下端点测试某个 MinIO server 是否在线:

curl -I https://minio.example.net:9000/minio/health/live

https://minio.example.net:9000 替换为待检查 MinIO server 的 DNS 主机名。

返回 200 OK 表示该 MinIO server 在线且工作正常。 任何其他 HTTP 状态码都表示访问该 server 存在问题,例如临时网络故障或潜在停机。

单靠 healthcheck probe 无法判断某个 MinIO server 是否离线。 它只能判断当前主机是否能够访问该 server。 建议配置 Prometheus 告警,使用 metrics v3(英文详细表)minio_cluster_health_nodes_offline_countmetrics v2(英文详细表)minio_cluster_nodes_offline_total,以检测一个或多个 MinIO 节点是否离线。

集群写仲裁

使用以下端点测试 MinIO 集群是否具备 写仲裁

curl -I https://minio.example.net:9000/minio/health/cluster

https://minio.example.net:9000 替换为待检查 MinIO 集群中某个节点的 DNS 主机名。 对于使用负载均衡器管理传入连接的集群,请指定负载均衡器的主机名。

返回 200 OK 表示 MinIO 集群当前有足够的 MinIO server 在线,可满足写仲裁。 返回 503 Service Unavailable 表示集群当前不具备写仲裁。

单靠 healthcheck probe 无法判断某个 MinIO server 是否离线,也无法判断其是否正在正常处理写操作。 它只能根据配置的 纠删码校验值 判断当前是否有足够的 MinIO server 在线,以满足写仲裁要求。 建议配置 Prometheus 告警,使用以下指标检测 MinIO 集群中的潜在问题或错误:

  • minio_cluster_nodes_offline_total:在一个或多个 MinIO 节点离线时触发告警。
  • minio_node_drive_free_bytes:在集群可用磁盘空间不足时触发告警。

集群读仲裁

使用以下端点测试 MinIO 集群是否具备 读仲裁

curl -I https://minio.example.net:9000/minio/health/cluster/read

https://minio.example.net:9000 替换为待检查 MinIO 集群中某个节点的 DNS 主机名。 对于使用负载均衡器管理传入连接的集群,请指定负载均衡器的主机名。

返回 200 OK 表示 MinIO 集群当前有足够的 MinIO server 在线,可满足读仲裁。 返回 503 Service Unavailable 表示集群当前不具备读仲裁。

单靠 healthcheck probe 无法判断某个 MinIO server 是否离线,也无法判断其是否正在正常处理读操作。 它只能根据配置的 纠删码校验值 判断当前是否有足够的 MinIO server 在线,以满足读仲裁要求。 建议配置 Prometheus 告警,使用 minio_cluster_nodes_offline_total 指标检测一个或多个 MinIO 节点是否离线。

集群维护检查

使用以下端点测试在将指定 MinIO server 下线维护时, MinIO 集群是否仍能同时维持

curl -I https://minio.example.net:9000/minio/health/cluster?maintenance=true

https://minio.example.net:9000 替换为待检查 MinIO 集群中某个节点的 DNS 主机名。 对于使用负载均衡器管理传入连接的集群,请指定负载均衡器的主机名。

返回 200 OK 表示 MinIO 集群当前有足够的 MinIO server 在线,可满足写仲裁。 返回 412 Precondition Failed 表示如果该 MinIO server 离线,集群将失去仲裁。

单靠 healthcheck probe 无法判断某个 MinIO server 是否离线。 它只能判断在该节点因维护而下线后,是否仍有足够的 MinIO server 在线,以根据配置的 纠删码校验值 满足读写仲裁要求。 建议配置 Prometheus 告警,使用 minio_cluster_nodes_offline_total 指标检测一个或多个 MinIO 节点是否离线。

21.7 - 使用 Grafana 监控 Silo 服务端

无论指标存储在何处,Grafana 都允许你对其进行查询、可视化、告警和分析。

前提条件

说明

Grafana 仪表板使用 metrics version 2

MinIO 的 Grafana 仪表板使用 metrics version 2。 关于指标 API 版本的更多信息,请参见 指标与告警

对于 version 3 指标,你需要自行创建仪表板。 关于仪表板的更多信息,请参见 Grafana 文档

MinIO Grafana 仪表板

MinIO 提供了若干官方 Grafana 仪表板,可从 Grafana Dashboard 门户下载。

  1. MinIO Server 指标
  2. MinIO 存储桶指标
  3. MinIO 复制指标

若要跟踪 Grafana 仪表板的变更,可以查看 MinIO Server GitHub 仓库中 serverbucket 仪表板对应的 JSON 文件。

MinIO Server 指标仪表板

请从 Grafana 上的 MinIO 组织仪表板目录选择与部署所暴露指标版本兼容的服务端仪表板。

MinIO 为 MinIO Server 指标提供了专用的 Grafana 仪表板。 关于该仪表板配置的详细信息,请参见 GitHub 上的 JSON 文件

对于启用了 服务端加密 的 MinIO 部署(包括 SSE-KMS 或 SSE-S3),该仪表板还包含 KMS 指标。 这些指标包括状态、请求错误率和请求成功率。

MinIO Grafana 仪表板示例,展示了 MinIO Server 上采集的多种指标。

MinIO 存储桶指标仪表板

请从 Grafana 上的 MinIO 组织仪表板目录选择与部署所暴露指标版本兼容的存储桶仪表板。

存储桶指标可以通过 GitHub 上的 bucket JSON 文件 在 Grafana 仪表板中查看。

MinIO Grafana 仪表板示例,展示了 MinIO 存储桶的多种采集指标。

MinIO 节点指标仪表板

节点指标可以通过 GitHub 上的 node JSON 文件 在 Grafana 仪表板中查看。

MinIO Grafana 仪表板示例,展示了 MinIO 节点的多种采集指标。

MinIO 复制指标仪表板

请从 Grafana 上的 MinIO 组织仪表板目录选择与部署所暴露指标版本兼容的复制仪表板。

集群复制指标可以通过 GitHub 上的 cluster replication JSON 文件 在 Grafana 仪表板中查看。

MinIO Grafana 仪表板示例,展示了复制相关的多种采集指标。

22 - 升级 Silo Tenant

以下步骤用于使用 Kustomize 或 Helm 升级单个 Silo Tenant。请先在非生产 Tenant 中测试确切的服务端镜像、Operator/Chart 版本与回滚流程。

注意

服务端镜像必须保持为 pgsty/minio,并仅使用 Silo 下载页 已发布的标签或摘要。上游 Tenant 默认值使用 MinIO 镜像。同时保留 MINIO_UPDATE=off;继承的原地更新器仍指向上游 MinIO 发布源,不是 Silo 升级路径。

警告

重要

对于使用早于 RELEASE.2024-03-30T09-41-56Z 的 MinIO Image 且启用了 AD/LDAP 的 Tenant,在开始本步骤前,你 必须 先完整阅读 RELEASE.2024-04-18T19-09-19Z 的发布说明。 你必须将该发布说明中记录的额外步骤纳入升级过程。

使用 Kustomize 升级 Tenant

以下步骤使用 Kustomize 和 kubectl CLI 升级 MinIO Tenant。 如果你是使用 Helm 部署 Tenant,请改用 使用 MinIO Helm Chart 升级 Tenant 步骤。

若要使用 Kustomize 升级 Tenant:

如果 Tenant 是通过 Operator Console 部署的,则在升级前还需要额外步骤来创建基础配置文件。

如果 Tenant 是通过 Kustomize 部署的,则基础配置就是原始 Tenant 部署中已有的 kustomization 文件。

请根据 Tenant 的部署方式选择下方标签页:

  1. 创建基础配置文件:

    1. 在一个合适的目录中,使用 kubectl get 将当前 Tenant 配置保存到文件:

      kubectl get tenant/my-tenant -n my-tenant-ns -o yaml > my-tenant-base.yaml

      my-tenantmy-tenant-ns 替换为待升级 Tenant 的名称和命名空间。

      编辑该文件,删除以下几行:

      • creationTimestamp:
      • resourceVersion:
      • uid:
      • selfLink:(如果存在)

      例如,删除高亮显示的这些行:

      metadata:
        creationTimestamp: "2024-05-29T21:22:20Z"
        generation: 1
        name: my-tenant
        namespace: my-tenant-ns
        resourceVersion: "4699"
        uid: d5b8e468-3bed-4aa3-8ddb-dfe1ee0362da
    2. 在同一目录中,创建一个 kustomization.yaml 文件,其内容类似如下:

      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      
      resources:
      - my-tenant-base.yaml
      
      patches:
      - path: upgrade-minio-tenant.yaml

      如果你在上一步为 kubectl get 输出使用了不同的文件名,请将 my-tenant-base.yaml 替换为对应文件名。

  1. 你可以使用原始部署中的 kustomization 文件作为基础配置来升级 Tenant。 如果你已经没有这些文件,请按照 Operator Console-Deployed Tenant 标签页中的说明操作。
  1. 创建一个 upgrade-minio-tenant.yaml 文件,其内容类似如下:
apiVersion: minio.min.io/v2
kind: Tenant

metadata:
  name: my-tenant
  namespace: my-tenant-ns

spec:
  image: pgsty/minio:RELEASE.2026-08-04T00-00-00Z
  env:
    - name: MINIO_UPDATE
      value: "off"

该文件会指示 Kustomize 使用指定镜像升级 Tenant。 该文件名 upgrade-minio-tenant.yaml 必须与上一步创建的 kustomization.yamlpatches.path 指定的文件名一致。

my-tenantmy-tenant-ns 替换为待升级 Tenant 的名称和命名空间。仅当更新的 Silo 发布已公开发布且经过验证时,才替换示例镜像标签。

或者,你也可以按照本地流程直接更新基础配置。 更多信息请参阅 Kustomize Documentation

  1. 在与上述文件相同的目录中,使用 kubectl apply 将更新后的配置应用到 Tenant:
kubectl apply -k ./

输出类似如下:

tenant.minio.min.io/my-tenant configured

使用 MinIO Helm Chart 升级 Tenant

本步骤使用 Helm Charts 升级现有 MinIO Tenant。

如果你是通过 Kustomize 部署 Tenant,请改用 使用 Kustomize 升级 Tenant 步骤。

  1. 验证现有 Silo Tenant 安装。

    使用 kubectl get all -n TENANT_NAMESPACE 验证所有 Tenant pod 和 service 的健康状态。

    使用 helm list 命令查看该命名空间中已安装的 chart:

    helm list -n TENANT_NAMESPACE

    结果应类似如下:

    NAME            NAMESPACE         REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    CHART_NAME      TENANT_NAMESPACE  1               2023-11-01 15:49:58.810412732 -0400 EDT deployed        tenant-5.0.x   v5.0.x
  2. 更新 Operator 仓库

    使用 helm repo update minio-operator 更新 MinIO Operator 仓库。 如果你为 MinIO Operator 仓库设置了不同的别名,请在命令中指定该别名。 你可以使用 helm repo list 查看已安装的仓库列表。

    在更新 Operator 仓库后,使用 helm search 检查最新可用的 chart 版本:

    helm search repo minio-operator

    返回结果应类似如下:

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION
    minio-operator/minio-operator   4.3.7           v4.3.7          A Helm chart for MinIO Operator
    minio-operator/operator         7.1.1          v7.1.1         A Helm chart for MinIO Operator
    minio-operator/tenant           7.1.1          v7.1.1         A Helm chart for MinIO Operator

    minio-operator/minio-operator 是旧版 chart,正常情况下 不应 安装。

  3. 保留并审查 Tenant values

    导出当前发布由用户提供的 values,然后确认该文件保留了所有拓扑、存储、TLS、凭据与调度设置:

    helm get values CHART_NAME -n TENANT_NAMESPACE -o yaml > values.yaml

    tenant.image.repository 设为 pgsty/minio,将 tenant.image.tag 固定为经测试的已发布 Silo 版本,并确保 tenant.env 包含 MINIO_UPDATE=off。不得让 Chart 升级默默恢复上游镜像默认值。

  4. 运行已固定的 helm upgrade

    Chart 版本与 Silo 服务端镜像应分别固定,并传入经过审查的 values 文件:

    helm upgrade -n TENANT_NAMESPACE \
      --version 7.1.1 \
      --values values.yaml \
      CHART_NAME minio-operator/tenant

    命令结果应返回成功,并且 REVISION 值会递增。

  5. 验证 Tenant 升级

    检查所有 service 和 pod 是否都已在线,确认实际运行的镜像摘要,并执行经过认证的 S3 读写冒烟测试后再完成发布。

23 - 退役 服务器池

MinIO 支持从包含两个或更多 pool 的部署中退役并移除 服务器池s。 执行退役前,至少必须保留一个具有足够可用空间的 pool,以接收被退役 pool 中的对象。

RELEASE.2023-01-18T04-36-38Z 起,MinIO 支持在一条退役命令中排队 多个 pool。 每个被列出的 pool 会立即进入只读状态,但实际排空过程一次只处理一个 pool。

退役功能适用于移除那些相较于当前部署中其他 pool 而言,硬件能力或性能已经不足的旧 服务器池。 MinIO 会根据各 pool 的空闲空间占比,自动将被退役 pool 中的数据迁移到部署中其余 pool。

在退役过程中,MinIO 会像平常一样路由读取操作(例如 GETLISTHEAD)。 写入操作(例如 PUT、带版本的 DELETE)会被路由到部署中其余仍处于“active”状态的 pool。 带版本对象在迁移过程中会保持其顺序。

本页步骤用于从至少包含两个 服务器池 的 分布式 MinIO 部署中退役并移除一个或多个 服务器池。

说明

退役是永久性的

一旦 MinIO 开始退役某个 pool,就会将其标记为 永久 非活跃(“draining”)状态。 取消或以其他方式中断退役流程,不会 将该 pool 恢复为 active 状态。 退役多个 pool 时必须格外谨慎。

退役是一项重大的管理操作,规划与执行都需要谨慎对待,并不是轻量或“日常型”的任务。

MinIO SUBNET 用户可以 登录 并创建与退役相关的新工单。 通过 SUBNET 与 MinIO Engineering 协作,可提高退役成功率,包括性能测试和健康诊断。

社区用户可以在 MinIO Community Slack 寻求支持。 社区支持仅为 best-effort,不对响应速度提供任何 SLA。

前提条件

先备份集群设置

在开始退役前,使用 mc admin cluster bucket exportmc admin cluster iam export 命令分别为存储桶元数据和 IAM 配置创建快照。 必要时,你可以使用这些快照恢复存储桶/IAM 设置,以从用户错误或流程错误中恢复。

网络与防火墙

部署中的每个节点都应当与其他所有节点具备完整的双向网络访问能力。 对于容器化或编排式基础设施,这可能需要针对 Ingress、负载均衡器等网络和路由组件进行专门配置。 某些操作系统还可能需要设置防火墙规则。 例如,以下命令会在使用 firewalld 的服务器上显式开放 MinIO server 默认 API 端口 9000

firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload

如果你为 MinIO Console 设置了静态端口(例如 :9001), 则还必须允许外部客户端访问该端口,以确保连接可用。

MinIO 强烈建议 使用负载均衡器管理到集群的连接。 由于部署中的任意 MinIO 节点都可以接收、转发或处理客户端请求,因此负载均衡器应采用 “Least Connections” 算法将请求路由到 MinIO 部署。

以下负载均衡器已知可与 MinIO 良好配合:

如何配置防火墙或负载均衡器以支持 MinIO 不在本步骤范围内。

部署必须具备足够的存储空间

退役过程会将目标 pool 中的对象迁移到部署中的其他 pool。 该部署的总可用存储空间 必须 大于被退役 pool 的总存储量。

使用 纠删码计算器 确认可用存储容量。 然后再减去部署中现有对象已占用的空间。

例如,假设某个部署的已用和空闲存储分布如下:

Pool 1

100TB 已用

200TB 总计

Pool 2

100TB 已用

200TB 总计

Pool 3

100TB 已用

200TB 总计

退役 Pool 1 需要将这 100TB 已用存储分散到其余 pool 上。 Pool 2 和 Pool 3 各自都有 100TB 未使用存储空间,因此可以安全接收 Pool 1 上的数据。

但如果 Pool 1 已满(例如已使用 200TB),退役会将剩余 pool 完全填满,并可能阻止任何后续写入操作。

注意事项

替换 服务器池

对于通过新 pool 硬件替换旧 pool 硬件的升级周期,你应先通过 扩容 添加新 pool,再开始退役旧 pool。 先添加新 pool,有助于退役过程在所有可用 pool(包括现有 pool 和新 pool)之间更均衡地迁移对象。

在退役旧硬件 pool 之前,请先完成所有计划中的 硬件扩容

退役要求集群拓扑在整个 pool 排空过程中保持稳定。 不要 试图在同一步骤中同时执行扩容和退役变更。

退役可恢复继续执行

如果退役因部署重启、网络故障等瞬时问题而中断,MinIO 会自动继续该过程。

对于人工取消或失败的退役尝试,只有在你手动重新发起退役操作后,MinIO 才会恢复执行。

无论中断原因为何,该 pool 都会持续保持在退役状态。 退役一旦开始,该 pool 永远 无法恢复为 active 状态。

退役是无中断的

移除已退役的 服务器池 需要在大致同一时间重启部署中的 所有 MinIO 节点。

MinIO 强烈建议同时重启一个部署中的所有 MinIO 服务端进程。 MinIO 操作具有原子性并保持严格一致。 因此,该重启过程不会中断应用或正在进行的操作。

不要 执行“滚动”重启(例如一次只重启一个节点)。

退役会忽略已过期对象和尾部 DeleteMarker

RELEASE.2023-05-27T05-56-19Z 起,退役过程会忽略那些仅剩 DeleteMarker 版本的对象。 这样可以避免为实际上已被完全删除的对象,在剩余 服务器池 上生成空元数据。

RELEASE.2023-06-23T20-26-00Z 起,退役还会忽略那些已根据父存储桶配置的 生命周期规则 过期的对象版本。 从 RELEASE.2023-06-29T05-12-28Z 起,你可以使用 mc admin trace --call decommission 在退役过程中监控被忽略的 delete marker 和已过期对象。

退役过程完成后,你就可以安全关闭该 pool。 由于剩余数据要么已计划删除,要么仅为 DeleteMarker,因此你可以按照内部流程安全清空或销毁这些驱动器。

行为说明

最终列表检查

在退役过程结束时,MinIO 会检查该 pool 上是否还有对象列表。 如果列表为空,MinIO 会将退役标记为成功完成。 如果仍返回任何对象,MinIO 会报错,指出退役过程失败。

如果退役失败,客户应在重新尝试退役前先提交 MinIO SUBNET 工单以获取进一步协助。 没有 SUBNET 订阅的社区用户可以重试退役流程,或通过 MinIO Community Slack 寻求额外支持。 MinIO 的社区支持仅为 best-effort,不提供任何响应速度方面的 SLA

对已启用 Tiering 的 Server 执行退役

说明

变更: RELEASE.2023-03-20T20-16-18Z

对于已启用并处于活动状态的 tiering 部署,退役会将对象引用迁移到新的 active pool。 应用程序仍可继续对这些对象发出 GET 请求,MinIO 会透明地从远端 tier 中检索对象。

在旧版本 MinIO 中,tiering 配置会阻止退役操作。

退役单个 服务器池

1) 查看 MinIO 部署拓扑

mc admin decommission 命令会返回 MinIO 部署中所有 pool 的列表:

mc admin decommission status myminio

命令返回的输出类似如下:

┌─────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────┬────────┐
│ ID  │ Pools                                                          │ Capacity                         │ Status │
│ 1st │ https://minio-{01...04}.example.com:9000/mnt/disk{1...4}/minio │  10 TiB (used) / 10  TiB (total) │ Active │
│ 2nd │ https://minio-{05...08}.example.com:9000/mnt/disk{1...4}/minio │  60 TiB (used) / 100 TiB (total) │ Active │
│ 3rd │ https://minio-{09...12}.example.com:9000/mnt/disk{1...4}/minio │  40 TiB (used) / 100 TiB (total) │ Active │
└─────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────┴────────┘

上例部署共有三个 pool。 每个 pool 都有四台服务器,每台服务器有四块驱动器。

确定要退役的目标 pool,并检查当前容量。 部署中其余 pool 的总容量 必须 足以迁移被退役 pool 中存储的所有对象。

在上述示例中,该部署总存储为 210TiB,其中已使用 110TiB。 第一个 pool(minio-{01...04})是退役目标,因为它是在 MinIO 部署创建时配置的,并且已经完全写满。 其余较新的 pool 可以吸收该 pool 中的所有对象,而不会显著影响总可用存储。

2) 启动退役过程

说明

退役是永久性的

一旦 MinIO 开始退役某个 pool,就会将其标记为 永久 非活跃(“draining”)状态。 取消或以其他方式中断退役流程,不会 将该 pool 恢复为 active 状态。

在运行以下命令前,请先确认并验证你要退役的是正确的 pool。

使用 mc admin decommission start 命令开始退役目标 pool。 指定部署的 alias,以及待退役 pool 的完整描述,包括所有主机、磁盘和文件路径。

mc admin decommission start myminio/ https://minio-{01...04}.example.net:9000/mnt/disk{1...4}/minio

该示例命令会在 myminio 部署上启动对匹配 服务器池 的退役。

在退役过程中,对于尚未迁移的对象,MinIO 会继续将读取操作(GETLISTHEAD)路由到该 pool。 所有新的写入操作(PUT)都会被路由到部署中其余 pool。

此时,负责管理部署连接的负载均衡器、反向代理或其他网络控制组件无需修改其配置。

3) 监控退役过程

使用 mc admin decommission status 命令监控退役过程。

mc admin decommission status myminio

命令返回的输出类似如下:

┌─────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────┬──────────┐
│ ID  │ Pools                                                          │ Capacity                         │ Status   │
│ 1st │ https://minio-{01...04}.example.com:9000/mnt/disk{1...4}/minio │  10 TiB (used) / 10  TiB (total) │ Draining │
│ 2nd │ https://minio-{05...08}.example.com:9000/mnt/disk{1...4}/minio │  60 TiB (used) / 100 TiB (total) │ Active   │
│ 3rd │ https://minio-{09...12}.example.com:9000/mnt/disk{1...4}/minio │  40 TiB (used) / 100 TiB (total) │ Active   │
└─────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────┴──────────┘

你可以在命令中指定 服务器池 的描述,以获取更详细的信息:

mc admin decommission status myminio https://minio-{01...04}.example.com:9000/mnt/disk{1...4}/minio

命令返回的输出类似如下:

Decommissioning rate at 100MiB/sec [1TiB/10TiB]
Started: 30 minutes ago

mc admin decommission status 会在退役完成后将 Status 标记为 Complete。 一旦退役完成,你就可以继续下一步。

如果 Status 显示为 failed,你可以重新运行 mc admin decommission start 命令以恢复该过程。 如果失败持续存在,请使用 mc admin logs 或查看 systemd 日志(例如 journalctl -u minio),以定位更具体的错误。

4) 从部署配置中移除已退役的 Pool

每当一个 pool 完成退役后,你都可以安全地将其从部署配置中移除。 请修改部署中每个剩余 MinIO server 的启动命令,并移除已退役 pool。

.deb.rpm 软件包会将 systemd 服务文件安装到 /lib/systemd/system/minio.service。 对于二进制安装,本步骤默认该文件已按照 安装与管理 流程手动创建。

minio.service 文件使用位于 /etc/default/minio 的环境文件读取配置设置,其中也包括启动配置。 具体来说,MINIO_VOLUMES 变量定义了启动命令:

cat /etc/default/minio | grep "MINIO_VOLUMES"

命令返回的输出类似如下:

MINIO_VOLUMES="https://minio-{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio-{5...8}.example.net:9000/mnt/disk{1...4}/minio https://minio-{9...12}.example.net:9000/mnt/disk{1...4}/minio"

编辑该环境文件,并从 MINIO_VOLUMES 的值中移除已退役 pool。

5) 更新网络控制平面

更新所有负载均衡器、反向代理或其他网络控制平面,从 MinIO 部署的连接配置中移除已退役的 服务器池。

网络控制平面组件的具体配置说明不在本步骤范围内。

6) 重启 MinIO 部署

在部署中的每个节点上 同时 执行以下命令,以重启 MinIO 服务:

sudo systemctl restart minio.service

Use the following commands to confirm the service is online and functional:

sudo systemctl status minio.service
journalctl -f -u minio.service

MinIO may log an increased number of non-critical warnings while the server processes connect and synchronize. These warnings are typically transient and should resolve as the deployment comes online.

MinIO 强烈建议同时重启一个部署中的所有 MinIO 服务端进程。 MinIO 操作具有原子性并保持严格一致。 因此,该重启过程不会中断应用或正在进行的操作。

不要 执行“滚动”重启(例如一次只重启一个节点)。

部署重新上线后,使用 mc admin info 确认部署中所有剩余 server 的运行状态。

退役多个 服务器池

说明

变更: RELEASE.2023-01-18T04-36-38Z

在执行退役命令时,你可以一次性启动多个 服务器池 的退役过程。

输入该命令后:

  • MinIO 会立即停止对所有待退役 pool 的写访问。
  • 退役一次只处理一个 pool。
  • 每个 pool 完成排空后,MinIO 才会开始排空下一个 pool。

若要通过一条命令退役多个 服务器池,请将每个待退役 服务器池 的完整描述以逗号分隔列表的形式追加到命令中。

执行多 server 退役时,其他所有关于退役的注意事项同样适用。

  • 退役是永久性的。
  • 一旦将这些 pool 标记为退役,你就 无法 恢复它们。
  • 请确认你选择的是预期的 pool。

1) 查看 MinIO 部署拓扑

mc admin decommission 命令会返回 MinIO 部署中所有 pool 的列表:

mc admin decommission status myminio

命令返回的输出类似如下:

┌─────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────┬────────┐
│ ID  │ Pools                                                          │ Capacity                         │ Status │
│ 1st │ https://minio-{01...04}.example.com:9000/mnt/disk{1...4}/minio │  10 TiB (used) / 10  TiB (total) │ Active │
│ 2nd │ https://minio-{05...08}.example.com:9000/mnt/disk{1...4}/minio │  95 TiB (used) / 100 TiB (total) │ Active │
│ 3rd │ https://minio-{09...12}.example.com:9000/mnt/disk{1...4}/minio │  40 TiB (used) / 500 TiB (total) │ Active │
│ 4th │ https://minio-{13...16}.example.com:9000/mnt/disk{1...4}/minio │  0  TiB (used) / 500 TiB (total) │ Active │
└─────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────┴────────┘

上例部署共有三个 pool。 每个 pool 都有四台服务器,每台服务器有四块驱动器。

确定要退役的目标 pool,并检查当前容量。 部署中其余 pool 的总容量 必须 足以迁移被退役 pool 中存储的所有对象。

在上述示例中,该部署总存储为 1110TiB,其中已使用 145TiB。

  • 第一个 pool(minio-{01...04})是第一个退役目标,因为它是在 MinIO 部署创建时配置的,并且已经完全写满。
  • 第二个 pool(minio-{05...08})是第二个退役目标,因为它同样是在部署创建时配置的,并且已接近写满。
  • 第四个 pool(minio-{13...16})是一个刚通过 server 扩容加入的新硬件 pool。

第三个和第四个 pool 可以吸收第一个 pool 上的全部对象,而不会显著影响总可用存储。

警告

重要

在开始退役前,请先完成所有新增存储资源所需的 server 扩容。

2) 启动退役过程

说明

退役是永久性的

一旦 MinIO 开始退役这些 pool,就会将它们标记为 永久 非活跃(“draining”)状态。 取消或以其他方式中断退役流程,不会 将这些 pool 恢复为 active 状态。

在运行以下命令前,请先确认并验证你要退役的是正确的 pool。

使用 mc admin decommission start 命令开始退役目标 pool。 指定部署的 alias,以及以逗号分隔的每个待退役 pool 的完整描述,包括所有主机、磁盘和文件路径。

mc admin decommission start myminio/ https://minio-{01...04}.example.net:9000/mnt/disk{1...4}/minio,https://minio-{05...08}.example.net:9000/mnt/disk{1...4}/minio

该示例命令会在 myminio 部署上启动对所列两个匹配 服务器池 的退役。

在退役过程中,对于尚未迁移的对象,MinIO 会继续将读取操作(GETLISTHEAD)路由到这些 pool。 所有新的写入操作(PUT)都会被路由到部署中那些未计划退役的其余 pool。

已退役 pool 的排空一次只处理一个 pool,并按顺序依次完成每个 pool 的退役。 排空过程 不会 对所有待退役 pool 并发执行。

此时,负责管理部署连接的负载均衡器、反向代理或其他网络控制组件无需修改其配置。

3) 监控退役过程

使用 mc admin decommission status 命令监控退役过程。

mc admin decommission status myminio

命令返回的输出类似如下:

┌─────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────┬──────────┐
│ ID  │ Pools                                                          │ Capacity                         │ Status   │
│ 1st │ https://minio-{01...04}.example.com:9000/mnt/disk{1...4}/minio │  10 TiB (used) / 10  TiB (total) │ Draining │
│ 2nd │ https://minio-{05...08}.example.com:9000/mnt/disk{1...4}/minio │  95 TiB (used) / 100 TiB (total) │ Pending  │
│ 3rd │ https://minio-{09...12}.example.com:9000/mnt/disk{1...4}/minio │  40 TiB (used) / 500 TiB (total) │ Active   │
│ 4th │ https://minio-{13...16}.example.com:9000/mnt/disk{1...4}/minio │  0  TiB (used) / 500 TiB (total) │ Active   │
└─────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────┴──────────┘

你可以在命令中指定 服务器池 的描述,以获取更详细的信息:

mc admin decommission status myminio https://minio-{01...04}.example.com:9000/mnt/disk{1...4}/minio

命令返回的输出类似如下:

Decommissioning rate at 100MiB/sec [1TiB/10TiB]
Started: 30 minutes ago

mc admin decommission status 会在退役完成后将 Status 标记为 Complete。 当 MinIO 完成所有 pool 的退役后,你就可以继续下一步。

如果 Status 显示为 failed,你可以重新运行 mc admin decommission start 命令以恢复该过程。 如果失败持续存在,请使用 mc admin logs 或查看 systemd 日志(例如 journalctl -u minio),以定位更具体的错误。

4) 从部署配置中移除已退役的 Pool

退役完成后,你就可以安全地将这些 pool 从部署配置中移除。 请修改部署中每个剩余 MinIO server 的启动命令,并移除已退役 pool。

.deb.rpm 软件包会将 systemd 服务文件安装到 /lib/systemd/system/minio.service。 对于二进制安装,本步骤默认该文件已按照 安装与管理 流程手动创建。

minio.service 文件使用位于 /etc/default/minio 的环境文件读取配置设置,其中也包括启动配置。 具体来说,MINIO_VOLUMES 变量定义了启动命令:

cat /etc/default/minio | grep "MINIO_VOLUMES"

命令返回的输出类似如下:

MINIO_VOLUMES="https://minio-{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio-{5...8}.example.net:9000/mnt/disk{1...4}/minio https://minio-{9...12}.example.net:9000/mnt/disk{1...4}/minio"

编辑该环境文件,并从 MINIO_VOLUMES 的值中移除已退役 pool。

5) 更新网络控制平面

更新所有负载均衡器、反向代理或其他网络控制平面,从 MinIO 部署的连接配置中移除已退役的 服务器池。

网络控制平面组件的具体配置说明不在本步骤范围内。

6) 重启 MinIO 部署

在部署中的每个节点上 同时 执行以下命令,以重启 MinIO 服务:

sudo systemctl restart minio.service

Use the following commands to confirm the service is online and functional:

sudo systemctl status minio.service
journalctl -f -u minio.service

MinIO may log an increased number of non-critical warnings while the server processes connect and synchronize. These warnings are typically transient and should resolve as the deployment comes online.

MinIO 强烈建议同时重启一个部署中的所有 MinIO 服务端进程。 MinIO 操作具有原子性并保持严格一致。 因此,该重启过程不会中断应用或正在进行的操作。

不要 执行“滚动”重启(例如一次只重启一个节点)。

部署重新上线后,使用 mc admin info 确认部署中所有剩余 server 的运行状态。

24 - 在 macOS 上部署 Silo

本页介绍如何在 Apple macOS 主机上部署 Silo,用于开发与评估。

Silo 分别为 Intel 与 Apple Silicon 发布 macOS 归档。当前项目 CI 在 Linux 上运行,不能据此建立 macOS 支持生命周期保证,因此已删除继承自上游、已经过时的“支持版本”清单。在生产使用前,请验证精确的操作系统版本与工作负载。

本步骤包含对 单机多盘 (SNMD) 和 单机单盘 (SNSD) 拓扑的指导,适用于早期开发和评估环境。

本指南没有验证 macOS 主机上的多机多盘(MNMD)分布式配置。

注意事项

检查清单

在执行本步骤前,请先阅读我们发布的硬件、软件和安全检查清单。

纠删码校验

MinIO 会根据拓扑中的节点和驱动器总数,自动为集群确定默认的 纠删码 配置。 你可以在设置集群时配置按对象生效的 parity,也可以让 MinIO 选择默认值(生产级集群默认为 EC:4)。

校验值决定了对象可用性与磁盘存储占用之间的关系。 可使用 MinIO 纠删码计算器 选择适合你集群的纠删码校验级别。

虽然你可以随时更改纠删码校验设置,但以既有校验值写入的对象 不会 自动更新为新的校验设置。

步骤

1. 下载 Silo 二进制文件

下载与安装选择 Intel(darwin_amd64)或 Apple Silicon(darwin_arm64)归档。使用同一发布随附的校验和核验后,解压并安装 minio 兼容二进制:

tar -xzf minio_*_darwin_*.tar.gz
sudo install -m 0755 ./minio /usr/local/bin/minio
minio --version

本页原有 Homebrew 命令安装的是上游 MinIO formula,而不是 Silo,因此已经删除。

2. 启用 TLS 连接

你可以跳过此步骤,以在未启用 TLS 的情况下部署。 MinIO 强烈 不建议 在早期开发之外的场景中进行非 TLS 部署。

为 MinIO 创建或提供 传输层安全 (TLS) 证书,以自动启用 server 与客户端之间的 HTTPS 安全连接。

MinIO 要求私钥和公钥证书的默认文件名分别为 private.keypublic.crt。 请将证书放入专用目录:

mkdir -p /opt/minio/certs

cp private.key /opt/minio/certs
cp public.crt /opt/minio/certs

MinIO 会根据操作系统/系统默认的受信任证书颁发机构列表来验证客户端证书。 若要启用对第三方证书或内部签发证书的验证,请将 CA 文件放入 /opt/minio/certs/CAs 目录。 CA 文件应包含从叶子证书到根证书的完整信任链,以确保验证成功。

有关为 MinIO 配置 TLS 的更具体指导,包括通过 Server Name Indication (SNI) 支持多域名,请参阅 网络加密(TLS)

早期开发环境证书

对于本地测试或开发环境,你可以使用 MinIO certgen 生成自签名证书。 例如,以下命令会生成一组带有 IP 和 DNS Subject Alternate Names (SANs) 的自签名证书,这些 SAN 与 MinIO 服务端 主机关联:

certgen -host "localhost,minio-*.example.net"

将生成的 public.crtprivate.key 放入 /path/to/certs 目录,以为 MinIO 部署启用 TLS。 应用程序可以将 public.crt 作为受信任的证书颁发机构,从而在不禁用证书校验的情况下连接到 MinIO 部署。

3. 创建 MinIO 环境文件

/etc/default/minio 创建环境文件。 MinIO 服务将该文件作为 MinIO 以及 minio.service 文件所用全部 环境变量 的来源。

请根据你的部署拓扑修改示例。

在开发和评估环境中使用 单机多盘 部署。 对于能够容忍节点停机带来数据丢失或不可用的小型存储工作负载,也可以使用该拓扑。

# Set the volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following specifies a single host with 4 drives at the specified location
#
# The command includes the port that the MinIO server listens on
# (default 9000).
# If you run without TLS, change https -> http

MINIO_VOLUMES="https://minio1.example.net:9000/mnt/drive{1...4}/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

在早期开发和评估环境中使用 单机单盘(“Standalone”)部署。 MinIO 不建议在生产环境中使用 单机部署,因为节点或其存储介质丢失会导致数据丢失。

# Set the volume MinIO uses at startup
#
# The following specifies the drive or folder path

MINIO_VOLUMES="/mnt/drive1/minio"

# Set all MinIO server command-line options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces.
# The default behavior is dynamic port selection.

MINIO_OPTS="--console-address :9001 --certs-dir /opt/minio/certs"

# Set the root username.
# This user has unrestricted permissions to perform S3 and
# administrative API operations on any resource in the deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

请根据部署需要,指定其他 环境变量 或 server 命令行选项。

4. 启动 MinIO Server

以下命令会启动附着在当前终端/shell 窗口上的 MinIO Server:

export MINIO_CONFIG_ENV_FILE=/etc/default/minio
minio server --console-address :9001

命令输出类似如下:

MinIO 对象存储服务端
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2024-06-07T16-42-07Z (go1.22.4 linux/amd64)

API: https://minio-1.example.net:9000 https://203.0.113.10:9000 https://127.0.0.1:9000
   RootUser: minioadmin
   RootPass: minioadmin

WebUI: https://minio-1.example.net:9001 https://203.0.113.10:9001 https://127.0.0.1:9001
   RootUser: minioadmin
   RootPass: minioadmin

CLI: https://silo.pgsty.com/zh/reference/minio-mc/#quickstart
   $ mc alias set 'myminio' 'https://minio-1.example.net:9000' 'minioadmin' 'minioadmin'

Docs: https://silo.pgsty.com/zh/docs/
Status:         1 Online, 0 Offline.

API 区块列出了客户端可访问 MinIO S3 API 的网络接口和端口。 Console 区块列出了客户端可访问 MinIO Web Console 的网络接口和端口。

若要在后台运行 MinIO server 进程或以守护进程方式运行,请参阅 macOS 文档中的最佳实践和操作步骤。

5. 连接到部署

打开浏览器,并通过任一 MinIO 主机名的 :9001 端口访问 MinIO Console 登录页。 例如:https://minio1.example.com:9001

使用上一步中的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 登录。

MinIO Console 登录页

你可以使用 MinIO Console 执行常规管理任务,例如身份与访问管理、指标和日志监控,或 Server 配置。 每个 MinIO server 都包含自身内嵌的 MinIO Console。

请按照本地主机上的 mc 安装说明 完成安装。 运行 mc --version 验证安装结果。

如果你的 MinIO 部署使用第三方或自签名 TLS 证书,请将 CA 文件复制到 ~/.mc/certs/CAs,以便 mc 信任该证书链。

安装完成后,为该 MinIO 部署创建一个别名:

mc alias set myminio https://minio-1.example.net:9000 USERNAME PASSWORD

请根据你的部署修改主机名、用户名和密码。 主机名可以是部署中的任意一个 MinIO 节点。 你也可以指定负责处理部署连接的负载均衡器、反向代理或类似网络控制平面的主机名。

6. 后续步骤

25 - 从 Gateway 或 Filesystem 模式迁移

背景

MinIO Gateway 及相关 filesystem 模式自 2020 年 7 月起进入功能冻结状态。 2022 年 2 月,MinIO 宣布 弃用 MinIO Gateway。 在该弃用公告中,MinIO 同时宣布该功能将在六个月后移除。

RELEASE.2022-10-29T06-21-33Z 起,MinIO Gateway 和相关 filesystem 模式代码已被移除。 仍在使用 standalonefilesystem MinIO 模式的部署,一旦升级到 MinIO 服务端 RELEASE.2022-10-29T06-21-33Z 或更高版本,在尝试启动 MinIO 时会报错。

概览

若要升级到 RELEASE.2022-10-29T06-21-33Z 或更高版本,原先使用 standalonefilesystem 部署模式的用户必须新建一个 单机单盘 部署,并将设置和内容迁移到新部署中。

本文概述成功启动并迁移到新部署所需的步骤。

警告

重要

单机/文件系统 模式在截至 MinIO Server RELEASE.2022-10-24T18-35-07Z 的所有版本中仍可使用。 若要继续使用 standalone 部署,请安装该 MinIO 服务端版本以及 MinIO Client RELEASE.2022-10-29T10-09-23Z,或安装任意 更早版本 及其对应的 MinIO 客户端。请注意,MinIO Client 的版本应更新,且尽可能接近 MinIO 服务端的版本。

Filesystem 模式部署至少需要升级到 RELEASE.2022-06-25T15-50-16Z,才能使用 MinIO 客户端 的导入和导出命令。 对于截至 RELEASE.2022-06-20T23-13-45Z 的 filesystem 模式部署,可以通过在新部署上手动重建用户、策略、存储桶和其他资源完成迁移。

步骤

说明

说明

你可以通过环境变量和 mc admin config set 设置 MinIO 配置项。 根据你当前的部署方式,可能需要同时获取这两类配置值。

你可以使用 env | grep MINIO_ 查看运行时设置;对于使用 MinIO systemd 服务的部署,也可以直接检查 /etc/default/minio 的内容。

  1. 对于 filesystem 模式部署:

    如有需要,先升级现有部署。

    可接受的最低版本为:

    可接受的最高版本为:

  2. 创建新的 单机单盘 MinIO 部署。

    按照适用于所选操作系统的 安装说明,将安装配置为 单机单盘 (SNSD) 拓扑。

    部署位置可以是所选存储介质上的任意空目录。 如果现有部署不在磁盘根目录上,则同一块磁盘上的新目录也可以用于新部署。 如果现有 standalone 系统指向磁盘根目录,则新部署必须使用另一块独立磁盘。

    如果旧部署和新部署位于同一主机上:

    • 将新部署安装到不同于现有部署的路径。

    • 将新部署的 Console 和 API 端口设置为不同于现有部署的端口。

      以下命令行选项可在启动时设置端口:

    • 对于由 systemd 管理的部署:

      • 复制现有 /etc/default/minio 环境文件,并使用唯一的新文件名。
      • 在新部署的服务文件中,更新 EnvironmentFile 以引用新的环境文件。

    以下步骤会同时使用两个部署中的 mc 命令行工具。 现有 MinIO Client 指旧部署中的 mc新的 MinIO 客户端 指新部署中的 mc

  3. 使用 mc alias set 和新的 MinIO 客户端 为上一步创建的部署添加别名。

    mc alias set NEWALIAS PATH ACCESSKEY SECRETKEY
    • 使用新的 MinIO 客户端。
    • NEWALIAS 替换为要为该部署创建的别名。
    • PATH 替换为新部署的 IP 地址或主机名及端口。
    • ACCESSKEYSECRETKEY 替换为创建新部署时使用的凭证。
  4. 根据部署类型迁移设置:

    • MinIO Gateway 是一个无状态代理服务,为多种后端存储系统提供 S3 API 兼容层。
    • Filesystem 模式部署为单个 MinIO server 进程和单个存储卷提供 S3 访问层。

    迁移配置设置:

    如果你的部署使用 环境变量 作为配置方式,请将现有部署 /etc/default/minio 文件中的环境变量复制到新部署的同名文件中。 你可以省略所有 MINIO_CACHE_*MINIO_GATEWAY_SSE 环境变量,因为这些变量已不再使用。

    如果你使用 mc admin config set 管理配置,请使用新的 MinIO 客户端将现有设置复制到新部署中。

    说明

    说明

    以下 filesystem 模式步骤默认现有 MinIO Client 支持所需的导出命令。 如果不支持,请在新部署上使用新的 MinIO 客户端 手动重建用户、策略、生命周期规则和存储桶。

    1. 导出现有部署的 配置

      使用现有 MinIO Client 运行 mc admin config export,导出现有 standalone MinIO 部署中定义的配置。

      mc admin config export ALIAS > config.txt
      • 使用现有 MinIO Client。
      • ALIAS 替换为现有 standalone 部署的别名,也就是你要从中导出配置的目标。
    2. 使用新的 MinIO 客户端将现有 standalone 部署的 配置 导入到新部署。

      mc admin config import ALIAS < config.txt
      • 使用新的 MinIO 客户端。
      • ALIAS 替换为新部署的别名。

      如果 import 对某个配置键报错,请在对应行开头加上 # 注释掉,再重新尝试。 完成迁移后,请根据目标 MinIO 服务端版本核对当前配置语法,并使用 mc admin config set 手动设置所需键值。

    3. 使用新的 MinIO 客户端 重启新部署的服务。

      mc admin service restart ALIAS
      • 使用新的 MinIO 客户端。
      • ALIAS 替换为新部署的别名。
    4. 使用现有 MinIO Client 导出现有 standalone 部署的 存储桶元数据

      以下命令会将现有部署中的存储桶元数据导出到一个 .zip 文件中。

      数据包括:

      • 存储桶目标
      • 生命周期规则
      • 通知
      • 配额
      • 版本控制

      导出内容仅包含存储桶元数据。 此命令不会导出现有部署中的对象数据。

      mc admin cluster bucket export ALIAS
      • 使用现有 MinIO Client。
      • ALIAS 替换为现有部署的别名。

      此命令会生成 cluster-metadata.zip 文件,其中包含每个存储桶的元数据。

    5. 使用新的 MinIO 客户端将 存储桶元数据 导入到新部署。

      以下命令会读取导出的存储桶 .zip 文件内容,并在新部署上创建具有相同配置的存储桶。

      mc admin cluster bucket import ALIAS cluster-metadata.zip
      • 使用新的 MinIO 客户端。
      • ALIAS 替换为新部署的别名。

      该命令会依据现有部署导出的 .zip 文件中的元数据,在新部署上创建具有相同配置的存储桶。

    6. 使用现有 MinIO 客户端将现有 standalone 部署的 IAM 设置 导出到新部署。

      如果你使用的是外部身份与访问管理提供方,请在新部署中重建这些设置及所有关联策略。

      使用以下命令从现有部署导出 IAM 设置。 此命令会导出:

      • 组和组映射
      • STS 用户和 STS 用户映射
      • 策略
      • 用户和用户映射
      mc admin cluster iam export ALIAS
      • 使用现有 MinIO Client。
      • ALIAS 替换为现有部署的别名。

      此命令会生成包含 IAM 数据的 ALIAS-iam-info.zip 文件。

    7. 使用新的 MinIO 客户端将 IAM 设置 导入到新部署。

      使用导出的文件在新部署上创建 IAM 设置。

      mc admin cluster iam import ALIAS alias-iam-info.zip
      • 使用新的 MinIO 客户端。
      • ALIAS 替换为新部署的别名。
      • 将 zip 文件名替换为现有部署导出的文件名。
  5. 使用 mc mirror 迁移存储桶内容。

    在 standalone 部署上,使用现有 MinIO Client 运行带有 --preserve--watch 参数的 mc mirror,将对象迁移到新的 SNSD 部署中。

    mc mirror --preserve --watch SOURCE/BUCKET TARGET/BUCKET
    • 使用现有 MinIO Client。
    • SOURCE/BUCKET 替换为现有 standalone 部署的别名和存储桶。
    • TARGET/BUCKET 替换为新部署的别名和对应存储桶。
  6. 停止所有 S3 或 POSIX 客户端向 standalone 部署写入数据。

  7. 等待 mc mirror 完成所有存储桶的剩余操作。

  8. 停止两个部署的服务。

  9. 使用之前 standalone 部署所用的端口重启新的 MinIO 部署。

    确保应用所有环境变量和运行时配置设置,并验证新部署的行为是否符合预期。

26 - 扩展 Silo Tenant

本步骤说明如何通过在 Kubernetes 基础设施中部署额外的一组 MinIO pod,来扩展现有 MinIO tenant 的可用存储容量。

警告

重要

MinIO Operator Console 已被弃用,并在 Operator 6.0.0 中移除。

有关将通过 Operator Console 安装的 Tenant 迁移到 Kustomization 的说明,请参阅 修改 MinIO Tenant

前提条件

MinIO Kubernetes Operator

本页步骤 要求 已有一个有效的 MinIO Kubernetes Operator 安装,并假定本地主机也安装了与之匹配的 Operator。本页使用仓库归档前的最终上游版本 v7.1.1,仅作为冻结的兼容基线。

有关部署 MinIO Operator 的完整文档,请参阅 在 Kubernetes 上部署 MinIO

可用 Worker Nodes

MinIO 会为新的 Tenant pool 部署额外的 minio server pod。 Kubernetes 集群 必须 具备足够的可用 worker node 来调度这些新 pod。

MinIO Operator 提供了用于控制 pod affinity 和 anti-affinity 的配置,以便将调度定向到特定 worker。

持久卷

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

MinIO 可以使用任何支持 ReadWriteOnce 访问模式的 Kubernetes Persistent Volume (PV)。 MinIO 的一致性保证依赖于 ReadWriteOnce 提供的独占存储访问。

对于节点具有 Direct Attached Storage 的 Kubernetes 集群,MinIO 强烈建议使用 DirectPV CSI driver。 DirectPV 提供了一个分布式持久卷管理器,可在 Kubernetes 节点之间发现、格式化、挂载、调度和监控驱动器。 DirectPV 解决了手动配置和监控 local persistent volumes 的局限性。

说明

说明

EKS 上的 MinIO Tenant 必须使用 EBS CSI Driver 来预配所需的底层持久卷。 MinIO 强烈建议使用基于 SSD 的 EBS 卷以获得最佳性能。 有关 EBS 资源的更多信息,请参阅 EBS Volume Types

步骤

MinIO Operator 支持通过添加额外 pool 来扩展 MinIO Tenant。

  1. 检查描述 Tenant 对象(tenant.yaml)的 Kustomization 对象。

    spec.pools 数组描述当前的 pool 拓扑。

  2. spec.pools 数组中新增一个条目。

    新 pool 必须反映你期望的 Worker node、每个 server 的卷数量、存储类以及 affinity/scheduler 设置组合。 有关与 Pool 相关配置项的更完整文档,请参阅 MinIO 自定义资源定义

  3. 应用更新后的 Tenant 配置

    使用 kubectl apply 命令更新 Tenant:

    kubectl apply -k ~/kustomization/TENANT-NAME

    请根据本地配置修改 Kustomization 目录路径。

  1. 检查 Helm values.yaml 文件。

    tenant.pools 数组描述当前的 pool 拓扑。

  2. tenant.pools 数组中新增一个条目。

    新 pool 必须反映你期望的 Worker node、每个 server 的卷数量、存储类以及 affinity/scheduler 设置组合。 有关与 Pool 相关配置项的更完整文档,请参阅 租户 Helm Charts

  3. 应用更新后的 Tenant 配置

    使用 helm upgrade 命令更新 Tenant:

    helm upgrade TENANT-NAME minio-operator/tenant -f values.yaml -n TENANT-NAMESPACE

    上述命令默认使用的是 MinIO Operator Chart 仓库。 如果你是手动安装 Chart,或使用了不同的仓库名称,请在命令中指定相应的 chart 或名称。

    分别将 TENANT-NAMETENANT-NAMESPACE 替换为 Tenant 的名称和命名空间。 你可以使用 helm list -n TENANT-NAMESPACE 验证 Tenant 名称。

你可以使用 kubectl get events -n TENANT-NAMESPACE --watch 监控扩容进度。 MinIO Operator 会更新 service,以便在新节点之间正确路由连接。 如果你使用了自定义 service、route、ingress 或类似 Kubernetes 网络组件,可能还需要针对新的 pod 主机名范围更新这些组件。

27 - 外部身份管理

MinIO 支持通过以下 IDentity Providers (IDP) 对接多种外部身份管理器:

以下教程针对特定 IDP 软件提供了具体指导:

用户可以使用外部管理的凭证和相关的 Security Token Service (STS) API 对 MinIO 进行认证。 认证成功后,MinIO 会尝试将该用户与一个或多个已配置的 策略 关联。 未关联任何策略的用户,对 MinIO 部署不具备任何权限。

OpenID Connect (OIDC)

MinIO 支持使用兼容 OpenID Connect (OIDC) 的 IDentity Provider (IDP) 来管理外部用户身份,例如 Okta、KeyCloak、Dex、Google 或 Facebook。 配置外部 IDP 后,即可启用 Single-Sign On 工作流,应用程序会先向外部 IDP 完成认证,再访问 MinIO。

MinIO 使用 Policy Based Access Control (PBAC) 来定义认证用户可访问的操作和资源。 MinIO 支持创建和管理可供外部身份用户声明使用的 策略

对于由外部兼容 OpenID Connect (OIDC) 的提供方管理的身份,MinIO 使用 JSON Web Token claim 来识别应分配给认证用户的 策略

默认情况下,MinIO 会查找名为 policy 的 claim,并读取其中一个或多个策略名进行分配。 MinIO 会尝试将该 JWT claim 中列出的策略,与部署上已存在的策略进行匹配。 如果指定的策略在 MinIO 部署上一个都不存在,MinIO 会拒绝该用户发起的全部操作授权。 例如,考虑如下 claim 键值:

policy="readwrite_data,read_analytics,read_logs"

该策略 claim 指示 MinIO 将名称分别匹配 readwrite_dataread_analyticsread_logs 的策略附加到认证用户。

你可以通过 MINIO_IDENTITY_OPENID_CLAIM_NAME 环境变量设置自定义策略 claim, 或者 使用 mc admin config set 设置 identity_openid claim_name 配置项。

关于如何将 MinIO 策略映射到 OIDC 托管身份,请参见 OpenID Connect 访问管理

你可以使用 JWT Debugging tool 对返回的 JWT token 进行解码,并验证用户属性中是否包含指定 claim。 关于 JWT claim 的更多信息,请参见 RFC 7519: JWT Claim。 关于如何配置用户 claim,请以所选 OIDC 提供方的文档为准。

Active Directory / LDAP

MinIO 支持使用 Active Directory 或 LDAP (AD/LDAP) 服务对用户身份进行外部管理。 配置外部 IDentity Provider (IDP) 后,即可启用 Single-Sign On (SSO) 工作流,应用程序会先向外部 IDP 认证,再访问 MinIO。

查询 Active Directory / LDAP 服务

MinIO 会查询已配置的 Active Directory / LDAP 服务器,以验证应用程序提供的凭证,并可选地返回该用户所属组列表。 该过程称为 Lookup-Bind 模式,它使用一个权限最小化的 AD/LDAP 用户,仅用于在 AD/LDAP 服务器上执行用户与组查询所需的认证。

以下标签页给出了启用 Lookup-Bind 模式所需环境变量和配置项的参考:

AD/LDAP 托管身份的访问控制

MinIO 使用 Policy Based Access Control (PBAC) 来定义认证用户可访问的操作和资源。 在使用 Active Directory/LDAP 服务器进行身份管理(认证)时,MinIO 仍通过 PBAC 来维护访问控制(授权)。

当用户使用其 AD/LDAP 凭证成功认证到 MinIO 后,MinIO 会搜索所有显式关联到该用户 Distinguished Name (DN) 的 策略。 具体来说,必须使用 mc idp ldap policy attach 命令,将策略分配给拥有匹配 DN 的用户。

MinIO 还支持查询用户的 AD/LDAP 组成员关系。 MinIO 会尝试将已存在的策略与用户所属各组的 DN 进行匹配。 认证用户的完整权限集合由显式分配策略和从组继承的策略共同组成。 更多信息请参见 组查询

MinIO 默认采用 deny-by-default 行为,即未显式分配任何策略、也未从组继承任何策略的用户,无法访问 MinIO 部署中的任何资源。

MinIO 提供 内置策略 以满足基础访问控制需求。 你可以使用 mc admin policy create 命令创建新策略。

组查询

MinIO 支持向 Active Directory / LDAP 服务器查询认证用户所属组列表。 MinIO 会尝试将现有 策略 与各组 DN 进行匹配,并将所有匹配到的策略分配给认证用户。

以下标签页给出了启用组查询所需环境变量和配置项的参考:

关于这些变量的更多信息,请参见 Active Directory / LDAP 设置 参考文档。配置 MinIO 使用 Active Directory / LDAP 进行认证 教程中包含这些值的完整配置说明。

关于这些设置的更多信息,请参见 identity_ldap 参考文档。 配置 MinIO 使用 Active Directory / LDAP 进行认证 教程中包含这些变量的完整配置说明。

27.1 - 配置 Silo 使用 Active Directory / LDAP 进行认证

概览

MinIO 支持配置单个 Active Directory / LDAP 连接,用于对用户身份进行外部管理。

本页流程提供以下内容的操作说明:

对于使用 MinIO Kubernetes Operator 部署的 MinIO Tenant,本流程包括:

  • 配置 MinIO Tenant 使用外部 AD/LDAP 提供方
  • 使用 AD/LDAP 凭证访问 Tenant Console
  • 使用 MinIO AssumeRoleWithLDAPIdentity Security Token Service (STS) API 生成供应用程序使用的临时凭证

对于部署在裸金属基础设施上的 MinIO,本流程包括:

  • 为 MinIO 集群配置外部 AD/LDAP 提供方
  • 使用 AD/LDAP 凭证访问 MinIO Console
  • 使用 MinIO AssumeRoleWithLDAPIdentity Security Token Service (STS) API 生成供应用程序使用的临时凭证

本流程是面向 AD/LDAP 服务的通用配置流程。 有关用户身份配置的具体步骤,请参阅你所选 AD/LDAP 提供方的文档。

前提条件

访问 MinIO 集群

你必须能够访问 MinIO Operator Console Web UI。 你可以使用自己偏好的 Kubernetes 路由组件暴露 MinIO Operator Console service,也可以通过临时端口转发,在本地机器上暴露 Console service 端口。

本流程使用 mc 对 MinIO 集群执行操作。 请在一台能够访问该集群网络的机器上安装 mc。 关于如何下载和安装 mc,请参见 mc 安装快速开始

本流程假定已为 MinIO 集群配置 alias

兼容 Active Directory / LDAP 的身份提供方

本流程假定你已经拥有一个现成的 Active Directory 或 LDAP 服务。 AD/LDAP 本身的配置不在本流程范围内。

  • 如果 AD/LDAP 部署与 MinIO Tenant 位于同一 Kubernetes 集群内,你可以使用 Kubernetes service 名称,让 MinIO Tenant 能够连接到 AD/LDAP 服务。
  • 如果 AD/LDAP 部署位于 Kubernetes 集群外部,则必须确保该集群支持 Kubernetes services、pods 与外部网络之间的通信路由。 这可能需要配置或部署额外的 Kubernetes 网络组件,和/或启用访问公网的能力。

MinIO 部署必须与目标 AD / LDAP 服务保持双向网络连通。

MinIO 需要一组只读访问凭证,以便通过 bind 执行认证用户和组查询。 请确保每个打算与 MinIO 配合使用的 AD/LDAP 用户和组,都在 MinIO 部署上拥有对应的 策略。 如果某个 AD/LDAP 用户没有分配任何策略,并且 所属组也都没有分配任何策略,那么该用户无权访问 MinIO 集群中的任何操作或资源。

为 MinIO 配置 Active Directory 或 LDAP 外部身份管理

  1. 设置 Active Directory / LDAP 配置项

    你可以使用以下任一方式配置 AD/LDAP 提供方:

    • MinIO Client
    • 环境变量

    所有方式都需要启动或重启 MinIO 部署后才能生效。

    以下选项卡给出了可用配置方式的速查:

    MinIO 支持使用 mc idp ldap 命令配置 AD/LDAP 提供方设置。

    对于分布式部署,mc idp ldap 命令会将配置应用到部署中的所有节点。

    以下示例代码设置了外部身份管理所需的全部 AD/LDAP 相关配置项。 至少需要以下设置:

    mc idp ldap add ALIAS                                                  \
      server_addr="ldaps.example.net:636"                                  \
      lookup_bind_dn="CN=xxxxx,OU=xxxxx,OU=xxxxx,DC=example,DC=net"        \
      lookup_bind_password="xxxxxxxx"                                      \
      user_dn_search_base_dn="DC=example,DC=net"                           \
      user_dn_search_filter="(&(objectCategory=user)(sAMAccountName=%s))"  \
      group_search_filter= "(&(objectClass=group)(member=%d))"             \
      group_search_base_dn="ou=MinIO Users,dc=example,dc=net"              \
      tls_skip_verify="off"                                                \
      server_insecure=off                                                  \
      server_starttls="off"                                                \
      srv_record_name=""                                                   \
      comment="Test LDAP server"

    对于 Kubernetes 部署,请确保 ALIAS 对应 MinIO Tenant 的外部可访问主机名。

    这些设置的完整文档请参阅 mc idp ldap

    说明

    建议使用 mc idp ldap

    相比 mc admin config set 运行时配置, mc idp ldap 提供了更多功能和更完善的校验能力。 mc idp ldap 支持与 mc admin config 以及 identity_ldap 配置键相同的设置项。

    identity_ldap 配置键仍可用于现有脚本和工具。

    MinIO 支持使用 环境变量 指定 AD/LDAP 提供方设置。minio server 进程会在下一次启动时应用这些设置。 对于分布式部署,请在部署中的所有节点上使用 相同 的值设置这些变量。 节点之间的配置不一致会导致启动或配置失败。

    以下示例代码设置了外部身份管理所需的全部 AD/LDAP 相关环境变量。 至少需要以下变量:

    export MINIO_IDENTITY_LDAP_SERVER_ADDR="ldaps.example.net:636"
    export MINIO_IDENTITY_LDAP_LOOKUP_BIND_DN="CN=xxxxx,OU=xxxxx,OU=xxxxx,DC=example,DC=net"
    export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_BASE_DN="dc=example,dc=net"
    export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER="(&(objectCategory=user)(sAMAccountName=%s))"
    export MINIO_IDENTITY_LDAP_LOOKUP_BIND_PASSWORD="xxxxxxxxx"
    export MINIO_IDENTITY_LDAP_GROUP_SEARCH_FILTER="(&(objectClass=group)(member=%d))"
    export MINIO_IDENTITY_LDAP_GROUP_SEARCH_BASE_DN="ou=MinIO Users,dc=example,dc=net"
    export MINIO_IDENTITY_LDAP_TLS_SKIP_VERIFY="off"
    export MINIO_IDENTITY_LDAP_SERVER_INSECURE="off"
    export MINIO_IDENTITY_LDAP_SERVER_STARTTLS="off"
    export MINIO_IDENTITY_LDAP_SRV_RECORD_NAME=""
    export MINIO_IDENTITY_LDAP_COMMENT="LDAP test server"

    这些变量的完整文档请参阅 Active Directory / LDAP 设置

  2. 重启 MinIO 部署

    你必须重启 MinIO 部署,才能应用这些配置更改。

    如果你是在 MinIO Console 中配置 AD/LDAP,则无需额外操作。 MinIO Console 会在保存新的 AD/LDAP 配置后自动重启部署。

    对于 MinIO Client 和环境变量方式,请使用 mc admin service restart 命令重启部署:

    mc admin service restart ALIAS

    ALIAS 替换为要重启部署的 alias

  3. 使用 AD/LDAP 凭证登录 MinIO Console

    MinIO Console 支持完整工作流,包括向 AD/LDAP 提供方认证、 使用 MinIO AssumeRoleWithLDAPIdentity Security Token Service (STS) 端点生成临时凭证, 以及将用户登录到 MinIO 部署。

    你可以通过访问 MinIO 集群的根 URL 打开 Console, 例如 https://minio.example.net:9000

    登录后,你可以执行该认证用户 被授权 的任何操作。

    你还可以为必须在 MinIO 上执行操作的支持型应用程序创建 access key。 Access Key 是长期有效的凭证,会继承父用户的权限。 父用户还可以在创建服务账户时进一步限制这些权限。

  4. 使用 AD/LDAP 凭证生成 S3 兼容临时凭证

    MinIO 要求客户端使用 AWS Signature Version 4 协议 进行认证,同时兼容已弃用的 Signature Version 2 协议。 具体来说,客户端必须提供有效的 access key 和 secret key, 才能访问任意 S3 或 MinIO 管理 API,例如 PUTGETDELETE

    应用程序可以按需使用 AssumeRoleWithLDAPIdentity Security Token Service (STS) API 端点 和 AD/LDAP 用户凭证生成临时访问凭证。 MinIO 提供了示例 Go 应用程序 ldap.go, 用于演示该工作流。

    POST https://minio.example.net?Action=AssumeRoleWithLDAPIdentity
    &LDAPUsername=USERNAME
    &LDAPPassword=PASSWORD
    &Version=2011-06-15
    &Policy={}
    • LDAPUsername 替换为 AD/LDAP 用户名。

    • LDAPPassword 替换为 AD/LDAP 用户密码。

    • Policy 替换为内联、经过 URL 编码的 JSON policy, 以进一步限制这些临时凭证关联的权限。

      如果省略,则会使用名称与 AD/LDAP 用户 Distinguished Name (DN) 匹配的 policy

    API 响应为 XML 文档,其中包含 access key、secret key、session token 和过期时间。 应用程序可使用 access key 和 secret key 访问 MinIO 并执行操作。

    参考文档请参阅 AssumeRoleWithLDAPIdentity

禁用已配置的 Active Directory / LDAP 连接

说明

新增: RELEASE.2023-03-20T20-16-18Z

你可以按需启用或禁用已配置的 AD/LDAP 连接。

使用 mc idp ldap disable 停用已配置连接。 使用 mc idp ldap enable 激活此前已配置的连接。

27.2 - 配置 Silo 使用 Keycloak 进行认证

概览

本流程将 MinIO 配置为通过 OpenID Connect (OIDC) 协议,使用 Keycloak 作为外部 Identity Provider (IDP) 来认证用户。

本页提供了在 Kubernetes 和裸金属 基础设施上的 MinIO 部署中配置 OIDC 的流程。

请选择与你基础设施对应的标签页,在不同说明集之间切换。

对于使用 MinIO Kubernetes Operator 部署的 MinIO Tenant,本流程包括:

  • 配置 Keycloak 以配合 MinIO 认证与授权
  • 配置新的或现有的 MinIO Tenant,使其使用 Keycloak 作为 OIDC 提供方
  • 创建用于控制 Keycloak 认证用户访问权限的策略
  • 使用 SSO 和 Keycloak 托管身份登录 MinIO Tenant Console
  • 使用 AssumeRoleWithWebIdentity Security Token Service (STS) API 生成临时 S3 访问凭证

对于部署在裸金属基础设施上的 MinIO,本流程包括:

  • 配置 Keycloak 以配合 MinIO 认证与授权
  • 配置新的或现有的 MinIO 集群,使其使用 Keycloak 作为 OIDC 提供方
  • 创建用于控制 Keycloak 认证用户访问权限的策略
  • 使用 SSO 和 Keycloak 托管身份登录 MinIO Console
  • 使用 AssumeRoleWithWebIdentity Security Token Service (STS) API 生成临时 S3 访问凭证

本流程基于 Keycloak 21.0.0 编写并完成测试。 这些说明也可能适用于其他 Keycloak 版本。 本流程假定你已经具备 Keycloak 的使用经验,并已阅读 其文档,以获取部署、配置和管理该服务的指导和最佳实践。

前提条件

Keycloak 部署与 Realm 配置

本流程假定你已经拥有一个现成的 Keycloak 部署,并且具备其管理访问权限。 具体来说,你必须拥有在该 Keycloak 部署上创建和配置 Realms、Clients、Client Scopes、Realm Roles、Users 和 Groups 的权限。

对于与 MinIO Tenant 位于同一 Kubernetes 集群内的 Keycloak 部署,本流程假定 Keycloak 与 MinIO 的 pods/services 之间具备双向访问能力。 对于位于 Kubernetes 集群外部的 Keycloak 部署,本流程假定已经存在用于管理 MinIO Tenant 入站和出站访问的 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件。

MinIO 部署必须与目标 OIDC 服务保持双向访问。

请确保每个打算与 MinIO 配合使用的用户身份,都配置了合适的 claim,以便 MinIO 能将认证用户关联到某个 策略。 未分配任何策略的 OpenID 用户,无权访问 MinIO 集群中的任何操作或资源。

访问 MinIO 集群

你必须能够访问 MinIO Operator Console Web UI。 你可以使用自己偏好的 Kubernetes 路由组件暴露 MinIO Operator Console Service,也可以通过临时端口转发,在本地机器上暴露 Console Service 端口。

本流程使用 mc 对 MinIO 集群执行操作。 请在一台能够访问该集群网络的机器上安装 mc。 关于如何下载和安装 mc,请参见 mc 安装快速开始

本流程假定已为 MinIO 集群配置 alias

为 MinIO 配置 Keycloak 身份管理

  1. 配置或创建用于访问 Keycloak 的 Client

    认证到 Keycloak Administrative Console,然后进入 Clients

    选择 Create client,按照提示为 MinIO 创建一个新的 Keycloak client。 按如下方式填写指定输入项:

    Client ID

    设置为 MinIO 的唯一标识符(minio

    Client type

    设置为 OpenID Connect

    Always display in console

    切换为 On

    Client authentication

    切换为 On

    Authentication flow

    打开 Standard flow

    (可选)Authentication flow

    打开 Direct access grants (API 测试)

    Keycloak 会以一组默认配置值部署该 client。 请根据你的 Keycloak 环境和期望行为按需修改这些值。 下表提供了一组可用于配置的基线设置和值:

    Root URL

    设置为 ${authBaseUrl}

    Home URL

    设置为 MinIO 要使用的 Realm(/realms/master/account/

    Valid Redirect URI

    设置为 *

    Keys -> Use JWKS URL

    切换为 On

    Advanced -> Advanced Settings -> Access Token Lifespan

    设置为 1 Hour

  2. 为 MinIO Client 创建 Client Scope

    Client scope 允许 Keycloak 在认证请求返回的 JSON Web Token(JWT)中映射用户属性。 这样 MinIO 就可以在向用户分配策略时引用这些属性。 这一步会创建在 Keycloak 认证成功后支持 MinIO 授权所需的 client scope。

    进入 Client scopes 视图,为 MinIO 授权创建一个新的 client scope:

    Name

    设置为任意易识别的策略名称(minio-authorization

    Include in token scope

    切换为 On

    创建完成后,从列表中选中该 scope,并进入 Mappers

    选择 Configure a new mapper 创建新的映射:

    User Attribute

    选择 Mapper Type

    Name

    设置为任意易识别的映射名称(minio-policy-mapper

    User Attribute

    设置为 policy

    Token Claim Name

    设置为 policy

    Add to ID token

    设置为 On

    Claim JSON Type

    设置为 String

    Multivalued

    设置为 On

    这样可以在单个 claim 中设置多个 policy 值。

    Aggregate attribute values

    设置为 On

    这样用户就可以继承其所属 Group 中设置的任意 policy

    创建完成后,将该 Client Scope 分配给 MinIO client。

    1. 进入 Clients 并选择 MinIO client。
    2. 选择 Client scopes,然后选择 Add client scope
    3. 选择先前创建的 scope,并将 Assigned type 设置为 default
  3. 将所需属性应用到 Keycloak Users/Groups

    你必须为 Keycloak Users 或 Groups 分配一个名为 policy 的属性。 将其值设置为 MinIO 部署上的任意 policy

    对于 Users,进入 Users 并选择或创建 User:

    Credentials

    如果尚未设置,将用户密码设置为永久值

    Attributes

    创建一个新属性,键为 policy,值为 MinIO 部署上的任意 policyconsoleAdmin

    对于 Groups,进入 Groups 并选择或创建 Group:

    Attributes

    创建一个新属性,键为 policy,值为 MinIO 部署上的任意 policyconsoleAdmin

    你可以将用户加入组,使其继承指定的 policy 属性。 如果 Mapper 设置中启用了 Aggregate attribute values, Keycloak 会在已认证用户的 JWT token 中包含聚合后的策略数组。 MinIO 可以在为用户授权时使用这份策略列表。

    你可以使用 Keycloak API 测试某个用户配置的策略:

    curl -d "client_id=minio" \
         -d "client_secret=secretvalue" \
         -d "grant_type=password" \
         -d "username=minio-user-1" \
         -d "password=minio-user-1-password" \
         http://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/protocol/openid-connect/token

    如果成功,access_token 中会包含调用 MinIO AssumeRoleWithWebIdentity STS API 并生成 S3 凭证所需的 JWT。

    你可以使用 JWT 解码器检查其载荷,确认其中包含 policy 键, 且列出了一个或多个 MinIO policy。

  4. 为 Keycloak 认证配置 MinIO

你可以使用 mc idp openid add 命令为 Keycloak 服务创建新配置。 该命令接受所有受支持的 OpenID Configuration Settings

mc idp openid add ALIAS PRIMARY_IAM \
   client_id=MINIO_CLIENT \
   client_secret=MINIO_CLIENT_SECRET \
   config_url="https://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/.well-known/openid-configuration" \
   display_name="SSO_IDENTIFIER"
   scopes="openid,email,preferred_username" \
   redirect_uri_dynamic="on"

PRIMARY_IAM

设置为该 Keycloak 服务的唯一标识符,例如 keycloak_primary

MINIO_CLIENT
MINIO_CLIENT_SECRET

设置为步骤 1 中配置的 Keycloak client ID 和 secret

config_url

设置为 Keycloak OpenID 配置文档的地址(keycloak-service.keycloak-namespace.svc.cluster-domain.example)

display_name

设置为 MinIO Console 在单点登录(SSO)流程中向用户显示的该 Keycloak 服务名称

scopes

设置为你希望包含在 JWT 中的 OpenID scope 列表,例如 preferred_usernameemail

redirect_uri_dynamic

设置为 on

这会将客户端所使用的 MinIO Console 地址替换到 Keycloak 重定向 URI 中。 Keycloak 会使用提供的 URI 将已认证用户返回到 Console。

对于位于反向代理、负载均衡器或类似网络控制平面之后的 MinIO Console 部署, 你也可以使用 MINIO_BROWSER_REDIRECT_URL 变量设置 Keycloak 应使用的重定向地址。

重启 MinIO 部署以应用这些更改。

检查 MinIO 日志,确认启动成功,且没有与 OIDC 配置相关的错误。

  1. 使用 Security Token Service(STS)生成应用程序凭证

    使用 S3 兼容 SDK 的应用程序必须以 Access Key 和 Secret Key 的形式提供凭证。 MinIO AssumeRoleWithWebIdentity API 会使用 Keycloak 在认证后返回的 JWT 返回所需的临时凭证, 其中包括必须提供的 session token。

    你可以使用以下 HTTP 调用序列和 curl 工具测试这一工作流:

    1. 以 Keycloak 用户身份认证并获取 JWT token

      curl -X POST "https://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/protocol/openid-connect/token" \
           -H "Content-Type: application/x-www-form-urlencoded" \
           -d "username=USER" \
           -d "password=PASSWORD" \
           -d "grant_type=password" \
           -d "client_id=CLIENT" \
           -d "client_secret=SECRET"
      • USERPASSWORD 替换为 REALM 中某个 Keycloak 用户的凭证。
      • CLIENTSECRET 替换为该 REALM 中 MinIO 专用 Keycloak client 的 ID 和 secret。

      你可以使用 jq 或类似的 JSON 格式化工具处理返回结果。 提取 access_token 字段以获取所需的访问 token。 同时关注 expires_in 字段,以了解 token 过期前还剩多少秒。

    2. 使用 AssumeRoleWithWebIdentity API 生成 MinIO 凭证

      curl -X POST "https://minio.minio-tenant.svc.cluster-domain.example" \
           -H "Content-Type: application/x-www-form-urlencoded" \
           -d "Action=AssumeRoleWithWebIdentity" \
           -d "Version=2011-06-15" \
           -d "DurationSeconds=86000" \
           -d "WebIdentityToken=TOKEN"

      TOKEN 替换为 Keycloak 返回的 access_token 值。

      API 成功时会返回一个 XML 文档,其中包含以下键:

      • Credentials.AccessKeyId - Keycloak 用户的 Access Key
      • Credentials.SecretAccessKey - Keycloak 用户的 Secret Key
      • Credentials.SessionToken - Keycloak 用户的 Session Token
      • Credentials.Expiration - 生成凭证的过期时间
    3. 测试这些凭证

      使用你偏好的 S3 兼容 SDK,利用生成的凭证连接到 MinIO。

      例如,下面的 Python 代码使用 MinIO Python SDK 连接到 MinIO 部署并返回存储桶列表:

      from minio import Minio
      
      client = MinIO(
         "minio.minio-tenant.svc.cluster-domain.example",
         access_key = "ACCESS_KEY",
         secret_key = "SECRET_KEY",
         session_token = "SESSION_TOKEN"
         secure = True
      )
      
      client.list_buckets()
  2. 后续步骤

应用程序应使用其选择的 SDK 实现 STS AssumeRoleWithWebIdentity 流程。 当 STS 凭证过期时,应用程序应具备在重试并继续操作之前重新生成 JWT token、 STS token 和 MinIO 凭证的逻辑。

或者,用户也可以通过 MinIO Console 使用其 Keycloak 凭证生成 access keys, 以创建类似长期 API key 的访问方式。

  1. 配置或创建用于访问 Keycloak 的 Client

    认证到 Keycloak Administrative Console,然后进入 Clients

    选择 Create client,按照提示为 MinIO 创建一个新的 Keycloak client。 按如下方式填写指定输入项:

    Client ID

    设置为 MinIO 的唯一标识符(minio

    Client type

    设置为 OpenID Connect

    Always display in console

    切换为 On

    Client authentication

    切换为 On

    Authentication flow

    打开 Standard flow

    (可选)Authentication flow

    打开 Direct access grants (API 测试)

    Keycloak 会以一组默认配置值部署该 client。 请根据你的 Keycloak 环境和期望行为按需修改这些值。 下表提供了一组可用于配置的基线设置和值:

    Root URL

    设置为 ${authBaseUrl}

    Home URL

    设置为 MinIO 要使用的 Realm(/realms/master/account/

    Valid Redirect URI

    设置为 *

    Keys -> Use JWKS URL

    切换为 On

    Advanced -> Advanced Settings -> Access Token Lifespan

    设置为 1 Hour

  2. 为 MinIO Client 创建 Client Scope

    Client Scope 允许 Keycloak 在认证请求返回的 JSON Web Token(JWT)中映射用户属性。 这样 MinIO 就可以在向用户分配策略时引用这些属性。 此步骤会创建在 Keycloak 认证成功后支持 MinIO 授权所需的 Client Scope。

    进入 Client scopes 视图,为 MinIO 授权创建一个新的 client scope:

    Name

    设置为任意易识别的策略名称(minio-authorization

    Include in token scope

    切换为 On

    创建完成后,从列表中选中该 scope,并进入 Mappers

    选择 Configure a new mapper 创建新的映射:

    User Attribute

    选择 Mapper Type

    Name

    设置为任意易识别的映射名称(minio-policy-mapper

    User Attribute

    设置为 policy

    Token Claim Name

    设置为 policy

    Add to ID token

    设置为 On

    Claim JSON Type

    设置为 String

    Multivalued

    设置为 On

    这样可以在单个 claim 中设置多个 policy 值。

    Aggregate attribute values

    设置为 On

    这样用户就可以继承其所属 Group 中设置的任意 policy

    创建完成后,将该 Client Scope 分配给 MinIO client。

    1. 进入 Clients 并选择 MinIO client。
    2. 选择 Client scopes,然后选择 Add client scope
    3. 选择先前创建的 scope,并将 Assigned type 设置为 default
  3. 将所需属性应用到 Keycloak Users/Groups

    必须为 Keycloak Users 或 Groups 分配一个名为 policy 的属性。 将其值设置为 MinIO 部署上的任意 policy

    对于 Users,进入 Users 并选择或创建 User:

    Credentials

    如果尚未设置,将用户密码设置为永久值

    Attributes

    创建一个新属性,键为 policy,值为 MinIO 部署上的任意 policyconsoleAdmin

    对于 Groups,进入 Groups 并选择或创建 Group:

    Attributes

    创建一个新属性,键为 policy,值为 MinIO 部署上的任意 policyconsoleAdmin

    你可以将用户加入组,使其继承指定的 policy 属性。 如果 Mapper 设置中启用了 Aggregate attribute values, Keycloak 会在已认证用户的 JWT token 中包含聚合后的策略数组。 MinIO 可以在为用户授权时使用这份策略列表。

    你可以使用 Keycloak API 测试某个用户配置的策略:

    curl -d "client_id=minio" \
         -d "client_secret=secretvalue" \
         -d "grant_type=password" \
         -d "username=minio-user-1" \
         -d "password=minio-user-1-password" \
         http://keycloak-url.example.net:8080/realms/REALM/protocol/openid-connect/token

    如果成功,access_token 中会包含调用 MinIO AssumeRoleWithWebIdentity STS API 并生成 S3 凭证所需的 JWT。

    你可以使用 JWT 解码器检查其载荷,确认其中包含 policy 键, 且列出了一个或多个 MinIO policy。

  4. 为 Keycloak 认证配置 MinIO

    MinIO 支持多种配置 Keycloak 认证的方法:

    • 使用终端/shell 以及 mc idp openid 命令
    • 使用在启动 MinIO 之前设置的环境变量

你可以使用 mc idp openid add 命令为 Keycloak 服务创建新配置。 该命令接受所有受支持的 OpenID Configuration Settings

mc idp openid add ALIAS PRIMARY_IAM \
   client_id=MINIO_CLIENT \
   client_secret=MINIO_CLIENT_SECRET \
   config_url="https://keycloak-url.example.net:8080/realms/REALM/.well-known/openid-configuration" \
   display_name="SSO_IDENTIFIER"
   scopes="openid,email,preferred_username" \
   redirect_uri_dynamic="on"

PRIMARY_IAM

设置为该 Keycloak 服务的唯一标识符,例如 keycloak_primary

MINIO_CLIENT
MINIO_CLIENT_SECRET

设置为步骤 1 中配置的 Keycloak client ID 和 secret

config_url

设置为 Keycloak OpenID 配置文档的地址(keycloak-url.example.net:8080)

display_name

设置为 MinIO Console 在单点登录(SSO)流程中向用户显示的该 Keycloak 服务名称

scopes

设置为你希望包含在 JWT 中的 OpenID scope 列表,例如 preferred_usernameemail

redirect_uri_dynamic

设置为 on

这会将客户端所使用的 MinIO Console 地址替换到 Keycloak 重定向 URI 中。 Keycloak 会使用提供的 URI 将已认证用户返回到 Console。

对于位于反向代理、负载均衡器或类似网络控制平面之后的 MinIO Console 部署, 你也可以使用 MINIO_BROWSER_REDIRECT_URL 变量设置 Keycloak 应使用的重定向地址。

在使用 -e ENVVAR=VALUE 标志启动容器之前, 设置以下 环境变量

下面的示例代码设置了将 Keycloak 配置为外部身份管理提供者所需的最小环境变量集合。

MINIO_IDENTITY_OPENID_CONFIG_URL_PRIMARY_IAM="https://keycloak-url.example.net:8080/realms/REALM/.well-known/openid-configuration"
MINIO_IDENTITY_OPENID_CLIENT_ID_PRIMARY_IAM="MINIO_CLIENT"
MINIO_IDENTITY_OPENID_CLIENT_SECRET_PRIMARY_IAM="MINIO_CLIENT_SECRET"
MINIO_IDENTITY_OPENID_DISPLAY_NAME_PRIMARY_IAM="SSO_IDENTIFIER"
MINIO_IDENTITY_OPENID_SCOPES_PRIMARY_IAM="openid,email,preferred_username"
MINIO_IDENTITY_OPENID_REDIRECT_URI_DYNAMIC_PRIMARY_IAM="on"

_PRIMARY_IAM

将后缀 _PRIMARY_IAM 替换为该 Keycloak 配置的唯一标识符。 例如,MINIO_IDENTITY_OPENID_CONFIG_URL_KEYCLOAK_PRIMARY

如果你只打算为该部署配置单个 OIDC 提供者,也可以省略该后缀。

CONFIG_URL

指定 Keycloak OpenID 配置文档的地址(keycloak-url.example.net:8080)

确保其中的 REALM 与你希望用于 MinIO 用户认证的 Keycloak realm 一致

CLIENT_ID
CLIENT_SECRET

指定步骤 1 中配置的 Keycloak client ID 和 secret

DISPLAY_NAME

指定 MinIO Console 在单点登录(SSO)流程中向用户显示的该 Keycloak 服务名称

OPENID_SCOPES

指定你希望包含在 JWT 中的 OpenID scope,例如 preferred_usernameemail

REDIRECT_URI_DYNAMIC

设置为 on

这会将客户端所使用的 MinIO Console 地址替换到 Keycloak 重定向 URI 中。 Keycloak 会使用提供的 URI 将已认证用户返回到 Console。

对于位于反向代理、负载均衡器或类似网络控制平面之后的 MinIO Console 部署, 你也可以使用 MINIO_BROWSER_REDIRECT_URL 变量设置 Keycloak 应使用的重定向地址。

有关这些变量的完整文档,请参见 OpenID 身份管理设置

重启 MinIO 部署以应用这些更改。

检查 MinIO 日志,确认启动成功,且没有与 OIDC 配置相关的错误。

如果尝试通过 Console 登录,现在应能看到一个使用已配置 Display Name 的(SSO)按钮。

指定一个已配置的用户并尝试登录。 MinIO 应自动将您重定向到 Keycloak 登录页面。 认证成功后,Keycloak 应使用原始 Console URL 或已配置的 Redirect URI 将您重定向回 MinIO Console。 5. 使用 Security Token Service(STS)生成应用程序凭证

使用 S3 兼容 SDK 的应用程序必须以 Access Key 和 Secret Key 的形式提供凭证。 MinIO AssumeRoleWithWebIdentity API 会使用 Keycloak 在认证后返回的 JWT 返回所需的临时凭证, 其中包括必须提供的 session token。

你可以使用以下 HTTP 调用序列和 curl 工具测试这一工作流:

  1. 以 Keycloak 用户身份认证并获取 JWT token

    curl -X POST "https://keycloak-url.example.net:8080/realms/REALM/protocol/openid-connect/token" \
         -H "Content-Type: application/x-www-form-urlencoded" \
         -d "username=USER" \
         -d "password=PASSWORD" \
         -d "grant_type=password" \
         -d "client_id=CLIENT" \
         -d "client_secret=SECRET"
    • USERPASSWORD 替换为 REALM 中某个 Keycloak 用户的凭证。
    • CLIENTSECRET 替换为该 REALM 中 MinIO 专用 Keycloak client 的 ID 和 secret。

    你可以使用 jq 或类似的 JSON 格式化工具处理返回结果。 提取 access_token 字段以获取所需的访问 token。 同时关注 expires_in 字段,以了解 token 过期前还剩多少秒。

  2. 使用 AssumeRoleWithWebIdentity API 生成 MinIO 凭证

    curl -X POST "https://minio-url.example.net:9000" \
         -H "Content-Type: application/x-www-form-urlencoded" \
         -d "Action=AssumeRoleWithWebIdentity" \
         -d "Version=2011-06-15" \
         -d "DurationSeconds=86000" \
         -d "WebIdentityToken=TOKEN"

    TOKEN 替换为 Keycloak 返回的 access_token 值。

    API 成功时会返回一个 XML 文档,其中包含以下键:

    • Credentials.AccessKeyId - Keycloak 用户的 Access Key
    • Credentials.SecretAccessKey - Keycloak 用户的 Secret Key
    • Credentials.SessionToken - Keycloak 用户的 Session Token
    • Credentials.Expiration - 生成凭证的过期时间
  3. 测试这些凭证

    使用你偏好的 S3 兼容 SDK,利用生成的凭证连接到 MinIO。

    例如,下面的 Python 代码使用 MinIO Python SDK 连接到 MinIO 部署并返回存储桶列表:

    from minio import Minio
    
    client = MinIO(
       "minio-url.example.net:9000",
       access_key = "ACCESS_KEY",
       secret_key = "SECRET_KEY",
       session_token = "SESSION_TOKEN"
       secure = True
    )
    
    client.list_buckets()
  4. 后续步骤

    应用程序应使用所选 SDK 实现 STS AssumeRoleWithWebIdentity 流程。 当 STS 凭证过期时,应用程序应具备在重试并继续操作之前重新生成 JWT token、 STS token 和 MinIO 凭证的逻辑。

    或者,用户也可以通过 MinIO Console 使用其 Keycloak 凭证生成 access keys, 以创建类似长期 API key 的访问方式。

启用 Keycloak Admin REST API

MinIO 支持使用 Keycloak Admin REST API 检查认证用户是否存在,以及 该用户是否在 Keycloak realm 中处于启用状态。 这一功能使 MinIO 可以更快地撤销此前已经认证过的 Keycloak 用户访问权限。 如果没有这项功能,MinIO 对已禁用或已删除用户最早能够生效的访问撤销时间点,只能等到最后一次获取的认证 token 过期。

本流程假定你已经拥有一个现成的 MinIO 部署,并已将 Keycloak 配置为外部身份管理器。

1) 创建所需的 Client Scopes

进入 Client scopes 视图并创建一个新的 scope:

Name

将 scope 名称设置为一个易于识别的名字(minio-admin-API-access

Mappers

选择 Configure a new mapper

Audience

将 Name 设置为一个易于识别的映射名称(minio-admin-api-access-mapper

Included Client Audience

设置为 security-admin-console

进入 Clients,并选择 MinIO client

  1. Service account roles 中,选择 Assign role 并分配 admin 角色
  2. Client scopes 中,选择 Add client scope 并添加前面创建的 scope

进入 Settings,并确保 Authentication flow 中包含 Service accounts roles

2) 验证 Admin API 访问

你可以使用 MinIO client 凭证调用 Admin REST API,以获取 bearer token 和用户数据,从而验证该功能:

  1. 获取 bearer token:

    curl -d "client_id=minio" \
         -d "client_secret=secretvalue" \
         -d "grant_type=password" \
         http://keycloak-url:port/admin/realms/REALM/protocol/openid-connect/token
  2. 使用返回结果中的 access_token 访问 Admin API:

    curl -H "Authentication: Bearer ACCESS_TOKEN_VALUE" \
         http://keycloak-url:port/admin/realms/REALM/users/UUID

    UUID 替换为你要查询用户的唯一 ID。 响应应类似如下:

    {
       "id": "954de141-781b-4eaf-81bf-bf3751cdc5f2",
       "createdTimestamp": 1675866684976,
       "username": "minio-user-1",
       "enabled": true,
       "totp": false,
       "emailVerified": false,
       "firstName": "",
       "lastName": "",
       "attributes": {
          "policy": [
             "readWrite"
          ]
       },
       "disableableCredentialTypes": [],
       "requiredActions": [],
       "notBefore": 0,
       "access": {
          "manageGroupMembership": true,
          "view": true,
          "mapRoles": true,
          "impersonate": true,
          "manage": true
       }
    }

    如果返回值中的 enabled 为 false 或 null(用户已从 Keycloak 中移除),MinIO 会撤销该认证用户的访问权限。

3) 在 MinIO 上启用 Keycloak Admin 支持

MinIO 支持多种方式来配置 Keycloak Admin API 支持:

你可以使用 mc idp openid update 命令修改现有 Keycloak 服务的配置项。 如果是首次配置 Keycloak,也可以直接在初始设置时包含以下配置项。 该命令接受所有受支持的 OpenID 配置项

mc idp openid update ALIAS KEYCLOAK_IDENTIFIER \
   vendor="keycloak" \
   keycloak_admin_url="https://keycloak-url:port/admin"
   keycloak_realm="REALM"
  • KEYCLOAK_IDENTIFIER 替换为已配置 Keycloak IDP 的名称。 你可以使用 mc idp openid ls 查看 MinIO 部署上所有已配置的 IDP 项
  • keycloak_admin_url 配置项中指定 Keycloak admin URL
  • keycloak_realm 中指定 Keycloak Realm 名称

在合适的配置位置(例如 /etc/default/minio)设置以下 环境变量

以下示例代码设置了在现有 Keycloak 配置上启用 Keycloak Admin API 所需的最小环境变量集合。 请将后缀 _PRIMARY_IAM 替换为目标 Keycloak 配置的唯一标识符。

MINIO_IDENTITY_OPENID_VENDOR_PRIMARY_IAM="keycloak"
MINIO_IDENTITY_OPENID_KEYCLOAK_ADMIN_URL_PRIMARY_IAM="https://keycloak-url:port/admin"
MINIO_IDENTITY_OPENID_KEYCLOAK_REALM_PRIMARY_IAM="REALM"

27.3 - 配置 Silo 使用 OpenID 进行认证

概览

MinIO 支持使用兼容 OpenID Connect (OIDC) 的 Identity Provider (IDP) 来管理外部用户身份,例如 Okta、KeyCloak、Dex、Google 或 Facebook。

本页提供了在 Kubernetes 和裸金属基础设施上的 MinIO 部署中配置 OIDC 的流程。

本流程包括:

本流程是面向兼容 OIDC 提供方的通用配置流程。 有关认证与 JWT 获取的具体说明,请以你所选 OIDC 提供方的文档为准。

前提条件

兼容 OpenID-Connect (OIDC) 的 Identity Provider

本流程假定你已经拥有一个现成的 OIDC 提供方,例如 Okta、KeyCloak、Dex、Google 或 Facebook。 这些服务本身的配置不在本流程范围内。

MinIO 集群必须与 OIDC 提供方保持双向连通。

检查访问管理行为

请确保每个打算与 MinIO 配合使用的用户身份,都配置了合适的 claim,以便 MinIO 能将认证用户关联到某个 策略。 未分配任何策略的 OpenID 用户,无权访问 MinIO 集群中的任何操作或资源。

对于基于 JWT claim 的认证,MinIO 仅支持使用 OpenID Authorization Code Flow 的 OIDC 流程。

访问 MinIO 集群

本流程使用 mc 对 MinIO 集群执行操作。 请在一台能够访问该集群网络的机器上安装 mc。 关于如何下载和安装 mc,请参见 mc 安装快速开始。 本流程假定已为 MinIO 集群配置 alias

为 MinIO 配置 OpenID 外部身份管理

  1. 创建新的 OpenID 配置

    使用 mc idp openid add 命令为 MinIO 集群创建新的 OIDC 配置。 以下示例命令假定你使用 OIDC 提供方返回的 JWT claims,来实现 基于策略分配的授权

    mc idp openid add ALIAS \
      client_id=minio-oidc-client-id \
      client_secret=minio-oidc-client-secret \
      config_url="https://openid-provider.example.net/REALM/.well-known/openid-configuration" \
      claim_name="minio-policies" \
      scopes="openid,groups"

    你也可以配置基于 RoleArn 的功能,让所有认证用户都使用由 role_policy 设置指定的单一策略。 例如,将 role_policy="readOnly" 设置为所有认证用户分配内置只读策略。

  2. 检查 MinIO Server 日志

    MinIO 进程会在应用新配置时重启。 请检查日志,确认 OIDC 配置已成功持久化。

    如果你为一个或多个配置设置了 role_policy,输出中会包含一个可供 STS API 使用的 ARN。

  3. 使用 OIDC 凭证生成兼容 S3 的临时凭证

    MinIO 要求客户端使用 AWS Signature Version 4 protocol 进行认证,同时保留对已弃用 Signature Version 2 协议的支持。 具体来说,客户端必须提供有效的 access key 和 secret key,才能访问任何 S3 或 MinIO 管理 API,例如 PUTGETDELETE 操作。

    应用程序可以按需使用 AssumeRoleWithWebIdentity Security Token Service (STS) API 端点,以及 OIDC 提供方返回的 JSON Web Token (JWT),生成临时访问凭证。

    应用程序必须提供一个工作流,用于登录 OIDC 提供方,并获取与该认证会话关联的 JSON Web Token (JWT)。 关于认证成功后如何获取和解析 JWT token,请以提供方文档为准。MinIO 提供了一个示例 Go 应用 web-identity.go,展示了如何管理这一工作流。

    应用程序获取到 JWT token 后,使用 AssumeRoleWithWebIdentity 端点生成临时凭证:

    POST https://minio.example.net?Action=AssumeRoleWithWebIdentity
    &WebIdentityToken=TOKEN
    &Version=2011-06-15
    &DurationSeconds=86400
    &Policy=Policy
    • TOKEN 替换为上一步返回的 JWT token。

    • DurationSeconds 替换为临时凭证过期前的秒数。上例指定了 86400 秒,即 24 小时。

    • Policy 替换为内联、经过 URL 编码的 JSON 策略,用于进一步收紧临时凭证对应权限。

      如果省略,则使用该 OpenID 用户 policy claim 中关联的策略。

    你也可以加入 RoleArn 参数(可选),并填写目标单策略 OIDC 配置对应的 ARN 字符串。

    API 响应是一个 XML 文档,其中包含 access key、secret key、session token 和过期时间。 应用程序可以使用 access key 和 secret key 来访问并操作 MinIO。

    参考文档请参见 AssumeRoleWithWebIdentity

28 - 在 Windows 上部署 Silo

本页介绍如何在 Microsoft Windows 主机上部署 Silo,用于开发与评估。

Silo 为 x86-64 与 ARM64 发布 Windows 归档。当前项目 CI 在 Linux 上运行,没有覆盖 Windows 实机运行时,因此已删除继承自上游、已经过时的“正式支持 Windows 版本”清单。在生产使用前,请验证精确的 Windows 版本、文件系统、服务包装方式与工作负载。

本步骤包含对 单机多盘 (SNMD) 和 单机单盘 (SNSD) 拓扑的指导,适用于早期开发和评估环境。

本指南没有验证 Windows 主机上的多机多盘(MNMD)分布式配置。

注意事项

检查清单

在执行本步骤前,请先阅读我们发布的硬件、软件和安全检查清单。

纠删码校验

MinIO 会根据拓扑中的节点和驱动器总数,自动为集群确定默认的 纠删码 配置。 你可以在设置集群时配置按对象生效的 parity,也可以让 MinIO 选择默认值(生产级集群默认为 EC:4)。

校验值决定了对象可用性与磁盘存储占用之间的关系。 可使用 MinIO 纠删码计算器 选择适合你集群的纠删码校验级别。

虽然你可以随时更改纠删码校验设置,但以既有校验值写入的对象 不会 自动更新为新的校验设置。

步骤

1. 下载 Silo 二进制文件

下载与安装获取与架构对应的 Windows 归档,使用同一发布随附的校验和核验后,解压得到 minio.exe

下一步说明如何运行该文件。请从 PowerShell 或命令提示符启动服务端,不要在资源管理器中双击运行。

2. 启动 MinIO Server

在 PowerShell 或命令提示符中,切换到可执行文件所在目录,或将 minio.exe 文件路径加入系统 $PATH

对于带有多个驱动器的 Windows 主机,你可以指定一组顺序驱动器,以便在 单机多盘 (SNMD) 拓扑中配置 MinIO:

.\minio.exe server {D...G}:\minio --console-address :9001

minio server 进程会将输出打印到系统控制台,类似如下:

API: http://192.0.2.10:9000  http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin

Console: http://192.0.2.10:9001 http://127.0.0.1:9001
RootUser: minioadmin
RootPass: minioadmin

Command-line: https://silo.pgsty.com/zh/reference/minio-mc/
   $ mc alias set myminio http://192.0.2.10:9000 minioadmin minioadmin

Documentation: https://silo.pgsty.com/zh/docs/

WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables.

该进程绑定到当前 PowerShell 或命令提示符窗口。 关闭窗口会停止 server 并结束该进程。

使用此命令在 C:\minio 文件夹中启动本地 MinIO 实例。 你可以将 C:\minio 替换为本地主机上的其他驱动器或文件夹路径。

.\minio.exe server C:\minio --console-address :9001

minio server 进程会将输出打印到系统控制台,类似如下:

API: http://192.0.2.10:9000  http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin

Console: http://192.0.2.10:9001 http://127.0.0.1:9001
RootUser: minioadmin
RootPass: minioadmin

Command-line: https://silo.pgsty.com/zh/reference/minio-mc/
   $ mc alias set myminio http://192.0.2.10:9000 minioadmin minioadmin

Documentation: https://silo.pgsty.com/zh/docs/

WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables.

该进程绑定到当前 PowerShell 或命令提示符窗口。 关闭窗口会停止 server 并结束该进程。

3. 使用浏览器连接到 MinIO 服务端

使用浏览器(例如 Microsoft Edge)访问 http://127.0.0.1:9001,或访问 minio server 命令输出中列出的任意 Console 地址,以打开 MinIO 控制台。 例如,示例输出中的 Console: http://192.0.2.10:9001 http://127.0.0.1:9001 表示有两个可用于连接 Console 的地址。

尽管端口 9000 用于连接 API,MinIO 仍会自动将浏览器访问重定向到 MinIO Console。

使用输出中显示的 RootUserRootPass 用户凭证登录 Console。 默认值为 minioadmin | minioadmin

MinIO Console 显示登录界面

你可以使用 MinIO Console 执行常规管理任务,例如身份与访问管理、指标和日志监控,或 Server 配置。 每个 MinIO server 都包含自身内嵌的 MinIO Console。

MinIO Console 显示存储桶起始界面

更多信息请参阅 MinIO 控制台 文档。

4. (可选) 安装 Silo 客户端

Silo 客户端允许你从 PowerShell 与部署交互。

下载与安装获取 Windows 客户端归档,校验后解压得到 mcli.exe

在命令提示符或 PowerShell 中运行:

\path\to\mcli.exe --help

通过已安装的 mcli.exe 执行 mc alias set,即可认证并连接到部署。

mcli.exe alias set local http://127.0.0.1:9000 minioadmin minioadmin
mcli.exe admin info local

mc alias set 需要四个参数:

有关此命令的更多细节,请参阅 mc alias set

5. 后续步骤

29 - 删除 Silo Tenant

前提条件

MinIO Kubernetes Operator

本页步骤 要求 已正确安装 MinIO Kubernetes Operator,并假定本地主机也安装了与之匹配的 Operator。本页使用仓库归档前的最终上游版本 v7.1.1,仅作为冻结的兼容基线。

有关部署 MinIO Operator 的完整文档,请参阅 在 Kubernetes 上部署 MinIO

Tenant 持久卷声明

Tenant 生成的每个 Persistent Volume Claim(PVC)在删除时的行为,取决于其绑定的 Persistent Volume(PV)所配置的 Reclaim Policy

注意

警告

无论是自动还是手动删除底层 PV,都会导致 MinIO Tenant 上存储的对象丢失。

在删除 Tenant 之前,请充分确认已存储数据的安全性。

步骤

你可以通过删除命名空间来删除使用 Kustomization 安装的 Tenant:

kubectl delete namespace TENANT-NAMESPACE

TENANT-NAMESPACE 替换为要删除的命名空间名称。

警告

重要

在运行命令前,请确认你指定的是正确的待删除命名空间。 命名空间删除发生在 Kubernetes 层,因此 MinIO Operator 无法干预或撤销该操作。

你可以使用 helm uninstall 命令删除通过 Helm 安装的 Tenant:

helm uninstall --namespace MINIO-TENANT TENANT-NAME minio-operator/tenant

上述命令默认使用的是 MinIO Operator Chart 仓库。 如果你是手动安装 Chart,或使用了不同的仓库名称,请在命令中指定相应的 chart 或名称。

分别将 TENANT-NAMETENANT-NAMESPACE 替换为 Tenant 的名称和命名空间。 你可以使用 helm list -n TENANT-NAMESPACE 验证 Tenant 名称。

30 - 数据加密(SSE)

MinIO Server-Side Encryption (SSE) 在对象写入过程中为其提供保护, 使客户端能够利用服务端的处理能力, 在存储层实现对象静态加密(encryption-at-rest)。 SSE 还为围绕安全锁定和擦除的监管与合规要求提供关键能力。

MinIO SSE 使用 MinIO Key Encryption Service (KES) 和外部 Key Management Service (KMS), 以大规模执行安全的密码学操作。 MinIO 还支持由客户端管理密钥的模式, 在这种模式下,应用程序完全负责创建和管理供 MinIO SSE 使用的加密密钥。

MinIO 支持将以下 KMS 作为中心密钥存储:

MinIO SSE 需要启用 网络加密(TLS)

支持的加密类型

MinIO SSE 在功能和 API 上兼容 AWS Server-Side Encryption, 并支持以下加密策略:

30.1 - 使用 KES 进行服务端对象加密

为 Silo 部署服务端对象加密

警告

社区版 KES 及其文档均已弃用并归档。下方 Kubernetes 页签还引用了在 MinIO Operator 6.0.0 中移除的 Operator Console;该内容仅作为历史迁移参考保留,并不是适用于当前 v7.1.1 的部署流程。新部署在启用不可逆的服务端加密前,应选择仍受维护的 KMS 集成,并验证迁移或替代方案。

本流程假定你可以访问一个已经安装并启用了 MinIO Operator 的 Kubernetes 集群。 关于如何运行 KES,请参见 KES 文档

在本流程中,你将完成:

  1. 创建或修改一个通过 KES 支持 SSE 的 MinIO 部署。 关于生产可用 MinIO 部署的指导,请参见 部署分布式 MinIO 教程。
  2. 使用 MinIO Operator Console 创建或管理一个 MinIO 租户。
  3. 进入该租户的 Encryption 设置,并通过 受支持的 Key Management System 配置 SSE
  4. 创建一个新的 EKSSE 使用。
  5. 配置自动化的存储桶默认 SSE-KMS

本流程说明如何部署已配置 KES 并启用 服务端加密 的 MinIO。 关于如何运行 KES,请参见 KES 文档

在本流程中,你将完成:

  1. 创建一个新的 EKSSE 使用。
  2. 创建或修改一个通过 KES 支持 SSE 的 MinIO 部署。 关于生产可用 MinIO 部署的指导,请参见 部署分布式 MinIO 教程。
  3. 配置自动化的存储桶默认 SSE-KMS
警告

重要

在 MinIO 部署上启用 SSE 后, 会自动使用默认加密密钥对该部署的后端数据进行加密。

MinIO 必须能够访问 KES 和外部 KMS, 才能解密后端并正常启动。 KMS 必须维护并提供对 MINIO_KMS_KES_KEY_NAME 的访问。 之后你不能再禁用 KES, 也不能在后续“撤销”该 SSE 配置。

前提条件

访问 MinIO 集群

你必须能够访问 Kubernetes 集群,并且 kubectl 上下文配置的权限至少具备管理员级别。

本流程假定你的权限集足以支持在 Kubernetes 集群中部署或修改与 MinIO 相关的资源,包括但不限于 pods、statefulsets、replicasets、deployments 和 secrets。

本流程使用 mc 对 MinIO 集群执行操作。 请在一台能够访问该集群网络的机器上安装 mc。 关于如何下载和安装 mc,请参见 mc 安装快速开始

本流程假定已为 MinIO 集群配置 alias

确保 KES 可访问受支持的 KMS 目标

本流程假定已经存在一个可从 Kubernetes 集群访问的 受支持 KMS 安装

  • 对于与 MinIO 租户位于同一 Kubernetes 集群的部署,你可以使用 Kubernetes service 名称,让 MinIO 租户连接到目标 KMS 服务。
  • 对于位于 Kubernetes 集群外部的部署,你必须确保该集群支持 Kubernetes services、pods 与外部网络之间的通信路由。 这可能需要配置或部署额外的 Kubernetes 网络组件,和/或启用访问公网的能力。

关于部署和配置的指导,请以你所选 KMS 方案的文档为准。

本流程假定已经存在一个 KES 安装,并已连接到受支持的 KMS 安装,且二者都可从本地主机访问。 请参照你所选 受支持 KMS 目标 的安装说明,部署 KES 并将其连接到对应 KMS 方案。

说明

KES 操作要求目标处于 Unsealed 状态

某些受支持的 KMS 目标允许你对 Vault 实例执行 seal 或 unseal。 如果已配置的 KMS 服务处于 sealed 状态,KES 会返回错误。

如果你重启或以其他方式 seal 了 Vault 实例,KES 将无法针对该 Vault 执行任何密码学操作。 你必须对 Vault 执行 unseal,才能确保其正常运行。

关于是否需要执行 unseal 的更多信息,请参见你所选 KMS 方案的文档。

对于你所选的受支持 KMS,请参照 KES 文档 中的配置说明:

流程

本流程说明如何在生产环境中使用你所选的 受支持 KMS 方案 配置并启用服务端加密。 具体来说,本流程假定满足以下条件:

  1. 查看 Tenant CRD

    查看 Tenant CRD 中的 TenantSpec.kes 对象、 TenantSpec.configuration 对象,以及 KES Configuration 参考

    在继续之前,你必须先准备好所选外部 Key Management Service 所需的全部配置。

  2. 创建或修改 Tenant YAML,按需设置 KesConfig 的值:

    你必须修改 Tenant YAML 或 Kustomize 模板,以反映所需的 KES 配置。以下示例摘自固定版本的 MinIO Operator v7.1.1 Kustomize 示例

    kes:
       image: "" # minio/kes:2024-06-17T15-47-05Z
       env: [ ]
       replicas: 2
       kesSecret:
          name: kes-configuration
       imagePullPolicy: "IfNotPresent"

    kes-configuration secret 必须引用一个 Kubernetes Opaque Secret, 其中的 stringData 对象需要以 server-config.yaml 的形式包含完整 KES 配置。 keystore 字段必须包含你所选 Key Management System 的完整配置。

    更多说明请参阅 固定到 v7.1.1 的 Kustomize 示例

  3. 创建或修改 Tenant YAML,按需设置 TenantSpec.configuration 的值。

    创建一个 Opaque Secret,在 config.env 键中写入 Tenant 所需的环境变量,再让 Tenant 按名称引用该 Secret。不要把真实的 root 凭据提交到源码仓库。

    apiVersion: v1
    kind: Secret
    metadata:
      name: storage-configuration
      namespace: minio-tenant
    type: Opaque
    stringData:
      config.env: |-
        export MINIO_ROOT_USER="replace-with-root-user"
        export MINIO_ROOT_PASSWORD="replace-with-a-strong-secret"
    ---
    apiVersion: minio.min.io/v2
    kind: Tenant
    spec:
      configuration:
        name: storage-configuration

    Secret 与 Tenant 必须位于同一个命名空间。上游对象结构见固定到 v7.1.1 的 Tenant 配置示例

  4. 生成新的加密密钥

    说明

    创建密钥前先解封 Vault

    如果你所选的提供方有此要求, 则必须先解封底层 Vault 实例, 然后才能创建新的加密密钥。 更多信息请参考你所选 KMS 方案的文档。

    MinIO 要求某个存储桶或对象使用的 EK 在执行 SSE 操作之前, 必须已经存在于根 KMS 中。 你可以针对 MinIO Tenant 使用 mc admin kms key create 命令。

    在使用 mc 管理 Tenant 之前, 你必须确保本地主机能够访问 MinIO Tenant 的 pods 和 services。 对于 Kubernetes 集群内部主机, 你可以使用 service DNS name。 对于 Kubernetes 集群外部主机, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。

    在单独的 Terminal 或 Shell 中运行以下命令:

    # Replace '-n minio' with the namespace of the MinIO deployment
    # If you deployed the Tenant without TLS you may need to change the port range
    
    # You can validate the ports in use by running
    #  kubectl get svc/minio -n minio
    
    kubectl port forward svc/minio 443:443 -n minio

    在新的 Terminal 或 Shell 窗口中执行以下操作:

    • 将本地 mc 客户端连接到 Tenant。
    • 创建加密密钥。

    关于如何在本地主机上安装 mc, 请参见 快速开始

    # Replace USERNAME and PASSWORD with a user on the tenant with administrative permissions
    # such as the root user
    
    mc alias add k8s https://localhost:443 ROOTUSER ROOTPASSWORD
    
    # Replace my-new-key with the name of the key you want to use for SSE-KMS
    mc admin kms key create k8s encrypted-bucket-key
  5. 为存储桶启用 SSE-KMS

    你可以使用 MinIO Tenant Console 或 MinIO mc CLI, 通过生成的密钥启用存储桶默认 SSE-KMS:

连接到 MinIO Tenant Console service 并登录。 对于 Kubernetes 集群内部客户端, 你可以指定 service DNS name。 对于 Kubernetes 集群外部客户端, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。

登录后,新建一个 Bucket,并按你的偏好命名。 选择齿轮 图标打开管理视图。

选择 Encryption 字段旁的铅笔 图标, 打开配置存储桶默认 SSE 方案的弹窗。

选择 SSE-KMS,然后输入上一步创建的密钥名称。

保存更改后,尝试向该存储桶上传一个文件。 在对象浏览器中查看该文件时, 请注意侧边栏中的元数据包含了 SSE 加密方案 以及用于加密该对象的密钥信息。 这表明该对象已成功加密。

使用 MinIO API Service 为 MinIO 部署创建新的 alias。 之后即可使用 mc encrypt set 为存储桶启用 SSE-KMS 加密:

mc alias set k8s https://minio.minio-tenant-1.svc.cluster-domain.example:443 ROOTUSER ROOTPASSWORD

mc mb k8s/encryptedbucket
mc encrypt set SSE-KMS encrypted-bucket-key k8s/encryptedbucket

对于 Kubernetes 集群外部客户端, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。

使用 mc cp 或任何带有 PutObject 函数的 S3 兼容 SDK 将文件写入该存储桶。 然后你可以对该文件执行 mc stat, 以确认其关联的加密元数据。

  1. 生成供 MinIO 使用的 KES API Key

    使用 kes identity new 命令, 为 MinIO Server 生成新的 API key:

    kes identity new

    输出同时包含供 MinIO 使用的 API Key, 以及供 KES Policy 配置 使用的 Identity hash。

  2. 配置 MinIO 环境文件

    为目标部署中的所有主机创建或修改 MinIO Server 环境文件, 使其包含以下环境变量:

    将以下内容添加到每台 MinIO 主机上的 MinIO 环境文件中。 关于基础 MinIO 环境文件的更详细说明, 请参见 安装与管理安装与管理安装与管理 教程。

    # Add these environment variables to the existing environment file
    
    MINIO_KMS_KES_ENDPOINT=https://HOSTNAME:7373
    MINIO_KMS_KES_API_KEY="kes:v1:ACTpAsNoaGf2Ow9o5gU8OmcaG6Af/VcZ1Mt7ysuKoBjv"
    
    # Allows validation of the KES Server Certificate (Self-Signed or Third-Party CA)
    # Change this path to the location of the KES CA Path
    MINIO_KMS_KES_CAPATH=|kescertpath|/kes-server.cert
    
    # Sets the default KMS key for the backend and SSE-KMS/SSE-S3 Operations)
    MINIO_KMS_KES_KEY_NAME=minio-backend-default-key

    HOSTNAME 替换为 KES server 的 IP 地址或主机名。 如果 MinIO server 所在主机无法解析或访问指定的 HOSTNAME, 该部署可能会返回错误,或启动失败。

    • 如果只使用一台 KES server 主机,请指定该主机的 IP 或主机名。
    • 如果使用多台 KES server 主机,请指定各主机 IP 或主机名的逗号分隔列表。

    MinIO 会将 MINIO_KMS_KES_KEY_NAME 这个密钥 用于以下加密操作:

    • 加密 MinIO 后端(IAM、配置等)。
    • 在请求未包含特定 EK 时, 使用 SSE-KMS 加密对象。
    • 使用 SSE-S3 加密对象。

    MinIO 默认在 /etc/default/minio 查找此文件。 如果你的部署将环境文件放在其他位置,请修改对应位置的文件。

  3. 启动 MinIO

    说明

    KES 操作要求 Vault 已解封

    根据你选择的 KMS 方案, 你可能需要先将密钥实例解封,才能执行正常的加密操作,包括密钥创建或读取。 KES 需要已解封的密钥目标才能执行这些操作。

    关于该实例在运行时是否需要 sealed/unsealed, 请参阅你所选 KMS 方案文档

    你必须先启动 KES,再启动 MinIO。 MinIO 部署在启动过程中需要访问 KES。

    你可以使用 mc admin service restart 命令重启 MinIO:

    mc admin service restart ALIAS
  4. 生成新的加密密钥

    MinIO 要求在使用某个 EK 执行 SSE 操作之前, 该 EK 必须已存在于 KMS 中。 使用 kes key create mc admin kms key createSSE 添加新的 EK

    以下命令使用 mc admin kms key create 在 KMS server 上添加一个新的 External Key(EK), 供加密 MinIO 后端时使用。

    mc admin kms key create ALIAS KEYNAME
  5. 为存储桶启用 SSE-KMS

    使用 MinIO mc CLI, 通过生成的密钥启用存储桶默认 SSE-KMS:

    以下命令会:

    • 为 MinIO 部署创建一个新的 alias
    • 创建一个用于存储加密数据的新存储桶。
    • 在该存储桶上启用 SSE-KMS 加密。
    mc alias set local http://127.0.0.1:9000 ROOTUSER ROOTPASSWORD
    
    mc mb local/encryptedbucket
    mc encrypt set SSE-KMS encrypted-bucket-key ALIAS/encryptedbucket

    使用 mc cp 或任何带有 PutObject 函数的 S3 兼容 SDK 将文件写入该存储桶。 然后你可以对该文件执行 mc stat, 以确认其关联的加密元数据。

31 - 网络加密(TLS)

说明

SSL 已弃用

TLS 是 Secure Socket Layer(SSL)加密的后继方案。 自 2018 年 6 月 30 日起,SSL 已被完全 弃用

概览

MinIO 支持使用 Transport Layer Security (TLS) 1.2+ 对入站和出站流量进行加密。 MinIO 可以自动检测默认或自定义搜索路径中的证书,并为所有连接启用 TLS。 MinIO 支持客户端发起的 Server Name Indication (SNI) 请求,此时 MinIO 会尝试为客户端指定的主机名定位合适的 TLS 证书。

MinIO 至少 需要一张默认 TLS 证书,并且可以通过多张 TLS 证书支持 SNI 连接。 MinIO 使用 TLS Subject Alternative Name (SAN) 列表来判断应向客户端返回哪张证书。 如果 MinIO 找不到 SAN 覆盖客户端请求主机名的 TLS 证书,则会使用默认证书并尝试完成握手。

你可以指定一张 TLS 证书,覆盖 MinIO 部署可接受连接的所有 SAN。

这种配置所需设置最少,但会向连接客户端暴露 TLS SAN 中配置的全部主机名。 根据你的 TLS 配置,这些主机名可能包含内部或私有 SAN 域名。

你也可以按域名拆分配置多张 TLS 证书,并为所有未匹配主机名请求保留一张默认证书。 这种配置需要更多设置,但只会暴露返回证书的 TLS SAN 数组中所配置的主机名。

Kubernetes 上的 MinIO TLS

MinIO Kubernetes Operator 为 MinIO 租户提供三种 TLS 配置方式:

使用 Cluster Signing API 自动启用 TLS

对于具备有效 TLS Cluster Signing Certificate 的 Kubernetes 集群,MinIO Kubernetes Operator 可以在 部署修改 MinIO 租户时自动生成 TLS 证书。

Kubernetes TLS API 在生成新的 TLS 证书时,会使用 Kubernetes 集群 Certificate Authority (CA) 的签名算法。 MinIO 支持的 TLS Cipher Suite 和推荐签名算法完整列表,请参见 支持的 TLS Cipher Suite

默认情况下,Kubernetes 会在每个 pod 的 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 放置一份证书 bundle。 该 CA bundle 应包含用于签发 MinIO 租户 TLS 证书的集群 CA 或根 CA。 部署在同一 Kubernetes 集群中的其他应用,可以信任这份集群证书,并通过 MinIO service DNS 名称 连接到 MinIO 租户(例如 https://minio.minio-tenant-1.svc.cluster-domain.example:443)。

说明

Subject Alternative Name 证书

如果你使用的是自定义 Subject Alternative Name (SAN) 证书,并且它 不是 通配符证书,那么 TLS 证书的 SAN 必须 覆盖其父节点主机名。 在没有通配符的情况下,SAN 必须精确匹配,才能成功连接到该租户。

cert-manager 证书管理

MinIO Operator 支持使用 cert-manager 作为其内置自动证书管理或用户手动证书管理的完整替代方案。 关于如何使用 cert-manager 部署 MinIO Operator 和租户,请参见 cert-manager 页面

手动证书管理

Tenant CRD 规范中的 spec.externalCertsSecret 支持引用类型为 opaquekubernetes.io/tlssecret,其中包含用于 TLS 的 private.keypublic.crt

你可以指定多张证书,以支持分配了多个主机名的租户。

自签名、内部、私有证书以及带中间证书的公共 CA

如果你为 MinIO 租户部署的是由非全球或非公共 Certificate Authority 签发的证书,或者 使用了需要中间证书的公共 CA,则必须将这些 CA 提供给 Operator,以确保它能够信任这些证书。

对于使用不受信任证书部署的租户,Operator 可能会记录与 TLS 证书校验相关的警告。

以下过程会将一个包含 Certificate Authority public.crt 的 secret 挂载到 MinIO Operator。 你可以在同一证书文件中放入多个 CA,只要保持 BEGINEND 分隔符原样不变即可。

  1. 创建 operator-ca-tls secret

    以下命令会在 MinIO Operator 命名空间(minio-operator)中创建一个 Kubernetes secret。

    kubectl create secret generic operator-ca-tls \
       --from-file=public.crt -n minio-operator

    public.crt 文件必须是包含一个或多个 CA 定义的有效 TLS 证书。

  2. 重启 Operator

    创建完成后,你必须重启 Operator 以加载新的 CA:

    kubectl rollout restart deployments.apps/minio-operator -n minio-operator

第三方 Certificate Authority

MinIO Kubernetes Operator 可以在 部署修改 MinIO 租户时自动挂载第三方 Certificate Authority。

你可以随时为租户添加、更新或删除 CA。 要让配置中的 CA 变更生效,必须重启 MinIO 租户。

Operator 会将指定的 CA 放置到每个 MinIO Server pod 上,从而确保所有 pod 拥有一致的受信任 CA 集合。

如果 MinIO Server 无法将传入客户端的 TLS 证书签发者与任一可用 CA 匹配,则会将该连接视为无效并拒绝。

裸金属上的 MinIO TLS

MinIO Server 会为每个节点搜索 TLS 私钥和证书,并使用这些凭据启用 TLS。 MinIO 会在发现并验证证书后自动启用 TLS。 搜索位置取决于你的 MinIO 配置:

默认情况下,MinIO server 会在以下目录中查找每个节点的 TLS 私钥和证书:

${HOME}/.minio/certs

其中 ${HOME} 是运行 MinIO 服务端进程的用户主目录。 如果 ${HOME}/.minio/certs 目录不存在,你可能需要手动创建它。

对于由 systemd 管理的部署,该路径必须对应运行 MinIO 进程的 USER。 如果该用户没有主目录,请改用 自定义路径 选项。

你可以通过 minio server --certs-dir-S 参数指定 MinIO server 搜索证书的路径。

例如,以下命令片段指示 MinIO 进程使用 /opt/minio/certs 目录存放 TLS 证书。

minio server --certs-dir /opt/minio/certs ...

运行 MinIO service 的用户 必须 对该目录拥有读写权限。

请将默认域名(例如 minio.example.net)对应的 TLS 证书放入 /certs 目录,其中私钥命名为 private.key,公钥证书命名为 public.crt

对于分布式 MinIO 部署,部署中的每个节点都必须具有一致的 TLS 证书配置。

自签名、内部、私有证书以及带中间证书的公共 CA

如果你使用的是由非全球或非公共 Certificate Authority 签发的证书,或者 使用了需要中间证书的公共 CA,则必须将这些 CA 提供给 MinIO Server。 如果 MinIO server 不具备这些必要 CA,在连接其他服务时可能会返回与 TLS 校验相关的警告或错误。

请将 CA 证书放入 /certs/CAs 目录。 该目录的根路径取决于你使用的是默认证书路径,还是自定义证书路径(minio server --certs-dir-S)。

mv myCA.crt ${HOME}/.minio/certs/CAs

以下示例假设 MinIO Server 以 --certs dir /opt/minio/certs 启动:

mv myCA.crt /opt/minio/certs/CAs/

对于自签名证书,Certificate Authority 通常就是用于签署该证书的私钥。

对于由内部、私有或其他非全球 Certificate Authority 签发的证书,请使用签发该证书的同一 CA。 非全球 CA 必须包含从中间证书到根证书的完整信任链。

如果提供的文件不是 X.509 证书,MinIO 会忽略它,并可能在校验由该 CA 签发的证书时返回错误。

第三方 Certificate Authority

MinIO Server 会使用主机系统中的受信任根证书存储来校验每个连接客户端提交的 TLS 证书。

请将 CA 证书放入 /certs/CAs 目录。 该目录的根路径取决于你使用的是默认证书路径,还是自定义证书路径(minio server --certs-dir-S)。

mv myCA.crt ${HOME}/certs/CAs

以下示例假设 MinIO Server 以 --certs dir /opt/minio/certs 启动:

mv myCA.crt /opt/minio/certs/CAs/

请将每个 CA 的证书文件放入 /CAs 子目录。 确保 MinIO 部署中的所有主机在该目录下拥有一致的受信任 CA 集合。 如果 MinIO Server 无法将传入客户端的 TLS 证书签发者与任一可用 CA 匹配,则会将该连接视为无效并拒绝。

支持的 TLS Cipher Suite

与 RSA 相比,MinIO 更推荐生成 ECDSA(例如 NIST P-256 曲线)或 EdDSA(例如 Curve25519)TLS 私钥/证书,因为它们的计算开销更低。

MinIO 支持以下由 Go 支持的 TLS 1.2 和 TLS 1.3 cipher suite。列表中使用 标记推荐算法:

  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

31.1 - 为 Silo 启用 TLS

MinIO 支持使用 Transport Layer Security (TLS) 1.2+ 对入站和出站流量进行加密。

MinIO Operator 支持通过以下方式为 MinIO 租户启用 TLS:

  • 使用 Kubernetes Cluster Signing Certificates 自动下发 TLS
  • 使用 Kubernetes secret 指定用户提供的 TLS
  • 使用 cert-manager 管理 TLS 证书

MinIO 会自动检测配置目录或默认目录中的 TLS 证书,并以启用 TLS 的方式启动。

本文说明如何为 MinIO 的单个域名启用 TLS。需要通过 SNI 服务多个主机名时,请参阅多域 TLS 指南

前提条件

访问 MinIO 集群

你必须能够访问 Kubernetes 集群,并且 kubectl 配置中具备对应的管理权限。

本过程假设你的权限足以在 Kubernetes 集群中部署或修改 MinIO 相关资源,包括但不限于 pod、statefulset、replicaset、deployment 和 secret。

本过程使用 mc 对 MinIO 集群执行操作。 请在一台可通过网络访问该集群的机器上安装 mc。 关于下载和安装 mc,请参见 mc Installation Quickstart

本过程还假设你已经为 MinIO 集群配置了 alias

同时假设你拥有对每台 MinIO 主机服务器的 SSH 或类似 shell 级别的管理访问权限。

TLS 证书

请准备 MinIO 所需的 TLS 证书,并确保其使用 受支持的密码套件

关于支持的租户 TLS 配置,请参见 Kubernetes 上的 MinIO TLS

请按你偏好的方式准备证书,例如通过组织内部 Certificate Authority,或使用 Digicert、Verisign 等知名公共 CA 提供商。

你也可以使用 openssl 或 MinIO 的 certgen 工具创建自签名证书。

例如,以下命令会生成一个自签名证书,其中包含与 MinIO 服务端 主机关联的一组 IP 和 DNS Subject Alternative Name (SAN):

certgen -host "localhost,minio-*.example.net"

关于证书生成和放置方式的更完整说明,请参见 裸金属上的 MinIO TLS

步骤

MinIO Operator 支持通过三种方式管理 MinIO 租户上的 TLS 证书:

  • MinIO 自动生成 TLS 证书
  • cert-manager 管理的 TLS 证书
  • 用户自行管理的 TLS 证书

你可以组合使用上述任意方式来启用和配置 TLS。 对于用户自有证书,MinIO 强烈建议使用 cert-manager 以简化管理和续期流程。

你也可以部署未启用 TLS 的 MinIO 租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.requestAutoCertTenantSpec.certConfig 字段。

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看这些字段及其当前配置(如果已配置)。

  2. 按需创建或修改租户 YAML,设置 requestAutoCertcertConfig 的值。 例如:

    spec:
       requestAutoCert: true
       certConfig:
         commonName: "CN=MinioTenantCommonName"
         organizationName: "O=MyOrganizationName"
         dnsNames:
           - '*.minio-tenant.domain.tld'

    创建或修改租户资源时,可参考 固定到 v7.1.1 的 Kustomize Tenant base YAML 作为基线模板。

  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.externalCertsCecret 字段

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看该字段当前配置(如果已配置)。

  2. 创建或修改租户 YAML,使其引用适当的 cert-manager 资源。

    例如,以下租户 YAML 片段引用了一个名为 myminio-tls 的 cert-manager 资源:

    apiVersion: minio.min.io/v2
    kind: Tenant
    metadata:
    name: myminio
    namespace: minio-tenant
    spec:
       ## Disable default tls certificates.
       requestAutoCert: false
       ## Use certificates generated by cert-manager.
       externalCertSecret:
          - name: myminio-tls
             type: cert-manager.io/v1
  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.externalCertSecret 字段。

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看该字段当前配置(如果已配置)。

  2. 创建或修改租户 YAML,使其引用一个类型为 kubernetes.io/tls 的 secret:

    例如,以下租户 YAML 片段引用了一个 TLS secret,它覆盖了 MinIO 租户接受连接时使用的域名。

    apiVersion: minio.min.io/v2
    kind: Tenant
    metadata:
    name: myminio
    namespace: minio-tenant
    spec:
       ## Disable default tls certificates.
       requestAutoCert: false
       ## Use certificates generated by cert-manager.
       externalCertSecret:
       - name: domain-certificate
         type: kubernetes.io/tls
  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

MinIO Server 会为每个节点搜索 TLS 私钥和证书,并使用这些凭据启用 TLS。 MinIO 会在发现并验证证书后自动启用 TLS。 搜索位置取决于你的 MinIO 配置:

默认情况下,MinIO server 会在以下目录中查找每个节点的 TLS 私钥和证书:

${HOME}/.minio/certs

其中 ${HOME} 是运行 MinIO 服务端进程的用户主目录。 如果 ${HOME}/.minio/certs 目录不存在,你可能需要手动创建它。

对于由 systemd 管理的部署,该路径必须对应运行 MinIO 进程的 USER。 如果该用户没有主目录,请改用 Custom Path 选项。

你可以通过 minio server --certs-dir-S 参数指定 MinIO server 搜索证书的路径。

例如,以下命令片段指示 MinIO 进程使用 /opt/minio/certs 目录存放 TLS 证书。

minio server --certs-dir /opt/minio/certs ...

运行 MinIO service 的用户 必须 对该目录拥有读写权限。

请将默认域名(例如 minio.example.net)对应的 TLS 证书放入 /certs 目录,其中私钥命名为 private.key,公钥证书命名为 public.crt

例如:

/path/to/certs
private.key
public.crt

你可以使用 MinIO 的 certgen 生成自签名证书,以便在启用 TLS 的情况下评估 MinIO。 例如,以下命令会生成一个自签名证书,其中包含与 MinIO 服务端 主机关联的一组 IP 和 DNS Subject Alternative Name (SAN):

certgen -host "localhost,minio-*.example.net"

请将生成的 public.crtprivate.key 放入 /path/to/certs 目录,以便为 MinIO 部署启用 TLS。 应用可以将 public.crt 作为受信任的 Certificate Authority 使用,从而在不禁用证书校验的情况下连接到 MinIO 部署。

如果你是在重新配置一个此前未启用 TLS 的现有部署,请更新 MINIO_VOLUMES,将其中的 http 改为 https。 你可能还需要同步更新应用或客户端所使用的 URL。

31.2 - 为 Silo 启用多域 TLS

MinIO 支持使用 Transport Layer Security (TLS) 1.2+ 对入站和出站流量进行加密。

MinIO Operator 支持通过以下方式为 MinIO 租户启用 TLS:

  • 使用 Kubernetes Cluster Signing Certificates 自动下发 TLS
  • 使用 Kubernetes secret 指定用户自有 TLS
  • 使用 cert-manager 管理 TLS 证书

MinIO Operator 支持在 部署修改 MinIO 租户时挂载用户指定的 TLS 证书。

这些自定义证书支持 Server Name Indication (SNI),即 MinIO server 会根据客户端指定的主机名决定使用哪张证书。 例如,你可以生成由组织内首选 Certificate Authority (CA) 签发的证书,并将其挂载到 MinIO 租户上。 信任该 CA 的应用可以连接到 MinIO 租户,并完整校验其 TLS 证书。

MinIO 会自动检测配置目录或默认目录中的 TLS 证书,并在启用 TLS 的情况下启动。

MinIO server 支持多张 TLS 证书,server 会使用 Server Name Indication (SNI) 来识别在响应客户端请求时应当使用哪张证书。 当客户端使用特定主机名连接时,MinIO 会通过 SNI 选择与该主机名匹配的 TLS 证书。

本文说明如何为 MinIO 启用多域 TLS。部署只服务一个主机名时,请参阅单域 TLS 指南

前提条件

访问 MinIO 集群

你必须能够访问 Kubernetes 集群,并且 kubectl 配置中具备对应的管理权限。

本过程假设你的权限足以在 Kubernetes 集群中部署或修改 MinIO 相关资源,包括但不限于 pod、statefulset、replicaset、deployment 和 secret。

本过程使用 mc 对 MinIO 集群执行操作。 请在一台可通过网络访问该集群的机器上安装 mc。 关于下载和安装 mc,请参见 mc Installation Quickstart

本过程还假设你已经为 MinIO 集群配置了 alias

同时假设你拥有对每台 MinIO 主机 server 的 SSH 或类似 shell 级别的管理访问权限。

TLS 证书

请准备 MinIO 所需的 TLS 证书,并确保其使用 受支持的密码套件

关于支持的租户 TLS 配置,请参见 Kubernetes 上的 MinIO TLS

请按你偏好的方式准备证书,例如通过组织内部 Certificate Authority,或使用 Digicert、Verisign 等知名公共提供商。

你也可以使用 openssl 或 MinIO 的 certgen 工具创建自签名证书。

例如,以下命令会生成一个自签名证书,其中包含与 MinIO 服务端 主机关联的一组 IP 和 DNS Subject Alternative Name (SAN):

certgen -host "localhost,minio-*.example.net"

关于证书生成和放置方式的更完整说明,请参见 裸金属上的 MinIO TLS

步骤

MinIO Operator 支持通过三种方式管理 MinIO 租户上的 TLS 证书:

  • MinIO 自动生成 TLS 证书
  • 用户指定的 TLS 证书
  • cert-manager 管理的 TLS 证书

你也可以部署未启用 TLS 的 MinIO 租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.requestAutoCertTenantSpec.certConfig 字段。

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看这些字段及其当前配置(如果已配置)。

  2. 按需创建或修改租户 YAML,设置 requestAutoCertcertConfig 的值。 例如:

    spec:
       requestAutoCert: true
       certConfig:
         commonName: "CN=MinioTenantCommonName"
         organizationName: "O=MyOrganizationName"
         dnsNames:
           - 'minio-tenant.domain.tld'
           - '*.kubernete.cluster.dns.path.tld'

    spec.certConfig.dnsNames 应包含 TLS 证书所覆盖的 SAN 列表。

    创建或修改租户资源时,可参考 固定到 v7.1.1 的 Kustomize Tenant base YAML 作为基线模板。

  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.externalCertsCecret 字段

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看该字段当前配置(如果已配置)。

  2. 创建或修改租户 YAML,使其引用适当的 cert-manager 资源。

    例如,以下租户 YAML 片段引用了一个名为 myminio-tls 的 cert-manager 资源:

    apiVersion: minio.min.io/v2
    kind: Tenant
    metadata:
    name: myminio
    namespace: minio-tenant
    spec:
       ## Disable default tls certificates.
       requestAutoCert: false
       ## Use certificates generated by cert-manager.
       externalCertSecret:
          - name: default-domain
            type: cert-manager.io/v1
          - name: internal-domain
            type: cert-manager.io/v1
          - name: external-domain
            type: cert-manager.io/v1
  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.externalCertSecret 字段。

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看该字段当前配置(如果已配置)。

  2. 创建或修改租户 YAML,使其引用一个类型为 kubernetes.io/tls 的 secret:

    例如,以下租户 YAML 片段为 MinIO 租户可接受连接的每个域名引用了两份 TLS secret:

    apiVersion: minio.min.io/v2
    kind: Tenant
    metadata:
    name: myminio
    namespace: minio-tenant
    spec:
       ## Disable default tls certificates.
       requestAutoCert: false
       ## Use certificates generated by cert-manager.
       externalCertSecret:
       - name: domain-certificate-1
       type: kubernetes.io/tls
       - name: domain-certificate-2
       type: kubernetes.io/tls
  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

MinIO Server 会为每个节点搜索 TLS 私钥和证书,并使用这些凭据启用 TLS。 MinIO 会在发现并验证证书后自动启用 TLS。 搜索位置取决于你的 MinIO 配置:

默认情况下,MinIO server 会在以下目录中查找每个节点的 TLS 私钥和证书:

${HOME}/.minio/certs

其中 ${HOME} 是运行 MinIO 服务端进程的用户主目录。 如果 ${HOME}/.minio/certs 目录不存在,你可能需要手动创建它。

对于由 systemd 管理的部署,该路径必须对应运行 MinIO 进程的 USER。 如果该用户没有主目录,请改用 Custom Path 选项。

你可以通过 minio server --certs-dir-S 参数指定 MinIO server 搜索证书的路径。

例如,以下命令片段指示 MinIO 进程使用 /opt/minio/certs 目录存放 TLS 证书。

minio server --certs-dir /opt/minio/certs ...

运行 MinIO service 的用户 必须 对该目录拥有读写权限。

请将证书放入 /certs 目录,并为 MinIO 需要呈现 TLS 证书的每个附加域名在 /certs 下创建一个子目录。 虽然 MinIO 对目录名称没有强制要求,但建议将子目录命名为对应域名,以便人工识别。 请将该域名的 TLS 私钥和公钥证书放入对应子目录中。

/path/to/certs
   private.key
   public.crt
   s3-example.net/
      private.key
      public.crt
   internal-example.net/
      private.key
      public.crt

31.3 - cert-manager

使用 cert-manager 管理 TLS 证书

本指南介绍如何安装 cert-manager 以管理 TLS 证书。 本文假设你使用的是全新或刚初始化的 MinIO Operator 安装环境。

说明

说明

本指南使用自签名 ClusterIssuer。 你也可以使用 cert-manager 支持的其他 Issuer

主要区别在于,你必须向 MinIO 提供该 Issuer 的 CA 证书,而不是本文中提到的这些 CA。

如需更高级的配置,请参考 cert-manager 文档 以及你所在组织的证书规范。

cert-manager 负责管理 Kubernetes 集群中的证书。 MinIO Operator 支持使用 cert-manager 来管理和签发证书,作为 Operator 自行管理自身及其租户证书的替代方案。

cert-manager 从 IssuerClusterIssuer 获取有效证书,并能在证书过期前自动续期。

ClusterIssuer 可为多个命名空间签发证书。 Issuer 只能为其所在命名空间签发证书。

下图展示了 cert-manager 如何在 Kubernetes 集群的不同命名空间中提供证书。

Kubernetes 集群命名空间关系图,展示根级 ClusterIssuer 与三个拥有各自 Issuer 的命名空间之间的关系。

前提条件

配置 cert-manager

安装 cert-manager

以下命令使用 kubectl 安装 1.12.13 版本。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.13/cert-manager.yaml

推荐使用 Release 1.12.X LTS,但你也可以安装最新版本。 有关安装 cert-manager 的更多细节,请参见其 installation instructions

为集群创建自签名 ClusterIssuer

ClusterIssuer 是集群中的顶层 Issuer,其他所有证书都从它派生。

  1. 创建一个 ClusterIssuer 资源,请求 cert-manager 生成该对象。

    创建一个名为 selfsigned-root-clusterissuer.yaml 的文件,内容如下:

    # selfsigned-root-clusterissuer.yaml
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: selfsigned-root
    spec:
      selfSigned: {}
  2. 将该资源应用到集群:

    kubectl apply -f selfsigned-root-clusterissuer.yaml

后续步骤

继续配置 用于 MinIO Operator 的 cert-manager

32 - 部署检查清单

以下检查清单为验证 MinIO 部署是否具备生产就绪条件提供高层指导。

这些检查清单未必完全符合你特定部署拓扑或架构的精确要求,其定位是作为构建可靠生产部署的尽力而为指南。

MinIO SUBNET 用户可以 登录 并新建 issue,请求生产前部署评审。 通过 SUBNET 与 MinIO Engineering 协作,可确保为高性能且可靠的部署提供端到端支持。

社区用户可以在 MinIO Community Slack 寻求支持。 社区支持仅为 best-effort,不提供响应时间相关 SLA。

检查清单:

32.1 - 硬件检查清单

在为生产级分布式 MinIO 部署规划硬件配置时,请使用以下检查清单。

考虑因素

在为 MinIO 选型硬件时,请考虑以下因素:

生产硬件建议

以下检查清单遵循 MinIO 面向生产部署的 Recommended Configuration。 这里提供的指导仅作为基线,不能替代 MinIO SUBNET Performance Diagnostics、Architecture Reviews 以及 direct-to-engineering 支持。

与其他分布式系统一样,MinIO 在同一 服务器池 内的所有节点都使用相同配置时,通常能获得更好的效果。 请确保 pool 内各节点的硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)选择保持一致。

如果节点的硬件或软件配置不一致,部署可能表现出不可预测的性能。 对于适合将陈旧数据放在低成本硬件上的工作负载,应改为部署专用的“温”或“冷”MinIO 部署,并将数据 转移 到该层级。

说明

MinIO 不提供托管服务或硬件销售

如需查看硬件合作伙伴提供的服务器与存储组件精选清单,请参见我们的 Reference Hardware 页面。

说明

最低

推荐

专用于承载 MinIO Tenant 的 Kubernetes worker 节点。

每个 Tenant 4 个 worker

每个 Tenant 8 个以上 worker

为 MinIO Tenant 配置专用 Persistent Volume

每个 MinIO Server pod 4 个 PV

每个 MinIO Server pod 8 个以上 PV

高速网络基础设施

25GbE

100GbE

支持现代 SIMD 指令(AVX-512)的服务器级 CPU,例如 Intel® Xeon® Scalable 或更高规格。

每个 MinIO Pod 4 个 vCPU

每个 MinIO Pod 8 个以上 vCPU

可用内存 应在每台服务器使用量的基础上保留合理余量,并满足或超过该值。

每个 worker 节点 32GB 可用内存

每个 worker 节点 128GB 以上可用内存

说明

最低

推荐

专用裸机或虚拟主机(“主机”)。

4 台专用主机

8 台以上专用主机

为每台主机配置专用本地直连驱动器

每个 MinIO Server 4 块驱动器

每个 MinIO Server 8 块以上驱动器

高速网络基础设施

25GbE

100GbE

支持现代 SIMD 指令(AVX-512)的服务器级 CPU,例如 Intel® Xeon® Scalable 或更高规格。

每台主机 8 个 CPU/socket 或 vCPU

每台主机 16 个以上 CPU/socket 或 vCPU

可用内存 应在每台服务器使用量的基础上保留合理余量,并满足或超过该值。

每台主机 32GB 可用内存

每台主机 128GB 以上可用内存

警告

重要

以下领域对 MinIO 性能影响最大,重要性从高到低依次如下:

网络基础设施

吞吐量不足或受限会约束性能

存储控制器

固件过旧、吞吐量有限或硬件故障会约束性能并影响可靠性

存储(驱动器)

固件过旧,或硬件过慢、老化、故障,会约束性能并影响可靠性

在关注计算类约束等其他硬件资源之前,请优先确保这些领域的关键组件到位。

上述最低建议体现了 MinIO 在协助企业客户部署到多种 IT 基础设施、同时保持目标 SLA/SLO 方面的实践经验。 虽然 MinIO 可能在低于最低建议的拓扑上运行,但任何潜在的成本节省都要以可靠性、性能或整体功能下降为代价。

网络

MinIO 建议使用高速网络,以支撑所连接存储(聚合驱动器、存储控制器和 PCIe 总线)的最大可能吞吐量。 下表给出了不同物理或虚拟网络接口可支撑的最大存储吞吐量的一般参考值。 该表假设所有网络基础设施组件(例如路由器、交换机和物理线缆)同样支持对应的 NIC 带宽。

NIC 带宽(Gbps)

估算聚合存储吞吐量(GBps)

10Gbps

1.25GBps

25Gbps

3.125GBps

50Gbps

6.25GBps

100Gbps

12.5GBps

网络对 MinIO 性能影响最大,较低的单主机带宽会人为限制存储的潜在性能。 以下网络吞吐受限示例假设机械盘可提供约 100MB/S 的持续 I/O:

内存

内存主要限制每个节点可同时处理的并发连接数。

你可以使用以下公式计算每个节点的最大并发请求数:

totalRam/ramPerRequesttotalRam / ramPerRequest

若要计算每个请求使用的 RAM,请使用以下公式:

((2MiB+128KiB)×driveCount)+(2×10MiB)+(2×1MiB)((2MiB + 128KiB) \times driveCount) + (2 \times 10MiB) + (2 \times 1MiB)

10MiB 是默认的 erasure block size v1。 1 MiB 是默认的 erasure block size v2。

下表根据主机驱动器数量和系统 可用 RAM,列出节点上的最大并发请求数:

驱动器数量 32 GiB RAM 64 GiB RAM 128 GiB RAM 256 GiB RAM 512 GiB RAM
4 Drives 1,074 2,149 4,297 8,595 17,190
8 Drives 840 1,680 3,361 6,722 13,443
16 Drives 585 1,170 2.341 4,681 9,362

下表根据节点本地存储总量,给出为 MinIO 分配内存的一般建议:

主机总存储量 建议的主机内存
不超过 1 Tebibyte (Ti) 8GiB
不超过 10 Tebibyte (Ti) 16GiB
不超过 100 Tebibyte (Ti) 32GiB
不超过 1 Pebibyte (Pi) 64GiB
超过 1 Pebibyte (Pi) 128GiB
警告

重要

RELEASE.2024-01-28T22-35-53Z 开始,MinIO 在分布式部署中会为每个节点预分配 2GiB 内存,在单节点部署中会预分配 1GiB 内存。

存储

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

推荐的存储介质

MinIO 建议为每个 MinIO Tenant 配置满足其性能目标的 storage class。

在可能的情况下,请将 PV 底层的 Storage Class、CSI 或其他 provisioner 配置为将卷格式化为 XFS,以获得最佳性能。

请确保 Tenant 中所有已配置 PV 的底层存储类型(NVMe、SSD、HDD)保持一致。

请确保每个 Tenant 服务器池 内所有节点呈现给各 PV 的容量一致。 MinIO 会将每个 PV 的最大可用容量限制为该 pool 中最小的 PV。 例如,如果某个 pool 具有 15 个 10TB PV 和 1 个 1TB PV,MinIO 会将每个 PV 的可用容量限制为 1TB。

MinIO 建议在所有工作负载类型和规模下都使用闪存介质(NVMe 或 SSD)。 对性能要求较高的工作负载应优先选择 NVMe 而不是 SSD。

MinIO 不建议在生产环境中使用 HDD 存储。 HDD 存储通常无法提供现代工作负载所需的性能,而其规模化成本优势也会被介质本身的性能约束所抵消。

优先使用直连“本地”存储(DAS)

DAS,例如本地直连的 JBOD 阵列,相比网络存储(NAS、SAN、NFS)在性能和一致性方面具有显著优势。

虽然 MinIO Tenant 可以使用远程 Persistent Volume (PV) 资源,但通过网络执行 I/O 的成本通常会限制整体性能。

MinIO 强烈建议使用能够将存储配置到 Kubernetes 调度 MinIO pods 所在 worker 节点上的 CSI,例如 MinIO DirectPV

在其他场景中,也应尽可能选择能让 MinIO 像访问本地挂载文件系统一样访问存储的 CSI。 在 MinIO 与操作系统级存储访问 API 之间增加软件层或转换层的 CSI,必然会增加系统复杂度,并可能带来意料之外或不期望的行为。

请将 JBOD 阵列配置为无 RAID、无 pooling 或其他类似的软件层,使存储可以直接呈现给 MinIO。

对于虚拟机或需要以虚拟卷形式提供存储的系统,MinIO 只建议使用 thick LUN。

网络文件系统卷会破坏一致性保证

MinIO 严格的 read-after-writelist-after-write 一致性模型要求使用本地驱动器文件系统。 如果底层存储卷是 NFS 或类似的网络挂载存储卷,MinIO 无法提供一致性保证。

使用 XFS 格式化驱动器并保持一致挂载

MinIO 建议将 MinIO Persistent Volumes 底层驱动器格式化为 xfs

如果使用 CSI,请查阅对应 CSI 的文档,并确保其支持指定 xfs 文件系统。 MinIO 强烈建议避免使用会将驱动器格式化为 ext4btrfs 或其他文件系统的 CSI。

MinIO 预期所有已配置的 Persistent Volumes (PV) 都专供自身使用,且底层存储介质能够在指定挂载路径上保证对已存储数据的访问。 对底层存储介质的修改,包括但不限于外部或第三方应用干预,或对本地直连存储进行任意重新挂载,都可能导致异常行为或数据丢失。

请将驱动器格式化为 XFS,并以无 RAID 或其他 pooling 配置的 JBOD 阵列形式提供给 MinIO。 使用其他类型的后端存储(SAN/NAS、ext4、RAID、LVM)通常会降低性能、可靠性、可预测性和一致性。

格式化 XFS 驱动器时,请为每块驱动器设置唯一标签。 例如,以下命令会将四块驱动器格式化为 XFS,并为其设置对应标签。

mkfs.xfs /dev/sdb -L MINIODRIVE1
mkfs.xfs /dev/sdc -L MINIODRIVE2
mkfs.xfs /dev/sdd -L MINIODRIVE3
mkfs.xfs /dev/sde -L MINIODRIVE4

MinIO 要求 驱动器在重启后仍保持其挂载位置上的顺序不变。 MinIO 不支持 将已有 MinIO 数据的驱动器任意迁移到新的挂载位置,无论这是人工操作还是操作系统行为导致。

必须 使用 /etc/fstab 或类似的挂载控制系统,将驱动器挂载到固定路径。 例如:

$ nano /etc/fstab

# <file system>        <mount point>    <type>  <options>         <dump>  <pass>
LABEL=MINIODRIVE1      /mnt/drive-1     xfs     defaults,noatime  0       2
LABEL=MINIODRIVE2      /mnt/drive-2     xfs     defaults,noatime  0       2
LABEL=MINIODRIVE3      /mnt/drive-3     xfs     defaults,noatime  0       2
LABEL=MINIODRIVE4      /mnt/drive-4     xfs     defaults,noatime  0       2

在初始设置期间,你可以使用 mount -a 将这些驱动器挂载到这些路径。 否则,操作系统应在节点启动过程中自动完成这些驱动器的挂载。

MinIO 强烈建议 使用基于标签的挂载规则,而不是基于 UUID 的规则。 基于标签的规则允许你用格式和标签相同的替换盘,替换不健康或损坏的驱动器。 基于 UUID 的规则则要求编辑 /etc/fstab 文件,用新驱动器的 UUID 替换原有映射。

说明

说明

依赖挂载外部存储的云环境实例,如果一个或多个远程文件挂载返回错误或失败,可能在启动时直接失败。 例如,挂载持久化 EBS 卷的 AWS ECS 实例,如果一个或多个 EBS 卷挂载失败,可能无法按照标准 /etc/fstab 配置正常启动。

你可以设置 nofail 选项,在启动时静默这些错误并允许实例在存在一个或多个挂载问题时继续启动。

但对于使用本地直连磁盘的系统,不应使用该选项,因为静默驱动器错误会阻止 MinIO 和操作系统以正常方式响应这些错误。

禁用 XFS 的出错重试

MinIO 强烈建议 通过 max_retries 配置禁用 retry-on-error 行为,至少针对以下错误类别:

默认的 max_retries 设置通常会让文件系统在出错后无限重试,而不是将错误向上传递。 MinIO 可以正确处理 XFS 错误,因此 retry-on-error 行为最多只会引入不必要的延迟或性能下降。

关于如何配置文件系统级设置,请以所选 CSI 或 StorageClass 的文档为准。

以下脚本会遍历指定挂载路径下的所有驱动器,并将推荐错误类别对应的 XFS max_retries 设置为 0,即“出错立即失败”。 该脚本会忽略所有未挂载的驱动器,无论它们是手动未挂载,还是未通过 /etc/fstab 挂载。 请将 /mnt/drive 这一行修改为符合你 MinIO 驱动器路径模式的值。

#!/bin/bash

for i in $(df -h | grep /mnt/drive | awk '{ print $1 }'); do
      mountPath="$(df -h | grep $i | awk '{ print $6 }')"
      deviceName="$(basename $i)"
      echo "Modifying xfs max_retries and retry_timeout_seconds for drive $i mounted at $mountPath"
      echo 0 > /sys/fs/xfs/$deviceName/error/metadata/EIO/max_retries
      echo 0 > /sys/fs/xfs/$deviceName/error/metadata/ENOSPC/max_retries
      echo 0 > /sys/fs/xfs/$deviceName/error/metadata/default/max_retries
done
exit 0

你必须在所有 MinIO 节点上运行此脚本,并将其配置为在重启后重新执行,因为 Linux 操作系统通常不会持久保存这些修改。 你可以使用 @reboot 时机的 cron 任务,在节点每次重启时运行上述脚本,以确保所有驱动器都禁用了 retry-on-error。 使用 crontab -e 创建以下任务,并将脚本路径修改为各节点上的实际路径:

@reboot /opt/minio/xfs-retry-settings.sh

统一驱动器类型与容量

请确保 MinIO 部署底层存储的驱动器类型(NVMe、SSD、HDD)一致。 MinIO 不区分存储类型,也不支持在单一部署内部配置“热”或“温”驱动器。 混用不同驱动器类型通常会导致性能下降,因为无论更快驱动器能力如何,部署中最慢的驱动器都会成为瓶颈。

请在每个 MinIO 服务器池 的所有节点上使用相同容量和类型的驱动器。 MinIO 会将每块驱动器的最大可用容量限制为部署中最小的那块驱动器容量。 例如,如果某个部署中有 15 块 10TB 驱动器和 1 块 1TB 驱动器,MinIO 会将每块驱动器的可用容量限制为 1TB。

推荐的硬件测试

操作系统诊断工具

如果你无法运行 mc support diag,或者其结果出现异常,可以改用操作系统默认提供的工具。

请在所有服务器上分别测试每块驱动器,以确认它们的性能一致。 使用这些操作系统级工具的结果来验证你的存储硬件能力。 请记录这些结果,以备后续参考。

  1. 测试驱动器写入性能

    此测试通过按指定块数、每次最多写入指定字节数的方式向驱动器写入新数据(非缓存),以模拟驱动器在写入非缓存数据时的实际工作方式。 这可以让你在保持文件 I/O 一致的前提下,观察驱动器的真实写入性能。

    dd if=/dev/zero of=/mnt/driveN/testfile bs=128k count=80000 oflag=direct conv=fdatasync > dd-write-drive1.txt

    请将 driveN 替换为你要测试的驱动器路径。

    dd

    用于复制和粘贴数据的命令

    if=/dev/zero

    /dev/zero 读取,这是一种系统生成的、无限输出 0 字节的数据流,可用于创建指定大小的文件

    of=/mnt/driveN/testfile

    写入到 /mnt/driveN/testfile

    bs=128k

    每次最多写入 128,000 字节

    count=80000

    最多写入 80000 个数据块

    oflag=direct

    使用 direct I/O 写入,避免数据被缓存

    conv=fdatasync

    在结束前将输出文件数据物理写入磁盘

    > dd-write-drive1.txt

    将操作输出内容写入当前工作目录下的 dd-write-drive1.txt

    该操作会返回已写入文件数量、总写入字节数、操作总耗时(秒)以及某种字节每秒表示的写入速度。

  2. 测试驱动器读取性能

    dd if=/mnt/driveN/testfile of=/dev/null bs=128k iflag=direct > dd-read-drive1.txt

    请将 driveN 替换为你要测试的驱动器路径。

    dd

    用于复制和粘贴数据的命令

    if=/mnt/driveN/testfile

    /mnt/driveN/testfile 读取;请替换为用于测试驱动器读取性能的文件路径

    of=/dev/null

    写入 /dev/null,这是一个在操作完成后不会保留内容的虚拟文件

    bs=128k

    每次最多写入 128,000 字节

    count=80000

    最多写入 80000 个数据块

    iflag=direct

    使用 direct I/O 读取,避免数据被缓存

    > dd-read-drive1.txt

    将操作输出内容写入当前工作目录下的 dd-read-drive1.txt

    请使用足够大的文件,以模拟部署的主要使用场景,从而获得准确的读取测试结果。

    以下建议可在性能测试时提供帮助:

    • 小文件:< 128KB
    • 普通文件:128KB – 1GB
    • 大文件:> 1GB

    你可以使用 head 命令创建测试文件。 以下命令示例会创建一个名为 testfile 的 10 Gigabyte 文件。

    head -c 10G </dev/urandom > testfile

    该操作会返回已读取文件数量、总读取字节数、操作总耗时(秒)以及某种字节每秒表示的读取速度。

第三方诊断工具

I/O 控制器测试

使用 IOzone 对输入/输出控制器及所有驱动器组合进行测试。 请记录部署中每台服务器的性能数据。

iozone -s 1g -r 4m -i 0 -i 1 -i 2 -I -t 160 -F /mnt/sdb1/tmpfile.{1..16} /mnt/sdc1/tmpfile.{1..16} /mnt/sdd1/tmpfile.{1..16} /mnt/sde1/tmpfile.{1..16} /mnt/sdf1/tmpfile.{1..16} /mnt/sdg1/tmpfile.{1..16} /mnt/sdh1/tmpfile.{1..16} /mnt/sdi1/tmpfile.{1..16} /mnt/sdj1/tmpfile.{1..16} /mnt/sdk1/tmpfile.{1..16} > iozone.txt

-s 1g

每个文件大小为 1G

-r

4m,即 4MB 块大小

-i #

0=write/rewrite,1=read/re-read,2=random-read/write

-I

使用 Direct-IO 模式

-t N

线程数(numberOfDrives * 16)

-F <>

文件列表(上述命令按每块驱动器 16 个文件进行测试)

适用于 MinIO 订阅的推荐工具

警告

重要

本节提到的工具 需要 MinIO 订阅。MinIO 强烈建议所有生产部署结合其 SUBNET 许可证使用 AIStor Object Store。更多信息请参见 MinIO AIStor pricing page

  1. 健康诊断工具

    生成部署健康状态摘要。 如果你可以访问 SUBNET,可以将结果上传到那里。

    mc support diag ALIAS --airgap

    请将 ALIAS 替换为该部署中定义的 alias

  2. 网络测试

    对 alias 为 minio1 的集群运行网络吞吐测试。

    mc support perf net minio1
  3. 驱动器测试

    对 alias 为 minio1 的集群,在所有节点上的所有驱动器执行读写性能测量。 该命令使用默认的 4MiB blocksize。

    mc support perf drive minio1
  4. 对象测试

    对 alias 为 minio1 的对象执行 S3 读写性能测量。 MinIO 会自动调优并发度,以获得最大吞吐量和 IOPS(Input/Output Per Second)。

    mc support perf object minio1

32.2 - 安全检查清单

在为生产级分布式 MinIO 部署规划安全配置时,请使用以下检查清单。

必做步骤

在 MinIO 或所选的第三方身份提供商(LDAP/Active Directory 或 OpenID)中定义组策略

在 MinIO 或所选的第三方身份提供商上定义单个访问策略

(仅 Kubernetes 部署)将租户配置为使用所选的第三方身份提供商

在防火墙中放行到 MinIO 服务端 S3 API 监听端口的 TCP 流量(默认:9000)。

在防火墙中放行到 MinIO Server Console 监听端口 的 TCP 流量(推荐默认值:9090)。

静态数据加密

MinIO 通过 Key Encryption Service (KES) 支持以下外部 KMS 提供方:

下载并安装 MinIO Key Encryption Service (KES)

启用 TLS

为 KES 生成私钥和公钥

为 MinIO 生成私钥和公钥

创建 KES 配置文件并启动服务

为密钥管理服务(KMS)生成外部密钥

将 MinIO 连接到 KES

启用服务端加密

传输中加密(”In flight”)

启用 TLS

为每个访问 MinIO 的内部和外部域名分别添加证书和密钥

使用 TLS 1.3 或 TLS 1.2 支持的 cipher 生成 TLS 私钥和公钥

配置受信任的 Certificate Authority (CA) 存储

暴露 Kubernetes Service,例如使用 NGINX

(可选)验证证书,例如使用 https://www.sslchecker.com/certdecoder

32.3 - 软件检查清单

在为生产级分布式 MinIO 部署规划软件配置时,请使用以下检查清单。

MinIO 前置条件

运行 Linux 操作系统且内核版本为 6.6+ 的服务器。Red Hat Enterprise Linux (RHEL) 10 或 Ubuntu LTS 22.04.01+ 默认提供这类内核。 确保所选操作系统使用 LTS 且仍受支持的 6.6+ Linux 内核版本。

一种在节点之间同步时间的方法,例如 ntptimedatectltimesyncd。 具体使用哪种方法取决于操作系统。 请查阅你的操作系统文档,了解如何与时间服务器同步时间。

禁用会对文件系统、系统级调用或内核级调用进行索引、扫描或审计的系统服务。 这些服务可能因资源争用或拦截 MinIO 操作而降低性能。

MinIO 强烈建议在运行 MinIO 的主机上卸载或禁用以下服务:

  • mlocateplocate

  • updatedb

  • auditd

  • Crowdstrike Falcon

  • 杀毒软件 (clamav)

上述列表列出了在 MinIO 这类高性能系统上,最常见的、已知会引发性能或行为问题的服务或软件。 对于在 MinIO 主机上功能与上述项目类似的其他服务或软件,也应考虑移除或禁用。

或者,将这些服务配置为忽略或排除 MinIO 服务端进程,以及 MinIO 访问的 全部 驱动器或驱动器路径。

对远程服务器具有系统管理员访问权限

一种分布式系统管理工具,例如 Ansible、Terraform,或在编排环境中使用 Kubernetes。 Kubernetes 基础设施应使用 MinIO Operator 以获得最佳效果。

用于处理请求路由的负载均衡器(例如 NGINX

用于监控和指标采集的 Prometheus 或兼容 Prometheus 的方案

已完成 Grafana 配置,用于仪表板展示

(可选)在本地主机系统上安装 mc

安装 MinIO

在部署中的所有节点上安装相同版本的 MinIO。

安装后任务

(可选)从本地机器使用 mc alias set 为每台服务器创建 mc alias,以便通过命令行从本地管理 MinIO 部署

配置 存储桶复制,将一个存储桶中的内容复制到另一个存储桶位置

配置 站点复制,同步多个分散数据中心位置的内容

使用 生命周期管理 配置对象保留规则,以管理对象何时过期

使用分层配置 对象存储级别规则,在热、温、冷存储之间移动对象,以最大化存储成本效率

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

第三方身份提供商任务

使用 Security Token Service (STS) 对 MinIO 进行身份验证
启用该功能需要 MinIO 支持。

33 - 硬件故障恢复

分布式 MinIO 部署依赖 纠删码,对多块驱动器或多个节点故障提供内建容错能力。 根据部署拓扑和所选纠删码校验位,MinIO 在保持对象读取访问能力(“read quorum”)的前提下,最多可容忍部署中一半驱动器或节点丢失。

下表列出了 MinIO 部署中的典型故障类型,以及对应的恢复流程链接:

故障类型 说明
驱动器故障 MinIO 支持将故障驱动器热替换为新的健康驱动器。
节点故障 MinIO 会检测节点何时重新加入部署,并在其重新并入集群后不久主动开始对该节点执行 自愈,恢复此前存储在该节点上的数据。
站点故障 MinIO Site Replication 支持在站点完全丢失后,对存储桶、对象以及可复制的配置项执行完整重同步。

由于 MinIO 即使处于降级状态也通常不会出现显著性能损失,管理员可以根据硬件故障速率来安排替换窗口。 “正常”故障率(单个驱动器或节点故障)通常允许采用更从容的替换节奏,而“关键”故障率(多个驱动器或节点故障)则可能需要更快响应。

对于包含一个或多个部分故障或已处于降级状态的驱动器的节点(例如驱动器错误增加、SMART 告警、MinIO 日志中出现超时等),如果集群剩余健康驱动器足以维持 读写仲裁,您可以安全地卸载该驱动器。 相较于持续产生读写错误的驱动器,缺失驱动器对部署的破坏性反而更小。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

说明

MinIO 专业支持

MinIO SUBNET 用户可以 登录 并创建与驱动器、节点或站点故障相关的新 issue。 通过 SUBNET 与 MinIO Engineering 协作,可提升生产 MinIO 部署恢复操作成功率,并获得根因分析与健康诊断支持。

社区用户可以在 MinIO Community Slack 寻求支持。 社区支持仅为尽力而为,不提供响应时间相关 SLA。

33.1 - 驱动器故障恢复

MinIO 支持将故障驱动器热替换为新的健康驱动器。 MinIO 会检测这些驱动器并对其执行自愈,无需在节点级或部署级执行重启。 MinIO 自愈 仅发生在被替换的驱动器上,大多数情况下对部署性能影响很小或几乎可以忽略。

MinIO 自愈会确保恢复到驱动器上的所有数据保持一致且正确。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

以下步骤提供了更详细的驱动器替换流程。 这些步骤假定你使用的是一个 MinIO 部署,其中每个节点都按照 文档中的前置条件,通过 /etc/fstab 配合逐盘标签来管理驱动器。

1) 卸载故障驱动器

使用 umount 卸载每块故障驱动器。例如,以下命令会卸载位于 /dev/sdb 的驱动器:

umount /dev/sdb

2) 替换故障驱动器

从节点硬件中移除故障驱动器,并将其替换为已知健康的驱动器。替换驱动器 必须 满足以下要求:

使用容量更大的替换驱动器并不会增加集群总存储量。 MinIO 会以 服务器池最小 驱动器的容量,作为该 服务器池 内所有驱动器的上限。

以下命令会将驱动器格式化为 XFS,并为其分配一个与故障驱动器一致的标签。

mkfs.xfs /dev/sdb -L DRIVE1

MinIO 强烈建议 使用基于标签的挂载方式,以确保驱动器顺序在系统重启后仍保持一致。

3) 审查并更新 fstab

检查 /etc/fstab 文件,并按需更新,使故障驱动器对应条目指向新格式化的替换盘。

例如,考虑以下配置:

$ cat /etc/fstab

  # <file system>  <mount point>  <type>  <options>         <dump>  <pass>
  LABEL=DRIVE1     /mnt/drive1    xfs     defaults,noatime  0       2
  LABEL=DRIVE2     /mnt/drive2    xfs     defaults,noatime  0       2
  LABEL=DRIVE3     /mnt/drive3    xfs     defaults,noatime  0       2
  LABEL=DRIVE4     /mnt/drive4    xfs     defaults,noatime  0       2
说明

说明

依赖挂载外部存储的云环境实例,如果一个或多个远程文件挂载返回错误或失败,可能会遇到启动失败。 例如,挂载持久化 EBS 卷的 AWS ECS 实例,如果一个或多个 EBS 卷挂载失败,可能无法按标准 /etc/fstab 配置正常启动。

你可以设置 nofail 选项,在启动时静默这些错误,并允许实例在存在一个或多个挂载问题时继续启动。

但在使用本地直连磁盘的系统上,不应使用该选项,因为静默驱动器错误会阻止 MinIO 和操作系统以正常方式响应这些错误。

基于前述示例命令,由于 /mnt/drive1 处的替换驱动器与故障驱动器使用相同的 DRIVE1 标签,因此 fstab 无需修改。

4) 重新挂载替换后的驱动器

使用 mount -a 重新挂载本流程开始时卸载的驱动器:

mount -a

该命令应完成对所有替换驱动器的重新挂载。

5) 监控 MinIO 的驱动器识别与自愈状态

重新挂载驱动器后,使用 mc admin logs 命令 systemd 管理的安装中使用 journalctl -u minio,监控服务端日志输出。 输出中应包含识别到每块已格式化且为空驱动器的消息。

使用 mc admin heal 监控部署整体的 自愈 状态。 MinIO 会积极地对替换驱动器执行自愈,以确保部署快速从降级状态恢复。

6) 后续步骤

继续监控集群中是否出现更多驱动器故障。某些批次的驱动器可能会在接近的时间窗口内集中失效。 若部署中的驱动器故障率高于预期,应安排专项维护,集中替换已知存在问题的驱动器批次。 可考虑使用 MinIO SUBNET,与 MinIO Engineering 协作获取此类操作的指导。

33.2 - 节点故障恢复

如果某个 MinIO 节点发生完全硬件故障(例如所有驱动器、数据等全部丢失),则该节点在重新加入部署后会开始执行 自愈操作。 MinIO 自愈仅发生在被替换的硬件上,通常不会影响部署性能。

MinIO 自愈会确保恢复到驱动器上的所有数据保持一致且正确。

说明

磁盘独占访问

MinIO 要求 对用于对象存储的磁盘或卷拥有 独占 访问权限。 任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的磁盘或卷, 或 MinIO 在其上放置的对象或文件执行 任何 操作。

除非得到 MinIO Engineering 的明确指示,否则不要使用脚本或工具直接修改、 删除或移动这些磁盘上的任何数据分片、校验分片或元数据文件,包括在磁盘或节点 之间迁移这些文件。 这类操作极有可能导致大范围损坏和数据丢失,超出 MinIO 的自愈能力。

替换节点的硬件应与故障节点大体相近。 使用更好的硬件不会带来负面性能影响。

替换驱动器的硬件也应与故障驱动器大体相近。 例如,应使用相同容量的另一块 SSD 来替换故障 SSD。 虽然你可以使用容量更大的驱动器,但 MinIO 会以 服务器池最小 驱动器的容量,作为该 pool 内所有驱动器的上限。

以下步骤提供了更详细的节点替换流程。 这些步骤假定你使用的是一个 MinIO 部署,其中每个节点都按照 文档中的前置条件 配置了 DNS 主机名。

1) 启动替换节点

请确保新节点已经按照行业、监管或组织内部标准与要求,完成所有必要的安全、固件和操作系统更新。

新节点的软件配置 必须 与部署中其他节点保持一致,包括但不限于操作系统和内核版本及其配置。 异构软件配置可能导致部署中出现意料之外或不期望的行为。

2) 更新新节点的主机名解析

可选 仅当替换节点的 IP 地址与故障主机不同时时,才需要执行此步骤。

确保原先关联到故障节点的主机名现在解析到新节点。

例如,如果 https://minio-1.example.net 之前解析到故障主机,那么它现在应解析到新主机。

3) 下载并准备 MinIO Server

按照 部署流程 下载并运行 MinIO server,并使用与部署中其他节点一致的配置。

4) 将节点重新加入部署

在该节点上启动 MinIO server 进程,并使用 mc admin logs 监控其输出;如果是 systemd 管理的安装,则可以使用 journalctl -u minio 监控 MinIO service 日志。

服务端输出应表明它已经检测到部署中的其他节点,并开始执行 自愈操作

使用 mc admin heal 监控部署整体的自愈状态。 MinIO 会积极地对该节点执行自愈,以确保部署快速从降级状态恢复。

5) 后续步骤

继续监控部署,直到自愈完成。 如果部署持续或反复出现节点故障,应安排专项维护以定位根因。 可考虑使用 MinIO SUBNET,与 MinIO Engineering 协作获取此类操作的指导。

33.3 - 站点故障恢复

尽管整个站点丢失属于重大事故,MinIO 仍可将其影响控制在相对较小且可恢复的范围内。 站点恢复方式取决于该站点使用的复制方案。

Site Replication

从健康对等站点完整恢复 IAM 配置、存储桶配置和数据

Bucket Replication

对每个已配置复制的存储桶,从健康远端位置恢复对象和元数据

mc mirror

仅从健康远端位置恢复对象数据,不包含版本控制信息

站点复制自愈会自动将现有站点中的 IAM 设置、存储桶、存储桶配置和对象添加到新站点,无需额外操作。

如果其他健康站点上仍保留任何存储桶复制规则,则无法配置站点复制。 存储桶复制与站点复制互斥。

如果你准备从存储桶复制切换到站点复制,则必须先在健康站点上移除所有存储桶复制规则,然后再配置站点复制。

将不健康对等站点恢复到 Site Replication

警告

重要

RELEASE.2023-01-02T09-40-09Z 版 MinIO server 包含重要修复,用于在包含三个或更多对等站点的复制配置中移除已下线站点。

对于已配置站点复制的部署,请规划将所有对等站点 测试并升级 到该版本。 一旦发生站点故障,你可以先将剩余健康站点更新到该指定版本,再执行本流程。

站点复制 可让两个或更多 MinIO 部署在 IAM 策略、存储桶、存储桶配置、对象及对象元数据方面保持同步。 如果某个对等站点由于重大灾害或长期停电等原因失效,你可以使用剩余健康站点来恢复 可复制数据

以下流程适用于站点丢失前已启用 站点复制 的场景,并可用于恢复数据。 本流程假设一个或多个对等站点已 完全丢失,而不是由于复制滞后、网络延迟或部署短暂停机所导致的延后。

  1. 使用带 --force 选项的 mc admin replicate rm 命令,将故障站点从 MinIO 站点复制配置中移除。

    以下命令会强制将一个不健康的对等站点从复制配置中移除:

    mc admin replicate rm HEALTHY_PEER UNHEALTHY_PEER --force
    • HEALTHY_PEER 替换为复制配置中任一健康对等站点的 alias
    • UNHEALTHY_PEER 替换为不健康对等站点的 alias

    站点复制配置中的所有健康对等站点都会自动更新并移除该不健康对等站点。 你可以使用 mc admin replicate info 命令验证新的站点复制配置。

  2. 按照 站点复制要求 部署一个新的 MinIO 站点。

    • 不要上传任何数据,也不要在既定要求之外对部署进行其他配置。
    • 验证新的 MinIO 部署运行正常,并且与其他对等站点具备双向连通性。
    • 确保新站点与现有对等站点使用相同的 server 版本
    注意

    警告

    mc admin replicate rm --force 命令只会作用于站点复制配置中在线或健康的节点。 被移除的离线 MinIO 部署仍会保留其原始复制配置,因此如果该部署恢复正常运行,它仍会继续向已配置的对等站点执行复制操作。

    如果你计划复用这些硬件重新加入站点复制配置,那么在重新初始化 MinIO 并将该站点重新加入复制配置之前,必须彻底清空该部署的驱动器。

  3. 替换后的对等站点加入 复制配置。

    使用 mc admin replicate add 命令,将新站点加入复制配置:

    mc admin replicate add HEALTHY_PEER NEW_PEER
    • HEALTHY_PEER 替换为复制配置中任一健康对等站点的 alias
    • NEW_PEER 替换为新对等站点的 alias

    站点复制配置中的所有健康对等站点都会自动更新,将新对等站点纳入配置。 你可以使用 mc admin replicate info 命令验证新的站点复制配置。

  4. 使用 mc admin replicate resync 对新对等站点执行重同步。

    mc admin replicate resync start HEALTHY_PEER NEW_PEER
    • HEALTHY_PEER 替换为复制配置中任一健康对等站点的 alias
    • NEW_PEER 替换为新对等站点的 alias
  5. 验证复制状态。

    使用以下命令跟踪复制状态:

主动式存储桶复制重同步

对于故障发生前已启用 存储桶复制 的场景,你可以使用 mc replicate resync 将数据恢复到新站点。 先创建一个新站点替换故障部署,然后将现有健康、且已启用存储桶复制的部署中的数据同步到新站点。

  1. 部署一个新的 MinIO 站点。
  2. 按需配置 IAM 和用户。
  3. 在有数据的站点上,使用 mc admin bucket remote add 命令创建新的 remote target,并记录输出中的 ARN。
  4. 在有数据的站点上,使用上一步命令返回的 ARN 作为参数执行 mc replicate resync start,在新站点上重建存储桶。
  5. 等待重同步完成(可使用 mc replicate resync status 检查)。
  6. 从新的 MinIO 站点向现有目标存储桶配置存储桶复制规则。
  7. (Optional) 删除目标部署中的存储桶复制规则,以恢复 active-passive 复制场景。

被动式存储桶复制重同步

存储桶复制 可以通过将目标存储桶中的数据复制到新的 MinIO 站点,直接恢复站点内容。

作为被动过程,存储桶复制在站点恢复场景中可能无法达到理想的恢复速度。

存储桶复制依赖标准复制 scanner 队列,而该队列不会优先于其他过程执行。 如果恢复流程对 SLA/SLO 要求更严格,请按前文所述使用基于 mc replicate resync 命令的主动式存储桶复制流程。

存储桶复制规则会将对象、其 version ID、版本以及其他元数据复制到目标存储桶。 如果站点丢失前已启用存储桶复制,那么 MinIO 可以将带有这些属性的对象恢复到新的 MinIO 站点。

  1. 部署一个新的 MinIO 站点。

  2. 按需配置 IAM 和用户。

  3. 在剩余的目标存储桶部署上,为每个存储桶创建指向新 MinIO 站点的存储桶复制规则。

  4. 等待复制完成。

  5. 从新的 MinIO 站点向现有目标存储桶配置存储桶复制规则。

  6. (Optional) 删除目标部署中的存储桶复制规则,以恢复 active-passive 复制场景。

    如果你希望继续保持存储桶之间的 active-active 复制,请不要删除用于恢复数据的这些部署中的存储桶复制规则。 在 active-active 复制中,任一位置上对象的变更都会影响另一位置上的对象。

镜像

MinIO 的镜像(mirroring)可以从任意兼容 S3 的存储系统复制对象。

无论源端如何,镜像(mirroring)只会复制每个对象的最新版本,不包含版本控制元数据。 因此你无法通过这种方式恢复这些属性。

当你只需要恢复对象的最新版本时,请使用 mc mirror。 如果你是从另一个 MinIO 部署复制数据,并希望恢复对象的版本历史及版本元数据,则应在这些机制原本已启用的前提下使用存储桶复制或站点复制。

  1. 部署一个新的 MinIO 站点。
  2. 按需配置 IAM 和用户。
  3. 在新站点上创建存储桶。
  4. 使用 mc cp CLI 命令,将镜像位置中的内容复制到新的 MinIO 站点。

34 - 故障排查

概述

MinIO 用户有两种支持渠道可选。

  1. 通过 公开 Slack 频道 获取社区支持。

    社区支持仅为尽力而为,不提供 SLASLO

  2. 付费订阅用户可访问 MinIO Subscription Network,即 SUBNET,可获得健康检查、直接面向工程团队的支持以及许可证管理。

    当前许可级别和定价请参见 MinIO SUBNET 页面。

工具

MinIO Client 提供了多项功能,用于显示 MinIO 部署信息或监控其活动。

升级与版本支持

MinIO 会定期发布更新,以引入新功能、提升性能、解决安全问题或修复缺陷。 这些发布可能非常频繁,并且会因产品不同而有所差异。

在生产部署升级之前,务必先在开发环境中测试软件版本。

建议的升级周期

MinIO 建议始终安装最新版本,以获得安全增强和其他改进。 我们理解,如此频繁的发布节奏对某些组织而言可能并不现实。 在这种情况下,我们建议使用发布不超过六个月的 MinIO 及相关产品版本。

版本对齐

由于 MinIO 各产品会按照各自的节奏分别发布,我们建议采用以下版本对齐实践:

MinIO

更新到最新版本,或更新到不超过六个月的版本。

MinIO 客户端

更新到在 MinIO 发布后紧接着发布的 mc 版本,时间间隔控制在一到两周内。

MinIO Operator

使用不早于 Operator 发布时最新版本的 MinIO 版本。 该发布时间点的最新 MinIO 版本,可在对应 Operator 版本示例租户 kustomization YAML 文件中的 quay.io 链接中找到。

创建新租户时,Operator 会使用最新可用的 MinIO 发布镜像,或使用你在创建租户时指定的镜像。

Upgrading the Operator 不会自动升级现有租户。 需要单独执行 Upgrade existing tenant 以升级 MinIO 版本。

34.1 - 加密文件

说明

你可以对 mc support inspect 命令的输出进行加密,以便在将文件传输到 MinIO SUBNET 时提升安全性。

加密

你可以使用 --encrypt 标志对输出的 zip 文件进行加密,以提升安全性。 MinIO 提供了一个二进制工具用于解密该文件。

使用加密标志后,输出中会提供一个解密密钥。 输出类似如下:

$ mc support inspect --encrypt play/test123/test*/*/part.*
mc: Encrypted file data successfully downloaded as inspect.ad2b43d8.enc
mc: Decryption key: ad2b43d847fdb14e54c5836200177f7158b3f745433525f5d23c0e0208e50c9948540b54

mc: The decryption key will ONLY be shown here. It cannot be recovered.
mc: The encrypted file can safely be shared without the decryption key.
mc: Even with the decryption key, data stored with encryption cannot be accessed.

如输出所示,MinIO 只会显示这一次加密密钥,之后将无法再次显示或恢复。

解密

MinIO 提供了解密工具,用于处理由 mc support inspect 生成的文件。

要安装解密工具,请先安装 Go,然后运行

go install github.com/minio/minio/docs/debugging/inspect@latest

安装 inspect 解密二进制文件后,使用以下命令解密文件:

inspect -key=<decryptionKeyFromOutput> <file.enc>

<decryptionKeyFromOutput> 替换为生成诊断文件时提供的解密密钥。 将 <file.enc> 替换为下载后的文件名,可以包含相对路径或绝对路径。

-key 标志是可选的。如果未提供,程序会通过交互式提示要求输入密钥。 文件名中包含了解密密钥的一部分。 这有助于确认该文件应使用哪个密钥。

解密过程会输出一个未加密的 .zip 文件。

35 - 升级旧版 MinIO Operator

MinIO 为旧版 MinIO Operator 支持以下升级路径:

当前版本 支持升级到
5.0.15 及更高版本 7.1.1
5.0.0 到 5.0.14 5.0.15
4.2.3 到 4.5.7 4.5.8
4.0.0 到 4.2.2 4.2.3
3.X.X 4.2.2

如果要从 4.5.7 或更早版本升级到 7.1.1,你必须先升级到 4.5.8,然后再升级到 5.0.15。 根据你当前的版本,可能需要经过一个或多个中间升级步骤才能到达 v4.5.8。

升级到 5.0.15 后,请参阅 升级 MinIO Operator 继续升级到最新版本。

将 MinIO Operator 4.5.8 及更高版本升级到 5.0.15

说明

前提条件

本流程需要满足以下条件:

  • 你已有一个运行 4.5.8 或更高版本的 MinIO Operator 部署
  • 你的 Kubernetes 集群版本为 1.21.0 或更高
  • 你的本地主机已安装 kubectl,并已配置好对 Kubernetes 集群的访问

本流程将 MinIO Operator 从任意 4.5.8 及以上版本升级到 5.0.15

Tenant 自定义资源定义变更

以下变更适用于 Operator v5.0.0 或更高版本:

Log Search 和 Prometheus

最新版本的 Operator 已将 Log Search 和 Prometheus 从内置工具中移除。 以下步骤会备份现有 YAML 文件、执行一些清理操作,并给出继续使用其中一个或两个功能的方法。

  1. 备份 Prometheus 和 Log Search 的 YAML 文件。

    export TENANT_NAME=myminio
    export NAMESPACE=mynamespace
    kubectl -n $NAMESPACE get secret $TENANT_NAME-log-secret -o yaml > $TENANT_NAME-log-secret.yaml
    kubectl -n $NAMESPACE get cm $TENANT_NAME-prometheus-config-map -o yaml > $TENANT_NAME-prometheus-config-map.yaml
    kubectl -n $NAMESPACE get sts $TENANT_NAME-prometheus -o yaml > $TENANT_NAME-prometheus.yaml
    kubectl -n $NAMESPACE get sts $TENANT_NAME-log -o yaml > $TENANT_NAME-log.yaml
    kubectl -n $NAMESPACE get deployment $TENANT_NAME-log-search-api -o yaml > $TENANT_NAME-log-search-api.yaml
    kubectl -n $NAMESPACE get svc $TENANT_NAME-log-hl-svc -o yaml > $TENANT_NAME-log-hl-svc.yaml
    kubectl -n $NAMESPACE get svc $TENANT_NAME-log-search-api -o yaml > $TENANT_NAME-log-search-api-svc.yaml
    kubectl -n $NAMESPACE get svc $TENANT_NAME-prometheus-hl-svc -o yaml > $TENANT_NAME-prometheus-hl-svc.yaml
    • myminio 替换为正在升级的 operator 部署中对应 tenant 的名称。
    • mynamespace 替换为正在升级的 operator 部署中该 tenant 所在的命名空间。

    对每个 tenant 重复执行。

  2. 对所有 tenant 备份出的文件删除 .metadata.ownerReferences

  3. (可选) 如果要继续使用 Log Search API 和 Prometheus,请在 tenant 的 YAML 规范文件中,将以下变量添加到 .spec.env 下。

    使用以下命令编辑 tenant:

    kubectl edit tenants <TENANT-NAME> -n <TENANT-NAMESPACE>
    • <TENANT-NAME> 替换为要修改的 tenant 名称。
    • <TENANT-NAMESPACE> 替换为要修改的 tenant 所在命名空间。

    在文件的 .spec.env 下添加以下值:

    - name: MINIO_LOG_QUERY_AUTH_TOKEN
      valueFrom:
        secretKeyRef:
          key: MINIO_LOG_QUERY_AUTH_TOKEN
          name: <TENANT_NAME>-log-secret
    - name: MINIO_LOG_QUERY_URL
      value: http://<TENANT_NAME>-log-search-api:8080
    - name: MINIO_PROMETHEUS_JOB_ID
      value: minio-job
    - name: MINIO_PROMETHEUS_URL
      value: http://<TENANT_NAME>-prometheus-hl-svc:9001
    • namevalue 行中的 <TENANT_NAME> 替换为你的 tenant 名称。

操作步骤

以下步骤使用 Kustomize 升级 MinIO Operator。

对于通过 MinIO Kubernetes Plugin 安装的 Operator 5.0.1 到 5.0.14 版本,请按照下方 Kustomize 步骤先升级到 5.0.15 或更高版本。 如果你是通过 Helm 安装 Operator,请改用 使用 Helm 升级 步骤。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。 在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。 升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 验证现有 Operator 安装。 使用 kubectl get all -n minio-operator 验证所有 Operator pod 和 service 的健康状态与运行状态。

    如果你将 Operator 安装到了自定义命名空间,请在命令中指定 -n <NAMESPACE>

    你可以通过获取该命名空间中某个 operator pod 的对象规范,确认当前安装的 Operator 版本。 以下示例使用 jq 工具从 kubectl 输出中过滤出所需信息:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

    输出类似如下:

    {
       "env": [
          {
             "name": "CLUSTER_DOMAIN",
             "value": "cluster.local"
          }
       ],
       "image": "minio/operator:v5.0.x",
       "imagePullPolicy": "IfNotPresent",
       "name": "minio-operator"
    }

    如果本地主机未安装 jq,你也可以只执行命令的前半部分,然后在输出中查找 spec.containers 段落。

  3. 使用 Kustomize 升级 Operator

    以下命令会将 Operator 升级到 5.0.15:

    kubectl apply -k github.com/minio/operator/?ref=v5.0.15

    在下面的示例输出中,行尾的 configured 表示更新后的 CRD 已应用对应变更:

    namespace/minio-operator configured
    customresourcedefinition.apiextensions.k8s.io/miniojobs.job.min.io configured
    customresourcedefinition.apiextensions.k8s.io/policybindings.sts.min.io configured
    customresourcedefinition.apiextensions.k8s.io/tenants.minio.min.io configured
    serviceaccount/console-sa unchanged
    serviceaccount/minio-operator unchanged
    clusterrole.rbac.authorization.k8s.io/console-sa-role unchanged
    clusterrole.rbac.authorization.k8s.io/minio-operator-role unchanged
    clusterrolebinding.rbac.authorization.k8s.io/console-sa-binding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/minio-operator-binding unchanged
    configmap/console-env unchanged
    secret/console-sa-secret configured
    service/console unchanged
    service/operator unchanged
    service/sts unchanged
    deployment.apps/console configured
    deployment.apps/minio-operator configured
  4. 验证 Operator 升级结果

    你可以使用前面相同的 kubectl 命令检查新的 Operator 版本:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

以下步骤使用 Helm 升级现有的 MinIO Operator 安装。

如果你是使用 Kustomize 安装 Operator,请改用 使用 Kustomize 升级 步骤。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。 在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。 升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 验证现有 Operator 安装。

    使用 kubectl get all -n minio-operator 验证所有 Operator pod 和 service 的健康状态与运行状态。

    如果你将 Operator 安装到了自定义命名空间,请在命令中指定 -n <NAMESPACE>

    使用 helm list 查看该命名空间中已安装的 chart:

    helm list -n minio-operator

    结果应类似如下:

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    operator        minio-operator  1               2023-11-01 15:49:54.539724775 -0400 EDT deployed        operator-5.0.x v5.0.x

    你也可以直接查看 operator pod 以确认已安装版本。 以下示例使用 jq 工具从 kubectl 输出中过滤出所需信息:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

    输出类似如下:

    {
       "env": [
          {
             "name": "CLUSTER_DOMAIN",
             "value": "cluster.local"
          }
       ],
       "image": "minio/operator:v5.0.x",
       "imagePullPolicy": "IfNotPresent",
       "name": "minio-operator"
    }

    如果本地主机未安装 jq,你也可以只执行命令的前半部分,然后在输出中查找 spec.containers 段落。

  3. 更新 Operator 仓库

    使用 helm repo update minio-operator 更新 MinIO Operator 仓库。 如果你为 MinIO Operator 仓库设置了不同别名,请在命令中使用该别名替代 minio-operator。 你可以使用 helm repo list 查看当前已安装的仓库。

    更新 Operator 仓库后,使用 helm search 检查最新可用的 chart 版本:

    helm search repo minio-operator

    返回结果应类似如下:

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION
    minio-operator/minio-operator   4.3.7           v4.3.7          A Helm chart for MinIO Operator
    minio-operator/operator         7.1.1          v7.1.1         A Helm chart for MinIO Operator
    minio-operator/tenant           7.1.1          v7.1.1         A Helm chart for MinIO Operator

    minio-operator/minio-operator 是旧版 chart,正常情况下 不应 安装。

  4. 运行 helm upgrade

    Helm 会使用最新 chart 升级 MinIO Operator:

    helm upgrade -n minio-operator \
      operator minio-operator/operator

    如果你将 MinIO Operator 安装到了其他命名空间,请在 -n 参数中指定该命名空间。

    如果你使用的安装名不是 operator,请将上面的值替换为实际安装名。

    命令应返回成功,并且 REVISION 值会递增。

  5. 验证 Operator 升级结果

    你可以使用前面相同的 kubectl 命令检查新的 Operator 版本:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

将 MinIO Operator 4.2.3 到 4.5.7 升级到 4.5.8

前提条件

本流程需要满足以下条件:

操作步骤

本流程会将 MinIO Operator 从 4.2.3 到 4.5.7 升级到 4.5.8。 随后你可以再从 4.5.8 升级到 5.0.15。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。

    在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。

    升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 验证现有 Operator 安装。

    使用 kubectl get all -n minio-operator 验证所有 Operator pod 和 service 的健康状态与运行状态。

    如果你将 Operator 安装到了自定义命名空间,请在命令中指定 -n <NAMESPACE>

    你可以通过获取该命名空间中某个 operator pod 的对象规范,确认当前安装的 Operator 版本。 以下示例使用 jq 工具从 kubectl 输出中过滤出所需信息:

    kubectl get pod -l 'name=minio-operator' -n minio-operator -o json | jq '.items[0].spec.containers'

    输出类似如下:

    {
       "env": [
          {
             "name": "CLUSTER_DOMAIN",
             "value": "cluster.local"
          }
       ],
       "image": "minio/operator:v4.5.1",
       "imagePullPolicy": "IfNotPresent",
       "name": "minio-operator"
    }
  3. 下载最新稳定版 MinIO Kubernetes Plugin

    你可以通过 Kubernetes Krew 插件管理器安装 MinIO 插件, 也可以手动下载插件二进制并安装到本地主机:

    Krew 是由 Kubernetes SIG CLI group 开发的 kubectl 插件管理器。 具体安装方法请参阅 krew installation documentation。 Krew 适用于 Linux、macOS 和 Windows 操作系统。

    你可以使用以下命令,通过 Krew 安装 MinIO kubectl 插件:

    kubectl krew update
    kubectl krew install minio

    如果要通过 Krew 更新 MinIO 插件,请使用以下命令:

    kubectl krew upgrade minio

    你可以将 MinIO kubectl 插件下载到本地系统路径中。 kubectl CLI 会自动发现并运行兼容插件。

    以下代码会下载最新版本的 MinIO Kubernetes 插件, 并将其安装到系统路径中:

    curl https://github.com/minio/operator/releases/download/v5.0.14/kubectl-minio_5.0.14_linux_amd64 -o kubectl-minio
    chmod +x kubectl-minio
    mv kubectl-minio /usr/local/bin/

    上述 mv 命令可能需要 sudo 提权, 具体取决于当前认证用户的权限。

    运行以下命令验证插件是否安装成功:

    kubectl minio version

    输出应显示 Operator 版本为 5.0.14。

    你可以将 MinIO kubectl 插件下载到本地系统路径中。 kubectl CLI 会自动发现并运行兼容插件。

    以下 PowerShell 命令会下载最新版本的 MinIO Kubernetes 插件, 并将其安装到系统路径中:

    Invoke-WebRequest -Uri "https://github.com/minio/operator/releases/download/v5.0.14/kubectl-minio_5.0.14_windows_amd64.exe" -OutFile "C:\kubectl-plugins\kubectl-minio.exe"

    请确保插件目录路径已包含在 Windows PATH 中。

    运行以下命令验证插件是否安装成功:

    kubectl minio version

    输出应显示 Operator 版本为 5.0.14。

  4. 运行初始化命令以升级 Operator

    使用 kubectl minio init 命令升级现有 MinIO Operator 安装:

    kubectl minio init
  5. 验证 Operator 升级结果

    你可以通过前一步中查看 Operator Pod 对象规范的方法,确认升级后的 Operator 版本。

将 MinIO Operator 4.0.0 到 4.2.2 升级到 4.2.3

前提条件

本流程假定满足以下条件:

操作步骤

本流程涵盖将运行 4.0.0 到 4.2.2 任意版本的 MinIO Operator 部署升级到 4.2.3 所需的步骤。 随后你可以执行 将 MinIO Operator 从 5.0.15 升级到 7.1.1,完成升级到 7.1.1。

从 4.0.0 到 4.2.2 的安装无法直接升级到 7.1.1。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。 在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。

    升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 检查每个 Tenant Pool 的 Security Context

    使用以下命令检查每个受管 MinIO Tenant 的规范:

    kubectl get tenants <TENANT-NAME> -n <TENANT-NAMESPACE> -o yaml

    如果某个 Tenant 不存在 spec.pools.securityContext 字段,则该 tenant pod 很可能以 root 身份运行。

    从 4.2.3 及后续版本开始,作为 Operator 升级的一部分,pod 将使用受限权限集运行。 但对于以 root 身份运行 pod 的 Tenant,可能会因为 security context 不匹配而启动失败。 你可以为这些 Tenant 显式设置允许 pod 以 root 身份运行的 Security Context:

    securityContext:
      runAsUser: 0
      runAsGroup: 0
      runAsNonRoot: false
      fsGroup: 0

    你可以使用以下命令编辑 tenant 并应用变更:

    kubectl edit tenants <TENANT-NAME> -n <TENANT-NAMESPACE>
    # 按需修改 securityContext

    更多有关 Kubernetes Security Context 的信息,请参阅 Pod Security Standards

  3. 升级到 Operator 4.2.3

    下载 MinIO Kubernetes Plugin 4.2.3,并使用它升级 Operator。 在浏览器中打开 https://github.com/minio/operator/releases/tag/v4.2.3,下载与你本地主机操作系统匹配的二进制文件。

    例如,使用 Intel 或 AMD 处理器的 Linux 主机可以运行以下命令:

    wget https://github.com/minio/operator/releases/download/v4.2.3/kubectl-minio_4.2.3_linux_amd64 -o kubectl-minio_4.2.3
    chmod +x kubectl-minio_4.2.3
    ./kubectl-minio_4.2.3 init
  4. 验证所有 Tenant 和 Operator pod

    检查 Operator 和 MinIO Tenant 命名空间,确保所有 pod 和 service 都已成功启动。

    例如:

    kubectl get all -n minio-operator
    kubectl get pods -l "v1.min.io/tenant" --all-namespaces
  5. 升级到 7.1.1

    按照 将 MinIO Operator 从 5.0.15 升级到 7.1.1 中的流程,升级到仓库归档前的最终上游版本 v7.1.1

将 MinIO Operator 3.0.0 到 3.0.29 升级到 4.2.2

前提条件

本流程假定满足以下条件:

操作步骤

本流程涵盖将运行 3.0.0 到 3.2.9 任意版本的 MinIO Operator 部署升级到 4.2.2 所需的步骤。 随后你可以执行 将 MinIO Operator 4.0.0 到 4.2.2 升级到 4.2.3,再执行 将 MinIO Operator 从 5.0.15 升级到 7.1.1

3.X.X 系列安装无法直接升级到 7.1.1。

  1. (可选) 将每个 MinIO Tenant 升级到最新稳定版 MinIO。

    定期升级 MinIO 可确保 Tenant 获得最新特性和性能改进。

    在将升级应用到生产 Tenant 之前,请先在 Dev 或 QA Tenant 等较低环境中验证。

    升级 MinIO Tenant 的具体流程请参阅 升级 MinIO Tenant

  2. 验证 Tenant tenant.spec.zones 的值

    使用以下命令检查每个受管 MinIO Tenant 的规范:

    kubectl get tenants <TENANT-NAME> -n <TENANT-NAMESPACE> -o yaml
    • 确保每个 tenant.spec.zones 元素都设置了 name 字段,且值为该 zone 的名称。 同一个 Tenant 中每个 zone 的名称都必须唯一,例如第一个和第二个 zone 分别使用 zone-0zone-1
    • 确保每个 tenant.spec.zones 都显式设置了 securityContext,以描述 pod 在集群中运行时使用的权限集。

    以下 Tenant YAML 片段设置了这些字段:

    image: "minio/minio:$(LATEST-VERSION)"
    ...
    zones:
    - servers: 4
      name: "zone-0"
      volumesPerServer: 4
      volumeClaimTemplate:
         metadata:
         name: data
         spec:
         accessModes:
            - ReadWriteOnce
         resources:
            requests:
               storage: 1Ti
      securityContext:
         runAsUser: 0
         runAsGroup: 0
         runAsNonRoot: false
         fsGroup: 0
    - servers: 4
      name: "zone-1"
      volumesPerServer: 4
      volumeClaimTemplate:
         metadata:
         name: data
         spec:
         accessModes:
            - ReadWriteOnce
         resources:
            requests:
               storage: 1Ti
      securityContext:
         runAsUser: 0
         runAsGroup: 0
         runAsNonRoot: false
         fsGroup: 0

    你可以使用以下命令编辑 tenant 并应用变更:

    kubectl edit tenants <TENANT-NAME> -n <TENANT-NAMESPACE>
  3. 升级到 Operator 4.2.2

    下载 MinIO Kubernetes Plugin 4.2.2,并使用它升级 Operator。 在浏览器中打开 https://github.com/minio/operator/releases/tag/v4.2.2,下载与你本地主机操作系统匹配的二进制文件。 例如,使用 Intel 或 AMD 处理器的 Linux 主机可以运行以下命令:

    wget https://github.com/minio/operator/releases/download/v4.2.3/kubectl-minio_4.2.2_linux_amd64 -o kubectl-minio_4.2.2
    chmod +x kubectl-minio_4.2.2
    
    ./kubectl-minio_4.2.2 init
  4. 验证所有 Tenant 和 Operator pod

    检查 Operator 和 MinIO Tenant 命名空间,确保所有 pod 和 service 都已成功启动。

    例如:

    kubectl get all -n minio-operator
    
    kubectl get pods -l "v1.min.io/tenant" --all-namespaces
  5. 升级到 4.2.3

    按照 将 MinIO Operator 4.0.0 到 4.2.2 升级到 4.2.3 中的流程升级到 Operator 4.2.3。 随后你可以继续升级到 7.1.1。