简介
MinIO 是一种高性能对象存储解决方案,原生支持 Kubernetes 部署。MinIO 提供与 Amazon Web Services S3 兼容的 API,并支持所有核心 S3 功能。MinIO 是在GNU Affero 通用公共许可证 v3.0下发布的。
MinIO 的不同之处在于,它从一开始就被设计为私有/混合云对象存储。因MinIO 是专门为服务于对象而构建的,所以单层架构可以实现所有必要的功能。它是一个同时具有高性能、可扩展性和轻量级的云原生对象服务器。
架构图
特性
纠删码
MinIO 使用以汇编代码编写的每个对象内联擦除编码来保护数据,以提供尽可能高的性能。MinIO 使用 Reed-Solomon 代码将对象条带化为具有用户可配置冗余级别的数据和奇偶校验块。MinIO 的 Erasure Coding 在对象级别执行修复,可以独立修复多个对象。
在 N/2 的最大奇偶校验下,MinIO 的实现可以确保在部署中仅使用 ((N/2)+1) 个操作驱动器进行不间断的读写操作。例如,在 12 个驱动器的设置中,MinIO 将对象分片到 6 个数据和 6 个奇偶校验驱动器,并且可以可靠地写入新对象或重建现有对象,而部署中仅剩下 7 个驱动器。详细介绍可以参考 https://docs.min.io/minio/baremetal/concepts/erasure-coding.html
Bitrot 保护
静默数据损坏或 bitrot 是磁盘驱动器面临的严重问题,导致数据在用户不知情的情况下损坏。原因是多方面的(驱动器老化、电流峰值、磁盘固件中的错误、幻像写入、读取/写入方向错误、驱动程序错误、意外覆盖),但结果是一样的 - 数据受损。
MinIO 对 HighwayHash 算法的优化实现确保它永远不会读取损坏的数据 - 它即时捕获和修复损坏的对象。通过在 READ 上计算散列并在从应用程序、网络到内存/驱动器的 WRITE 上对其进行验证来确保端到端的完整性。该实现专为速度而设计,可以在 Intel CPU 的单核上实现超过 10 GB/秒的散列速度。
身份管理
MinIO 支持与 OpenID 连接兼容提供商以及关键的外部 IDP 供应商集成。
数据加密
MinIO 支持多种复杂的服务器端加密方案来保护数据——无论数据在哪里。MinIO 的方法以可忽略的性能开销确保机密性、完整性和真实性。使用 AES-256-GCM、ChaCha20-Poly1305 和 AES-CBC 支持服务器端和客户端加密。
连续复制
MinIO 的持续复制专为大规模、跨数据中心部署而设计。通过利用 Lambda 计算通知和对象元数据,它可以高效快速地计算增量。Lambda 通知确保更改立即传播,而不是传统的批处理模式。
K8s 上部署minio
minio官方推荐使用minio-operator部署多租户的minio系统。
每个 MinIO Tenant 代表 Kubernetes 集群中的一个独立的 MinIO Object Store。下图描述了部署到 Kubernetes 中的 MinIO Tenant 的架构:
[
MinIO 提供了多种访问和管理 MinIO Tenant 的方法
MinIO Console提供了一个图形用户界面 (GUI) 用于与 MinIO 租户交互。MinIO Operator 默认为每个租户安装和配置控制台。
MinIO Tenants 的管理员可以通过控制台执行各种任务,包括用户创建、策略配置和存储桶复制。控制台还提供租户运行状况、使用情况和修复状态的高级视图
安装前的要求
Kubernetes 版本 1.19.0
- 从 v4.0.0 开始,MinIO Operator 和 MinIO Kubernetes Plugin 需要 Kubernetes 1.19.0 及更高版本。该Kubernetes基础设施和的
kubectl
CLI工具必须具备的1.19.0+相同的版本。 - 在 v4.0.0 之前,MinIO Operator 和 Plugin 需要 Kubernetes 1.17.0。您 必须将 Kubernetes 基础架构升级到 1.19.0 或更高版本才能使用 MinIO Operator 或 Plugin v4.0.0 或更高版本。
Kubernetes TLS 证书 API
MinIO Operator 自动生成 TLS 证书签名请求 (CSR) 并使用 Kubernetes certificates.k8s.io
TLS 证书管理 API创建签名的 TLS 证书。
因此 MinIO Operator要求Kubernetes kube-controller-manager
配置包括以下 配置设置:
--cluster-signing-key-file
- 指定用于签署集群范围证书的 PEM 编码的 RSA 或 ECDSA 私钥。--cluster-signing-cert-file
- 指定用于颁发集群范围证书的 PEM 编码的 x.509 证书颁发机构证书。
如果 Kubernetes 集群未配置为响应生成的 CSR,则 Operator 无法完成初始化。默认情况下,某些 Kubernetes 提供程序不指定这些配置值。
要验证是否kube-controller-manager
具有所需的设置,请使用以下命令。替换$CLUSTER-NAME
为 Kubernetes 集群的名称:
1 | kubectl get pod kube-controller-manager-$CLUSTERNAME-control-plane \ |
确认输出包含突出显示的行。上面示例命令的输出可能与终端中的输出不同:
1 | spec: |
证书的额外说明
MinIO Operator 使用指定的证书颁发机构 (CA) 为所有 MinIO Tenant pod 自动生成 TLS 证书。Kubernetes 集群外部的客户端必须信任 Kubernetes 集群 CA 才能连接到 MinIO Operator 或 MinIO Tenants。
不能信任 Kubernetes 集群 CA 的客户端可以尝试禁用连接 MinIO Operator 或 MinIO Tenant 的 TLS 验证。
或者,您可以生成由已知且受信任的 CA 签署的 x.509 TLS 证书,并将这些证书传递给 MinIO 租户
安装minio operator
MinIO Operator 扩展了 Kubernetes API 以支持将 MinIO 特定资源部署为 Kubernetes 集群中的租户。
MinIOkubectl minio
插件封装了 Operator,为通过kubectl
命令行工具在 Kubernetes 集群中部署和管理 MinIO Tenants 提供了一个简化的界面 。
安装minio operator 我们可以选择helm 或者使用官方提供的kubectl minio 插件的方式,这里我们使用kubectl minio 插件的方式安装
下载kubectl minio插件
1 | wget https://github.com/minio/operator/releases/download/v4.2.2/kubectl-minio_4.2.2_linux_amd64 -O kubectl-minio |
我们下载后可以查看一下信息
1 | [root@master-01 minio]# kubectl minio version |
初始化 MinIO Kubernetes Operator
运行命令初始化 MinIO Operator:kubectl minio init
1 | kubectl minio init |
该命令使用以下默认设置初始化 MinIO Operator:
- 将 Operator 部署到
minio-operator
命名空间中。指定参数以将运算符部署到不同的命名空间。kubectl minio init --namespace
- 使用
cluster.local
配置运营商的DNS主机名,当作为集群域。指定 参数以设置不同的集群域值。kubectl minio init --cluster-domain
这里我们使用默认的参数进行初始化
1 | [root@master-01 minio]# kubectl minio init |
验证安装
验证安装我们可以使用kubectl get all --namespace minio-operator
命令,如果您使用自定义命名空间初始化 Operator,请替换 minio-operator
为该命名空间。
1 | [root@master-01 minio]# kubectl get all --namespace minio-operator |
部署一个minio 租户
部署一个minio租户我们有多种方式,这里先介绍使用控制台和kubectl minio 插件的方式部署。
插件部署
为租户创建名称空间
首先创建一个名为minio的namespace,后续我们将minio租户部署在这个namespace中
1 | kubectl create ns minio |
创建minio租户
我们可以使用kubectl minio tenant create
创建minio租户,我们使用如下命令创建一个一个节点的minio租户,4个存储,总容量为4Gi
1 | kubectl minio tenant create gitlab-cache-minio --servers 1 --volumes 4 --capacity 4Gi --storage-class local-path --namespace minio |
参数说明:
gitlab-cache-minio | 命令创建的 MinIO 租户的名称。 |
---|---|
--servers |
minio 要跨 Kubernetes 集群部署的服务器数量。 |
--volumes |
集群中的卷数。通过将确定每个服务器的卷数通过。kubectl minio volumes``servers |
--capacity |
集群的总容量。确定每个体积的通过划分容量通过。kubectl minio capacity``volumes |
--storage-class |
StorageClass 创建每个 PVC 时要使用的 Kubernetes 。此示例使用 MinIO DirectCSI 存储类。 |
--namespace |
用于部署 MinIO 租户的 Kubernetes 命名空间。 |
成功后,该命令将返回以下内容:
- 租户的管理用户名和密码。将这些凭据存储在安全位置,例如受密码保护的密钥管理器。MinIO不再显示这些凭据。
- 为连接到 MinIO 控制台而创建的服务。控制台支持对租户的管理操作,例如配置身份和访问管理 (IAM) 和存储桶配置。
- 为连接到 MinIO 租户而创建的服务。应用程序应使用此服务对 MinIO 租户执行操作。
1 | [root@master-01 ~]# kubectl minio tenant create gitlab-cache-minio --servers 1 --volumes 4 --capacity 4Gi --storage-class local-path --namespace minio |
访问服务
我们可以观察下部署哪些东西
1 | [root@master-01 ~]# kubectl get all -n minio |
service/minio
是对应minio的服务,我们可以使用这个service访问这个minio 租户提供对象存储能力service/gitlab-cache-minio-console
这个对应的是这个minio租户的console服务,我们可以使用这个service访问这个minio 租户的console控制台service/gitlab-cache-minio-hl
这个是个headless服务,用于pod间通讯
默认情况下,每个服务仅在 Kubernetes 集群中可见。部署在集群内的应用程序可以使用 CLUSTER-IP
. 对于 Kubernetes 集群外部的应用程序,您必须配置适当的网络规则以公开对服务的访问。Kubernetes 提供了多个选项来配置对服务的外部访问,比如可以使用ingress或者service 配置为nodeport类型。
简单测试时我们可以使用kubectl port-forward
将服务代理到本地
1 | kubectl port-forward service/minio 443:443 |
注意
上述部署时--servers 1
仅部署了一个服务节点,生产环境为了保证高可用,最低要使用四个服务节点!!!!
既然是多租户,我们可以很方便的在多个namespace中部署minio ,例如我们在test这个namespace下在部署一个minio租户
1 | [root@master-01 ~]# kubectl minio tenant create minio-s3 --servers 1 --volumes 4 --capacity 4Gi --storage-class local-path --namespace test |
Kubectl-minio插件常用命令
我们使用kubectl minio插件部署服务可以通过下面命令删除
删除operator
kubectl minio delete [options]
选项:
--namespace=minio-operator
删除 MinIO Operator Deployment 以及 MinIO Tenant CRD、Service account、Cluster Role 和 Cluster Role Binding。它还删除所有租户实例。
注意:删除时需要我们手动输入y
确认删除操作
列出租户
命令 kubectl minio tenant list
示例:
1 | [root@master-01 ~]# kubectl minio tenant list |
查看租户信息
命令: kubectl minio tenant info TENANT_NAME [options]
选项:
--namespace=minio
列出给定 MinIO 租户中所有现有的 MinIO 池。
示例
1 | [root@master-01 ~]# kubectl minio tenant info gitlab-cache-minio -n minio |
升级镜像
命令: kubectl minio tenant upgrade TENANT_NAME --image IMAGE_TAG [options]
为给定的 MinIO 租户升级 MinIO Docker 镜像。
例子: kubectl minio tenant upgrade tenant1 --image minio/minio:RELEASE.2021-08-25T00-41-18Z
选项:
--namespace=minio
--output
移除租户
命令: kubectl minio tenant delete TENANT_NAME [options]
删除现有的 MinIO 租户。
选项:
--namespace=minio
注意:删除时需要我们手动输入y
确认删除操作
示例
1 | [root@master-01 ~]# kubectl minio tenant delete gitlab-cache-minio --namespace minio |
控制台部署
部署前说一下,控制台部署最低需要部署四个minio server端,最低需要四个节点,如果节点不足,仅测试一下minio可以使用上面的使用插件部署。
我们首先为控制台创建一个访问入口,这里我使用的ingress 控制器是traefik ,如果使用的是ingress-nginx,请自行修改
1 | apiVersion: traefik.containo.us/v1alpha1 |
部署之后我们访问minio.lishuai.fun
operator的控制台默认是需要使用JWT
登陆,我们可以通过kubectl minio proxy
如下获取JWT
1 | [root@master-01 minio]# kubectl minio proxy |
从输出上看官方应该不太建议把operator console
使用代理映射到公网上,而是使用类似kubectl proxy
的方式代理到本地的使用,operator console
可以管理所有的minio租户,暴露到公网上会有一定安全性风险,这个我们实际使用中应该根据自己实际情况考虑.
我们复制页面上的token
登陆进控制台
创建租户
点击create tenant
我们即可进入创建租户页面
注意:
- 指定的命名空间必须不包含任何现有MinIO租户,可以考虑为 MinIO 租户创建一个新的命名空间。
- 集群中需要有可使用的存储类
这里我们勾选了高级配置,单机下一步进入高级配置的页面
配置租户
这一步只有我们在勾选高级配置才可见
配置Pod Affinity
Pod Affinity步骤包含与调度 MinIO 租户Pod相关的配置设置,仅在勾选高级模式时可见
默认的Pod Anti-Affinity确保没有两个 MinIO Pod 部署到同一个工作节点
配置身份认证提供者
身份提供者步骤包含与 MinIO身份和访问管理相关的配置设置,仅在勾选高级模式时可见
默认的Built-In是 MinIO 内部身份提供者提供身份认证,还可以将 OpenID Connect或 Active Directory 服务配置为外部身份管理器
配置tls
该步骤包含与MinIO传输层安全(TLS)的配置,仅在勾选高级模式可见。
MinIO Operator 使用 Kubernetes certificates.k8s.io
TLS 证书管理 API自动生成 TLS 证书。您可以通过切换Enable AutoCert来禁用此行为
可以提供一个或多个自定义证书供 MinIO 租户使用。MinIO 支持服务器名称指示 (SNI) 支持,用于根据客户端请求中指定的主机名选择要响应的 TLS 证书。Operator 会自动将指定的证书分发到租户中的每个服务器 Pod。
禁用AutoCert 并指定没有 自定义证书会在没有 TLS 的情况下部署 MinIO 租户。在部署没有 TLS 的租户之前,请考虑允许不安全流量的安全风险。
配置对象加密
加密步骤包含与MinIO 服务器端对象加密相关的配置,仅在勾选高级模式可见。
操作员控制台支持以下外部密钥管理系统 (KMS):
- Hashicorp Vault
- Thales CipherTrust (formerly Gemalto KeySecure)
- AWS KMS
- GCP Secrets Manager
配置minio租户的容量规模
该步骤包含与minio租户的容量相关的配置,仅在勾选高级模式时可见。
我们可以在该页面合理的配置自己想要部署的minio租户的存储规模,比如服务端数量,每个服务端使用的存储的数量,存储的容量,纠删码奇偶校验设置等,我们可以使用 MinIO 纠删码计算器来帮助指导配置 MinIO 租户。
预览配置摘要
该步骤可以预览我们上述定义配置的摘要
单击创建以开始租户创建过程,单击Create 后,操作员控制台会显示 MinIO 租户的根凭据。
注意:凭据信息仅显示一次,建议下载妥善保存
查看租户详情
创建租户后我们在控制台点击创建的minio租户查看详情
我们还可以点击manage tenant
进入这个minio租户的控制台
在这个控制台中我们可以对这个minio租户执行日常管理操作,比如创建用户,浏览对象等。
验证使用minio
我们可以使用官方提供的客户端命令行工具mc 来访问minio
1 | wget https://dl.min.io/client/mc/release/linux-amd64/mc |
添加minio
我们我们这里是在集群的node节点上访问,首先使用kubectl 确认下mino 的service ip
1 | [root@master-01 ~]# kubectl get svc -n minio |
这里我们可以看到minio的service ip 为10.109.75.11,使用如下命令将这个minio添加到配置中
1 | [root@master-01 ~]# bash +o history |
注意:
- 使用
bash +o history
是为了避免敏感信息被保存的命令的历史记录里 - 默认创建租户时使用了 Kubernetes
certificates.k8s.io
TLS 证书管理 API自动生成 TLS 证书,这是个私有ca签发的证书,所以为了正常访问这里使用--insecure
禁用 TLS/SSL 证书验证。允许 TLS 连接到证书无效的服务器
我们使用控制台创建时也可以选择禁用AutoCert使用http协议访问,使用kubectl minio插件配置的可以创建后在控制台修改,修改后服务会重新启动,之后就可以使用http协议访问里
这里我们将calico-3.9.2.yaml
文件上传到minio的test目录下
1 | root@master-01 ~]# mc --insecure ls myminio |
我们可以登录控制台在对象浏览器里看到这个文件已经成功出现在test目录下