kubernetes 部署 minio 对象存储

本贴最后更新于 1486 天前,其中的信息可能已经水流花落

Kubernetes 部署 MinIO

Kubernetes 的部署和状态集提供了在独立,分布式模式下部署 MinIO 服务器的完美平台。 在 Kubernetes 上部署 MinIO 有多种选择,您可以选择最适合您的。

在这里插入图片描述

参考:https://github.com/minio/charts

部署前提条件:

  1. 需要准备 k8s 集群,并且包含足够多的节点,如 4 个节点的集群
[root@jenkins ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 Ready master 89d v1.18.8 k8s-master2 Ready master 89d v1.18.8 k8s-master3 Ready master 89d v1.18.8 k8s-node1 Ready <none> 89d v1.18.8
  1. 需要准备可用的动态存储(longhorn、rook、openebs 等)
[root@jenkins ~]# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE longhorn (default) driver.longhorn.io Delete Immediate true 89d

独立模式部署

基于官方 helm chat 进行部署,安装 MinIO chart

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

独立模式部署 minio,使用 deployment 方式部署单个 pod:

helm install minio \ --namespace minio --create-namespace \ --set accessKey=minio,secretKey=minio123 \ --set mode=standalone \ --set service.type=NodePort \ --set persistence.enabled=true \ --set persistence.size=10Gi \ --set persistence.storageClass=longhorn \ minio/minio

查看创建的资源

[root@jenkins ~]# kubectl -n minio get deploy NAME READY UP-TO-DATE AVAILABLE AGE minio 1/1 1 1 12m [root@jenkins ~]# kubectl -n minio get pods NAME READY STATUS RESTARTS AGE minio-76dcf6b46c-6lm8c 1/1 Running 0 12m [root@jenkins minio]# kubectl -n minio get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE minio Bound pvc-2f54ab9b-ed5e-4a4d-b528-87be85bf8e6a 10Gi RWO longhorn 6m44s [root@jenkins ~]# kubectl -n minio get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minio NodePort 10.103.145.126 <none> 9000:32000/TCP 12m

浏览器访问 minio UI:

在这里插入图片描述

分布式模式部署

分布式模式部署 minio,使用 statefulset 模式部署多个 pod 并分布在不同节点:

helm install minio \ --namespace minio --create-namespace \ --set accessKey=minio,secretKey=minio123 \ --set mode=distributed \ --set replicas=4 \ --set service.type=NodePort \ --set persistence.size=10Gi \ --set persistence.storageClass=longhorn \ minio/minio

说明:独立模式下 replicas 参数不生效,仅对分布式模式生效, 可选值 4 <= x <= 16

查看创建的资源:

[root@jenkins ~]# kubectl -n minio get sts NAME READY AGE minio 4/4 25m [root@jenkins ~]# kubectl -n minio get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES minio-0 1/1 Running 0 26m 100.86.135.210 k8s-master3 <none> <none> minio-1 1/1 Running 0 26m 100.105.225.44 k8s-master1 <none> <none> minio-2 1/1 Running 0 26m 100.111.156.179 k8s-node1 <none> <none> minio-3 1/1 Running 0 26m 100.87.223.56 k8s-master2 <none> <none> [root@jenkins ~]# kubectl -n minio get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE export-minio-0 Bound pvc-b48cacbb-d5ab-41d9-8498-6bfb9a385baf 10Gi RWO longhorn 25m export-minio-1 Bound pvc-67e9bb47-1f89-4cd8-ac95-ac974941fc0c 10Gi RWO longhorn 25m export-minio-2 Bound pvc-eb895874-9b96-49c4-8259-b6aefb171bef 10Gi RWO longhorn 25m export-minio-3 Bound pvc-959eaf35-d7c7-46a5-8a1f-487203c190bf 10Gi RWO longhorn 25m [root@jenkins ~]# kubectl -n minio get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minio NodePort 10.106.114.111 <none> 9000:32000/TCP 25m minio-svc ClusterIP None <none> 9000/TCP 25m

在 kubesphere 容器平台中查看部署的 minio 资源:

在这里插入图片描述

清理 minio 集群

helm -n minio uninstall minio

分布式模式下需要手动清理 pvc 和 pv

kubectl -n minio delete pvc --all

Operator 方式部署

MinIO Operator 为 Kubernetes 带来了对 MinIO,图形控制台和加密的原生支持。

参考:https://github.com/minio/operator

kubectl 安装 krew 插件

( set -x; cd "$(mktemp -d)" && curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" && tar zxvf krew.tar.gz && KREW=./krew-"$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/')" && "$KREW" install krew )

添加环境变量

echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> /root/.bashrc

安装 minio 插件

kubectl krew install minio

MinIO Operator 提供 MinIO 租户创建,管理,升级,池添加等功能。Operator 可以控制和管理多个 MinIO 租户。

首先,初始化 MinIO Operator 部署。这是一个一次性的过程。

kubectl minio 初始化,一旦创建了 MinIO Operator,便可以继续进行 Tenant 创建。

[root@jenkins ~]# kubectl minio init

查看创建的 operator

[root@jenkins ~]# kubectl get pods |grep minio minio-operator-78b4f47796-rpnbt 1/1 Running 0 2m35s

生成 tenant yaml 文件,需要提前准备可用的 storage-class,指定 4 个 server,每个 server 一个 volumes,共 40Gi 大小。

kubectl minio tenant create --name tenant1 \ --namespace tenant1-ns \ --storage-class longhorn \ --servers 4 --volumes 4 --capacity 40Gi -o > tenant.yaml

由于默认 console 镜像版本较低,存在 bug,修改 tenant.yaml 文件,将 console 镜像修改为新版本:

[root@jenkins minio]# cat tenant.yaml |grep image: | grep console image: minio/console:v0.4.6

部署 yaml 文件

kubectl apply -f tenant.yaml

查看创建的资源

[root@jenkins minio]# kubectl -n tenant1-ns get pods NAME READY STATUS RESTARTS AGE tenant1-console-bccb4b76c-89nqh 1/1 Running 0 23m tenant1-console-bccb4b76c-vdfpx 1/1 Running 0 23m tenant1-zone-0-0 1/1 Running 0 25m tenant1-zone-0-1 1/1 Running 0 25m tenant1-zone-0-2 1/1 Running 0 25m tenant1-zone-0-3 1/1 Running 0 25m

修改 service 类型为 NodePort,方便访问 minio UI 以及 tenant-console UI:

kubectl -n tenant1-ns patch svc minio -p '{"spec": {"type": "NodePort"}}' kubectl -n tenant1-ns patch svc tenant1-console -p '{"spec": {"type": "NodePort"}}'

查看 service,记录 minio 及 tenant1-console 中的 nodeport

[root@jenkins minio]# kubectl -n tenant1-ns get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minio NodePort 10.98.66.158 <none> 443:30143/TCP 26m tenant1-console NodePort 10.101.229.165 <none> 9090:30797/TCP,9443:32372/TCP 23m tenant1-hl ClusterIP None <none> 9000/TCP 26m

查看 minio UI 登录信息

# cat tenant.yaml ...... --- apiVersion: v1 data: accesskey: ZWM1ZTNmMmYtNzc0NS00MWMwLTlkN2MtODFlMWFkYTczYWU1 secretkey: NWY1MzYwYmQtNjBlZS00MjY5LTkyYTItYzk4NTNlZDc3Yjk5 kind: Secret metadata: creationTimestamp: null name: tenant1-creds-secret namespace: tenant1-ns --- apiVersion: v1 data: CONSOLE_ACCESS_KEY: NjEzNjcyMjAtMDg3ZS00Zjk0LWJkY2QtOWRhODM4YmJmOTE5 CONSOLE_HMAC_JWT_SECRET: NmEwMWE2N2EtYzM1MS00ZmFkLTkxMDEtMTc1MTBkZmI2ZmU4 CONSOLE_PBKDF_PASSPHRASE: ZDExYjY2MjAtMWZlNS00Y2ZiLWFlNjUtYWUxZjBmZWRhN2Y1 CONSOLE_PBKDF_SALT: ZmRiZmU5ZmItMWExZi00MmU5LThkNWEtYzJiYWExNmJlN2Jk CONSOLE_SECRET_KEY: YWVkZTVjMGYtZDMyMS00MDkxLWFkNDYtMTg3YmNlYWQ3Yzlj kind: Secret metadata: creationTimestamp: null name: tenant1-console-secret namespace: tenant1-ns ......

将 tenant1-creds-secret 中 accesskey 及 secretkey 解码

echo ZWM1ZTNmMmYtNzc0NS00MWMwLTlkN2MtODFl-e MWFkYTczYWU1 | base64 -d echo NWY1MzYwYmQtNjBlZS00MjY5LTkyYTItYzk4NTNlZDc3Yjk5 | base64 -d

将 tenant1-console-secret 中 CONSOLE_ACCESS_KEY 及 CONSOLE_SECRET_KEY 解码

echo NjEzNjcyMjAtMDg3ZS00Zjk0LWJkY2QtOWRhODM4YmJmOTE5 | base64 -d echo YWVkZTVjMGYtZDMyMS00MDkxLWFkNDYtMTg3YmNlYWQ3Yzlj | base64 -d

使用 nodeport 访问 minio UI,使用 https 方式:

在这里插入图片描述

验证创建 bucket

在这里插入图片描述

使用 nodeport 访问 tenant-console UI,使用 https 方式:

在这里插入图片描述

minio 扩容

您可以使用 kubectl minio 插件向租户添加容量,如下所示

kubectl minio tenant expand --name tenant1 --servers 8 --volumes 32 --capacity 32Ti

这将为租户增加 32 个驱动器,这些驱动器均匀分布在 8 台服务器上 tenant1,并具有 32Ti 的额外容量。

清理 operator

[root@jenkins jenkins]# kubectl minio tenant delete --name tenant1 -n tenant1-ns

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...