Kubernetes集群实践(十)在Kubernetes部署MinIO对象存储服务器

本文主要介绍如何安装和使用云原生对象存储服务器MinIO。

关键词:k8s

前言

MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。

本文主要介绍如何使用MinIO Kubernetes Operator部署和安装MinIO。

准备工作

正常运行的K8s集群,这里使用三个master节点,两个worker节点进行演示;

在K8s上部署MinIO一般有两种方式,一种是通过Helm进行自动安装,还有一种是通过MinIO Kubernetes Operator部署安装。处于学习的角度考虑,这里采用Operator进行手动安装

部署MinIO Operator

安装kubectl-minio插件

1
2
wget https://github.com/minio/operator/releases/latest/download/kubectl-minio_linux_amd64.zip
sudo unzip kubectl-minio_linux_amd64.zip -d /usr/local/bin/

检查是否正常安装

如果显示版本号则说明插件安装成功

1
2
wf09@amd-server ➜  ~ kubectl minio version
v4.4.28

初始化MinIO Operator

部署

--image--console-image分别指定私有仓库的镜像,这样可以节约部署的时间

1
2
3
kubectl minio init \
--image=hub.deepsoft-tech.com/minio/operator \
--console-image=hub.deepsoft-tech.com/minio/console

稍候片刻,可以看到下面的回显,说明部署完毕

查看部署的资源

可以查看minio-operator命名空间下的资源

1
kubectl get all -n minio-operator

当所有Pod都为Running时,表示服务已经Ready了

登录operator控制台

可以通过kube-proxy访问控制台

1
kubectl minio proxy 

记录JWT,并输入打开的浏览器页面

输入JWT,跳转到下一步

部署多租户MinIO tenant集群

创建StorangeClass

可以通过外部StorangeClass+PVC可以实现自动生成PV。

K3s local-path-provisioner StorangeClass

K3s Local PV 可以在本机通过PV控制器与Scheduler的结合,会对local PV做针对性的逻辑处理,从而,让Pod在多次调度时,能够调度到同一个Node上。

安装方式也很简单,默认在K3s集群中就自动安装完毕了。

若之前禁用了此安装,只需删除--disable=local-storage即可。

MinIO directpv StorangeClass

DirectPV是用于直连存储的CSI驱动程序。从更简单的意义上讲,它是一个分布式持久卷管理器,而不是像SAN或NAS这样的存储系统。跨服务器发现、格式化、装载、调度和监视驱动器非常有用。由于Kubernetes hostPath和Local PV是静态配置的,并且功能有限,因此创建DirectPV就是为了解决这一限制。

以下是安装步骤

  1. 安装kubectl directpv插件

    1
    2
    wget https://github.com/minio/directpv/releases/latest/download/kubectl-directpv_linux_amd64.zip
    sudo unzip kubectl-directpv_linux_amd64.zip -d /usr/local/bin/
  2. 检查是否安装成功

    1
    kubectl directpv --version

    如显示版本号说明安装成功了

  1. 初始化 directpv

    1
    kubectl directpv init 
  2. 检查是否初始化成功

    1
    kubectl get all -n direct-csi-min-io

    查看上述命令的回显,如果Pod Status全部显示Running说明初始化成功

  3. 格式化磁盘

    以下命令可以格式化所有磁盘,当所有磁盘格式化完毕以后,就可以分配PV了

    1
    kubectl directpv drives format -a

    如果想释放某个节点,即不让该节点的设备分配PV,可以执行

    1
    kubectl directpv drives release --nodes amd-server
  4. 查看节点磁盘状态

    1
    kubectl directpv drives ls

    显示为Ready的节点,可以分配PV

    

创建 MinIO tenant集群

创建命名空间

需要将minio租户放在一个特定的命名空间中

1
kubectl create ns minio

创建 MinIO tenant集群

1
2
3
4
5
6
7
kubectl minio tenant create minio  \
--servers 4 \
--volumes 8 \
--capacity 200Gi \
--storage-class direct-csi-min-io \
--namespace minio \
--disable-tls
参数 说明
--servers minio要跨 Kubernetes 集群部署的服务器数量。
--volumes 集群中的卷数。通过将确定每个服务器的卷数通过。kubectl miniovolumes``servers
--capacity 集群的总容量。确定每个体积的通过划分容量通过。kubectl miniocapacity``volumes
--storage-class StorageClass创建每个 PVC 时要使用的 Kubernetes 。此示例使用 MinIO DirectCSI 存储类。
--namespace 用于部署 MinIO 租户的 Kubernetes 命名空间。

注释:我们的集群有4个节点,--servers=4;总共4个卷,即每个节点上各有一个卷--volumes 4;总共容量是100G(由于奇偶校验等原因,最大可以存50G的数据)-capacity 100Gi

将集群暴露至外部

将对应的service连接至ingress即可。

s3 API

s3 API对应的是 minio Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minio
namespace: minio
spec:
rules:
- host: s3.deepsoft-tech.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minio
port:
number: 80

MinIO 控制台

控制台对应的是 minio-console Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minio-console
namespace: minio
spec:
rules:
- host: minio-console.deepsoft-tech.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minio-console
port:
number: 9090

检查

登录控制台,查看s3存储桶信息

使用 MinIO Client 连接 minio 集群

Binary Download (GNU/Linux)

Platform Architecture URL
GNU/Linux 64-bit Intel https://dl.min.io/client/mc/release/linux-amd64/mc
64-bit PPC https://dl.min.io/client/mc/release/linux-ppc64le/mc

Docker

Docker Stable

1
2
docker pull minio/mc 
docker run minio/mc ls play

Docker Edge

1
2
docker pull minio/mc:edge
docker run minio/mc:edge ls play

Note: Above examples run mc against MinIO play environment by default. To run mc against other S3 compatible servers, start the container this way:

Copydocker run -it --entrypoint=/bin/sh minio/mc

then use the mc alias command.

添加集群

账户名:root,密码:rootroot

1
mc config host add k8s http://s3.deepsoft-tech.com root rootroot --api s3v4

查看集群的桶

1
mc ls k8s

备份文件到指定集群

1
mc mirror -a textbook/ k8s/textbook
  • -a :属性同步备份

  • -w:阻塞备份,--watch