部署 MinIO 租户
本过程记录了通过 OpenShift 4.7+ 使用 OpenShift Web Console 和 MinIO Kubernetes 运算符部署 MinIO 租户的过程。
部署单节点拓扑需要本文档中未涵盖的额外配置。您也可以选择使用简单的 Kubernetes YAML 对象来描述单节点拓扑,以便在必要时进行本地测试和评估。MinIO 不推荐也不支持生产环境中的单节点部署拓扑。
本文档假设您熟悉所有提到的 Kubernetes 概念、实用程序和过程。虽然本文档可能提供指导,以尽力而为地配置或部署 Kubernetes 相关资源,但它不能替代官方的 Kubernetes 文档.
先决条件
MinIO Kubernetes 运算符
本页面的过程需要有效的 MinIO Kubernetes 运算符安装,并假设本地主机具有匹配的 MinIO Kubernetes 运算符安装。本过程假设最新的稳定运算符,版本 6.0.4。
请参阅 部署 MinIO 运算符,获取有关部署 MinIO 运算符的完整文档。
OpenShift 4.7+ 和 oc
CLI 工具
本过程假设使用 OpenShift 4.7+ 和 OpenShift OperatorHub 安装了 MinIO 运算符。
本过程假设您的本地计算机已安装了 OpenShift oc
CLI 工具,并配置为访问 OpenShift 集群。 下载并安装 OpenShift CLI oc
,以便在本过程使用。
请参阅 在 RedHat OpenShift 上部署 MinIO 运算符,获取更完整的说明。
检查安全上下文约束
MinIO 运算符使用以下默认 安全上下文 来部署每个 Pod
securityContext:
runAsUser: 1000
runAsGroup: 1000
runAsNonRoot: true
fsGroup: 1000
某些 OpenShift 安全上下文约束 会限制 Pod 允许的 UID 或 GID,从而导致 MinIO 无法成功部署租户。请确保运算符部署租户的项目具有足够的 SCC 设置,以允许默认的 Pod 安全上下文。您也可以选择在部署期间修改租户安全上下文设置。
以下命令返回安全上下文的最优值
oc get namespace <namespace> \
-o=jsonpath='{.metadata.annotations.openshift\.io/sa\.scc\.supplemental-groups}{"\n"}'
该命令返回类似于以下内容的输出
1056560000/10000
请记录斜杠之前的此值,以便在本过程使用。
持久卷
对驱动器的独占访问
MinIO 需要对用于对象存储的驱动器或卷进行独占访问。任何其他进程、软件、脚本或人员不应直接对提供给 MinIO 的驱动器或卷执行任何操作,包括 MinIO 在其上放置的对象或文件。
除非由 MinIO 工程团队指示,否则不要使用脚本或工具直接修改、删除或移动提供给驱动器的任何数据分片、奇偶校验分片或元数据文件,包括从一个驱动器或节点到另一个驱动器或节点。此类操作很可能导致广泛的损坏和数据丢失,超出 MinIO 的修复能力。
MinIO 可以使用任何支持 持久卷 (PV) 的 Kubernetes,该持久卷支持 ReadWriteOnce 访问模式。MinIO 的一致性保证需要 ReadWriteOnce
提供的独占存储访问权限。持久卷 **必须** 在部署租户之前存在。
此外,MinIO 建议为 PVC 存储类 设置 Retain
的回收策略。在可能的情况下,配置存储类、CSI 或 PV 底层的其他供应器以将卷格式化为 XFS 以确保最佳性能。
对于节点具有直接连接存储的 Kubernetes 集群,MinIO 强烈建议使用 DirectPV CSI 驱动程序。DirectPV 提供了一个分布式持久卷管理器,可以跨 Kubernetes 节点发现、格式化、挂载、调度和监控驱动器。DirectPV 解决了手动配置和监控 本地持久卷 的限制。
使用 Kustomize 部署 MinIO 租户
以下过程使用 kubectl -k
使用 MinIO Operator Github 存储库 中的 base
Kustomization 模板部署 MinIO 租户。
您可以从 存储库 中选择不同的基础模板或预构建模板作为起点,或者使用 MinIO 自定义资源文档 构建自己的 Kustomization 资源。
重要
如果您使用 Kustomize 部署 MinIO 租户,则必须使用 Kustomize 来管理或升级该部署。不要使用 kubectl krew
、Helm Chart 或类似方法来管理或升级 MinIO 租户。
此过程并非 租户 CRD 中所有可用配置选项的详尽列表。它提供了一个基线,您可以根据自己的需求修改和调整租户。
创建租户的 YAML 对象
使用
kubectl kustomize
命令生成包含部署base
租户所需所有 Kubernetes 资源的 YAML 文件kubectl kustomize https://github.com/minio/operator/examples/kustomization/base/ > tenant-base.yaml
该命令会创建一个包含多个对象的单个 YAML 文件,这些对象由
---
行分隔。在您喜欢的编辑器中打开该文件。以下步骤根据对象的
kind
和metadata.name
字段来引用每个对象配置租户拓扑结构
kind: Tenant
对象描述了 MinIO 租户。以下字段共享
spec.pools[0]
前缀,并控制在租户中部署的所有 pod 的服务器数量、每个服务器的卷数量以及存储类字段
描述
servers
要在服务器池中部署的 MinIO pod 数量。
volumesPerServer
要附加到每个 MinIO pod (
servers
) 的持久卷数量。Operator 将为租户生成volumesPerServer x servers
个持久卷声明。volumeClaimTemplate.spec.storageClassName
要与生成的持久卷声明关联的 Kubernetes 存储类。
如果不存在与指定值匹配的存储类,或如果指定的存储类无法满足请求的 PVC 或存储容量数量,则租户可能无法启动。
volumeClaimTemplate.spec.resources.requests.storage
为每个生成的 PVC 请求的存储量。
配置租户亲和性或反亲和性
MinIO Operator 支持以下 Kubernetes 亲和性和反亲和性配置
节点亲和性 (
spec.pools[n].nodeAffinity
)Pod 亲和性 (
spec.pools[n].podAffinity
)Pod 反亲和性 (
spec.pools[n].podAntiAffinity
)
MinIO 建议使用 Pod 反亲和性配置租户,以确保 Kubernetes 调度程序不会在同一个工作节点上调度多个 pod。
如果您有要部署租户的特定工作节点,请将这些节点标签或过滤器传递给
nodeAffinity
字段以约束调度程序将 pod 放置在这些节点上。配置网络加密
MinIO 租户 CRD 提供了以下字段,您可以从中配置租户 TLS 网络加密
字段
描述
tenant.certificate.requestAutoCert
启用或禁用 MinIO 自动 TLS 证书生成
默认为
true
或启用(如果省略)。tenant.certificate.certConfig
自定义 自动 TLS 的行为(如果已启用)。
tenant.certificate.externalCertSecret
通过服务器名称指示 (SNI) 为多个主机名启用 TLS
指定一个或多个类型为
kubernetes.io/tls
或cert-manager
的 Kubernetes 密钥。tenant.certificate.externalCACertSecret
启用对由未知、第三方或内部证书颁发机构 (CA) 签发的客户端 TLS 证书的验证。
指定一个或多个类型为
kubernetes.io/tls
的 Kubernetes 密钥,其中包含给定颁发机构的完整 CA 证书链。配置 MinIO 环境变量
您可以使用
tenant.configuration
字段设置 MinIO Server 环境变量。字段
描述
tenant.configuration
指定一个 Kubernetes 不透明密钥,其数据负载
config.env
包含要设置的每个 MinIO 环境变量。config.env
数据负载 **必须** 是一个 base64 编码的字符串。您可以创建一个本地文件,设置您的环境变量,然后使用cat LOCALFILE | base64
创建负载。YAML 包含一个对象
kind: Secret
,其metadata.name: storage-configuration
设置根用户名、密码、擦除奇偶校验设置并启用租户控制台。根据您的租户要求修改此项。
查看命名空间
YAML 对象
kind: Namespace
将租户的默认命名空间设置为minio-tenant
。您可以更改此值以创建租户的不同命名空间。您必须更改 YAML 文件中 **所有**
metadata.namespace
值以与命名空间匹配。部署租户
使用
kubectl apply -f
命令部署租户。kubectl apply -f tenant-base.yaml
该命令会在配置的命名空间中创建 YAML 对象中指定的每个资源。
您可以使用以下命令监控进度
watch kubectl get all -n minio-tenant
公开租户 MinIO S3 API 端口
要从本地计算机测试 MinIO Client
mc
,请转发 MinIO 端口并创建一个别名。转发租户的 MinIO 端口
kubectl port-forward svc/MINIO_TENANT_NAME-hl 9000 -n MINIO_TENANT_NAMESPACE
为租户服务创建一个别名
mc alias set myminio http://127.0.0.1:9000 minio minio123 --insecure
您可以使用
mc mb
在租户上创建存储桶mc mb myminio/mybucket --insecure
如果您使用由受信任的证书颁发机构 (CA) 颁发的 TLS 证书部署了 MinIO 租户,则可以省略
--insecure
标志。有关特定说明,请参阅 连接到租户。
连接到租户
MinIO Operator 为 MinIO 租户创建服务。
使用 oc get svc -n TENANT-PROJECT
命令查看已部署的服务
oc get svc -n TENANT-NAMESPACE
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio LoadBalancer 10.97.114.60 <pending> 443:30979/TCP 2d3h
TENANT-NAMESPACE-console LoadBalancer 10.106.103.247 <pending> 9443:32095/TCP 2d3h
TENANT-NAMESPACE-hl ClusterIP None <none> 9000/TCP 2d3h
minio
服务对应于 MinIO 租户服务。应用程序应使用此服务对 MinIO 租户执行操作。*-console
服务对应于 MinIO 控制台。管理员应使用此服务访问 MinIO 控制台并对 MinIO 租户执行管理操作。
其余服务支持租户操作,不打算供用户或管理员使用。
默认情况下,每个服务仅在 Kubernetes 集群内可见。部署在集群内的应用程序可以使用 CLUSTER-IP
访问这些服务。
集群外部的应用程序可以使用 EXTERNAL-IP
访问这些服务。此值仅在为 Ingress 或类似的网络访问服务配置的 Kubernetes 集群中填充。Kubernetes 提供了多种选项用于配置对服务的外部访问。
有关配置对服务的外部访问的更完整信息,请参阅有关 路由或 Ingress 的 OpenShift 文档。
使用 OpenShift Web 控制台部署租户
1) 访问 MinIO Operator 界面
您可以从左侧导航栏的 Operators 中找到 MinIO Operator 界面。
转到 Operators,然后转到 Installed Operators。
对于 Project 下拉菜单,选择 openshift-operators。
从已安装的运算符列表中选择 MinIO Operators。
单击 Create Tenant 开始租户创建过程。
2) 创建租户
Form View 提供了一个用于配置新 MinIO 租户的用户界面。
确保 Tenant Secret -> Name 设置为作为先决条件创建的 MinIO Root User Kubernetes Secret 的名称。
确保 控制台 -> 控制台密钥 -> 名称 设置为在先决条件中创建的 MinIO 控制台 Kubernetes 密钥的名称。
您也可以使用 YAML 视图对 MinIO 租户进行更细粒度的配置。有关设置特定字段的指南,请参阅 MinIO 自定义资源定义文档。MinIO 还发布了创建自定义租户 YAML 对象的额外指南示例。请注意,OperatorHub YAML 视图仅支持创建 MinIO 租户对象。不要在 YAML 输入中指定任何其他对象。
对一个视图的更改会反映在另一个视图中。例如,您可以在 YAML 视图 中进行修改,并在 表单视图 中看到这些更改。
安全上下文配置
如果您的 OpenShift 集群安全上下文配置限制了支持的 Pod 安全上下文,请打开 YAML 视图并找到 spec.pools[n].securityContext
和 spec.console.securityContext
对象。修改 securityContext
设置以使用基于 OpenShift 集群 SCC 的支持的 UID。
单击 创建 使用指定的配置创建 MinIO 租户。使用作为 MinIO 根用户密钥的一部分指定的凭据访问 MinIO 服务器。
3) 连接到租户
MinIO Operator 为 MinIO 租户创建服务。使用 oc get svc -n NAMESPACE
命令来查看已部署的服务
oc get svc -n minio-tenant-1
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio LoadBalancer 10.97.114.60 <pending> 443:30979/TCP 2d3h
minio-tenant-1-console LoadBalancer 10.106.103.247 <pending> 9443:32095/TCP 2d3h
minio-tenant-1-hl ClusterIP None <none> 9000/TCP 2d3h
minio-tenant-1-log-hl-svc ClusterIP None <none> 5432/TCP 2d3h
minio-tenant-1-log-search-api ClusterIP 10.103.5.235 <none> 8080/TCP 2d3h
minio-tenant-1-prometheus-hl-svc ClusterIP None <none> 9090/TCP 7h39m
minio
服务对应于 MinIO 租户服务。应用程序应使用此服务对 MinIO 租户执行操作。*-console
服务对应于 MinIO 控制台。管理员应使用此服务访问 MinIO 控制台并对 MinIO 租户执行管理操作。
其余服务支持租户操作,不打算供用户或管理员使用。
默认情况下,每个服务仅在 Kubernetes 集群内可见。部署在集群内的应用程序可以使用 CLUSTER-IP
访问这些服务。
Kubernetes 集群外部的应用程序可以使用 EXTERNAL-IP
访问服务。此值仅针对配置了 Ingress 或类似网络访问服务的 Kubernetes 集群进行填充。Kubernetes 提供了多种配置外部访问服务的选项。有关配置外部访问服务的更完整信息,请参阅 Kubernetes 文档中的 发布服务 (ServiceTypes) 和 Ingress。