MinIO Operator

一、概述

1.1 Minio Operator

MinIO Operator 是 Kubernetes 的控制平面组件,负责管理和自动化 MinIO 实例的运维任务。

作用:

  • 生命周期管理: 自动管理 MinIO 实例的整个生命周期,包括创建、升级、配置和删除。
  • 高可用性: 确保 MinIO 实例的高可用性,通过自动复制和故障转移。
  • 扩展性: 允许您轻松扩展 MinIO 集群,以满足存储需求的变化。
  • 自定义资源: 使用自定义资源定义(CRD)来管理 MinIO 租户的配置。

组件:

  • MinIO Tenant CRD: 一个 Kubernetes 自定义资源,用于定义和管理 MinIO 租户的配置。
  • MinIO Pool CRD: 用于定义 MinIO 池的配置,每个池可以包含多个 MinIO 实例。

1.2 Minio Tenant

MinIO Tenant 是数据平面组件,实际提供存储服务。

作用:

  • 存储服务: 提供对象存储服务,用于存储和检索数据。
  • 数据管理: 管理数据的存储、访问和备份。
  • 用户和权限: 管理用户访问和权限控制。

组件:

  • MinIO Pods: 实际运行 MinIO 服务的 Kubernetes Pods。
  • PVCs: 持久卷声明,用于为 MinIO 提供持久化存储。
  • Services: 服务,用于访问 MinIO Pods。

二、部署Minio Operator

2.1 部署Minio Operator

2.1.1 通过 Kustomize 部署

以下步骤用于从 MinIO Operator GitHub 存储库安装 Operator。

如果您使用 Kustomize 安装 Operator,则必须使用 Kustomize 来管理或升级该安装。请勿使用、Helm chart 或类似方法来管理或升级使用 Kustomize 部署的 MinIO Operator 安装。kubectl krew

但是,您可以使用 Kustomize 升级使用 MinIO Kubernetes 插件安装的 Operator 的早期版本(5.0.14 或更早版本)。

(1)安装最新版本的 Operator

以下命令将 Operator 安装到minio-operator命名空间:

kubectl apply -k "github.com/minio/operator?ref=v5.0.18"

(2)验证 Operator pod 是否正在运行:

root@k8s-master01:~# kubectl get all -n minio-operator
NAME                                 READY   STATUS    RESTARTS   AGE
pod/minio-operator-bbfff6659-f8xld   1/1     Running   0          38m
pod/minio-operator-bbfff6659-jwtkd   1/1     Running   0          38m

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/operator   ClusterIP   10.244.44.136   <none>        4221/TCP   38m
service/sts        ClusterIP   10.244.36.132   <none>        4223/TCP   38m

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/minio-operator   2/2     2            2           38m

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/minio-operator-bbfff6659   2         2         2       38m
2.1.2 通过Helm部署

以下步骤使用 MinIO Operator Chart Repository 安装 Operator。

如果您使用 Helm charts 安装 Operator,则必须使用 Helm 来管理该安装。请勿使用、Kustomize 或类似方法来更新或管理 MinIO Operator 安装。

(1)将Minio Operator Repo添加到Helm

MinIO 在https://operator.min.io维护一个与 Helm 兼容的仓库。请将此仓库添加到 Helm:

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

您可以使用以下方式验证 repo 内容:helm search

root@k8s-master01:~# 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)安装 Operator

运行命令安装 Operator。以下命令指定并创建用于安装的专用命名空间。MinIO 强烈建议为 Operator 使用专用命名空间。

helm install \
  --namespace minio-operator \
  --create-namespace \
  operator minio-operator/operator

(3)验证 Operator 安装

检查指定命名空间的内容(minio-operator)以确保所有 pod 和服务都已成功启动。

root@k8s-master01:~# kubectl get all -n minio-operator
Warning: kubevirt.io/v1 VirtualMachineInstancePresets is now deprecated and will be removed in v2.
NAME                                  READY   STATUS    RESTARTS   AGE
pod/minio-operator-5df5d4fc74-7r87q   1/1     Running   0          38s
pod/minio-operator-5df5d4fc74-flkz9   1/1     Running   0          38s

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/operator   ClusterIP   10.244.29.125   <none>        4221/TCP   38s
service/sts        ClusterIP   10.244.18.255   <none>        4223/TCP   38s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/minio-operator   2/2     2            2           38s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/minio-operator-5df5d4fc74   2         2         2       38s

三、Minio tenant

3.1 tenant配置详解

3.1.1 minio实例配置

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

字段 描述
servers 要在服务器池中部署的 MinIO pod 的数量。
volumesPerServer 每个 MinIO pod 需要附加的持久卷数量(servers)。Operator 为 Tenant 生成持久卷声明。volumesPerServer x servers
storageClassName 与生成的持久卷声明关联的 Kubernetes 存储类。如果不存在与指定值匹配的存储类*,或者*指定的存储类无法满足请求的 PVC 数量或存储容量,则租户可能无法启动。
size 为每个生成的 PVC 请求的存储量。
3.1.2 配置tenant亲和性或反亲和性

Tenant Chart 支持以下 Kubernetes 选择器、亲和性和反亲和性配置:

  • 节点选择器 ( tenant.nodeSelector)
  • 节点/Pod 亲和性或反亲和性(spec.pools[n].affinity

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

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

3.1.3 配置网络加密

MinIO Tenant CRD 提供以下字段,您可以使用它们配置租户 TLS 网络加密:

场地 描述
tenant.certificate.requestAutoCert 启用或禁用 MinIO自动 TLS 证书生成。如果省略则默认为true或启用。
tenant.certificate.certConfig 如果启用,则自定义自动 TLS的行为。
tenant.certificate.externalCertSecret 通过服务器名称指示 (SNI) 为多个主机名启用 TLS。指定一个或多个类型为kubernetes.io/tls或的 Kubernetes 机密cert-manager
tenant.certificate.externalCACertSecret 启用由未知、第三方或内部证书颁发机构 (CA) 签名的客户端 TLS 证书的验证。指定一个或多个 Kubernetes 机密,其类型kubernetes.io/tls包含给定颁发机构的完整 CA 证书链。
3.1.4 配置MinIO环境变量

您可以使用该字段设置 MinIO Server 环境变量tenant.configuration

场地 描述
tenant.configuration 指定一个 Kubernetes 不透明密钥,其数据有效负载config.env包含您要设置的每个 MinIO 环境变量。数据config.env有效负载必须是 Base64 编码的字符串。您可以创建一个本地文件,设置环境变量,然后使用它来创建有效负载。`cat LOCALFILE

3.2 tenant部署

以下步骤使用 Helm 通过官方 MinIO Tenant Chart 部署 MinIO Tenant。

(1)验证您的 MinIO Operator Repo 配置

MinIO 在https://operator.min.io维护一个与 Helm 兼容的仓库。

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

您可以使用以下方式验证 repo 内容:helm search

(2)创建 Helm 的本地副本values.yaml以供修改

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

(3)编辑配置文件

root@k8s-master01:~# cat values.yaml
COMPUTED VALUES:
...
tenant:
  certificate:
    certConfig: {}
    externalCaCertSecret: []
    externalCertSecret: []
    requestAutoCert: false  # 启用或禁用 MinIO自动 TLS 证书生成
  configSecret:
    name: myminio-env-configuration
    accessKey: minio
    secretKey: minio123
  image:
    pullPolicy: IfNotPresent
    repository: quay.io/minio/minio
    tag: RELEASE.2025-04-08T15-41-24Z
  mountPath: /export
  subPath: /data
  name: minio-server
  pools:
  - name: pool-0
    servers: 1
    size: 10Gi
    storageClassName: nfs-client
    volumesPerServer: 4
    buckets:  # 在创建minio时自动创建的存储桶
    - name: test
      mode: public

参数说明

  • pools.servers: 1 pools.volumesPerServer: 4,表示minio1上有1个minio实例,每个实例挂载4个存储卷

  • pools.servers: 4 pools.volumesPerServer: 1,表示minio1上有4个minio实例,每个实例挂载1个存储卷

  • pools.servers: 2 pools.volumesPerServer: 2,表示minio1上有2个minio实例,每个实例挂载2个存储卷

  • mountPath 是挂载到minio实例中的路径,volumesPerServer 配置多少个,就会在挂载时自动在路径后面加上数字,比如/export0 /export1 /export2 /export3

  • subPath 是minio的数据会保存到这个子目录里,对应/export0/data等

配置密码登录minio的密码

# 登录页面的用户名密码,生产不建议在values.yaml中直接配置,而是引用已经配好的secret
  configSecret:
    name: minio-env-configuration
    accessKey: minio
    secretKey: minio123

# 生产环境建议使用这个方式,values.yaml中只配置这个configuration,不需要配置configSecret
  configSecret:
    name: minio-env-configuration-prod
      #accessKey: minio
      #secretKey: minio123
    existingSecret: true   # 配置为true,则启用现有Kubernetes secret为tenant设置环境变量。


# minio-env-configuration-prod需要提前配置好
cat > config.env << EOF
export MINIO_ROOT_USER="minio"
export MINIO_ROOT_PASSWORD="P@ssw0rd"
EOF

base64_content=$( cat config.env | base64 | tr -d '\n' )

cat > minio-env-configuration.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: minio-env-configuration-prod
  namespace: minio-server
  annotations:
    meta.helm.sh/release-name: minio
    meta.helm.sh/release-namespace: minio-server
  labels:
    app.kubernetes.io/managed-by: Helm
type: Opaque
data:
  config.env: $base64_content
EOF

kubectl apply -f minio-env-configuration.yaml

(4)部署

    helm install \
    --namespace minio-server \
    --create-namespace \
    --values values.yaml \
    minio-server minio-operator/tenant

(5)查看部署情况

root@k8s-master01:~/minio# kubectl get all -n minio-server
NAME                        READY   STATUS    RESTARTS   AGE
pod/minio-server-pool-0-0   2/2     Running   0          10s

NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/minio                  ClusterIP   10.244.51.212   <none>        80/TCP     11s
service/minio-server-console   ClusterIP   10.244.41.184   <none>        9090/TCP   11s
service/minio-server-hl        ClusterIP   None            <none>        9000/TCP   11s

NAME                                   READY   AGE
statefulset.apps/minio-server-pool-0   1/1     10s

(6)k8s集群外部使用MinIO

对service minio-console 配置ingress或者NodePort供集群外访问

账号密码就是之前secret设置的 minio/minio123

Logo

一站式 AI 云服务平台

更多推荐