kubernetes 部署 minio 对象存储

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

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

相关帖子

欢迎来到这里!

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

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