MinIO Operator在 Kubernetes 中的部署与运维全指南
文章摘要 MinIO Operator是Kubernetes中管理MinIO实例的控制平面组件,负责生命周期管理、高可用性和扩展性。它包含MinIO Tenant和Pool CRD用于配置管理。MinIO Tenant作为数据平面组件提供对象存储服务,包含Pods、PVCs和服务等。部署方式支持Kustomize和Helm两种,需分别使用对应工具进行管理。Tenant配置包括实例数量、存储卷、存储
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。
如果您有想要部署租户的特定工作节点,请将这些节点标签或过滤器传递给nodeSelector或affinity字段,以约束调度程序将 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
更多推荐




所有评论(0)