首页 > 热门 > 竖图列表

MinIO-DirectPV分布式存储部署

竖图列表会员昵称: 印修关注投稿量:粉丝量:关注量:   2024-10-23 19:45:31A+A-
MinIO部署介绍

.1. 部署概述

Kubernetes hostpath、local和本地静态配置都存在需要事先在node节点准备好可用的块存储或文件系统,例如对插入的硬盘,或者磁盘阵列做分区格式化,文件系统则需提前创建好Kubernetes即将利用的挂载目录,并且两种方法都会有亲和性限制,无法做到让Kubernetes自身的去调度让数据卷分布在不同的node节点上。

若利用传统的SAN或者NAS的CSI存储驱动(网络PV)来为minio集群提供存储,minio集群本身就分布式存储和保障高可用的特点,不仅会在数据路径中增加另一层复制/擦除编码和额外的网络跃点。这种额外的分解层还会导致复杂性增加和性能下降的问题。

而DirectPV可以解决如上问题,DirectPV做到了跨服器发现可用存储资源、跨服器格式化存储、创建供Kubernetes PV使用的存储池,由Kubernetes API通过DirectPV CSI调度存储资源为POD分配直连式存储PV,分布式地在node节点创建符合PVC申请要求的PV。DirectPV创建的存储资源统一由部署DirectPV的节点监视和维护。

通俗点讲,相当于在master节点部署DirectPV后,只需在node节点插入硬盘或者组建磁盘阵列,后续的格式化只需在安装了DirectPV的master节点上操作,node节点无需后续操作,PV由Kubernetes自行调度和创建,并由PV卷将数据持久化。

DirectPV更多介绍参考:002.DirectPV介绍及安装

基于如上考虑,本实验Kubernetes部署Minio集群存储,选择使用DirectPV CSI作为分布式存储的最佳实践。
同时minio官方支持通过简单的快速部署,以便于进行基础测试:

curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O
kubectl apply -f minio-dev.yaml

参考官方: 快速部署MinIO 。


.2. minio集群特性

每个minio集群节点上由Kubernetes调度,而每个集群节点的驱动器使用的PV由DirectPV调度,也就是说驱动器实际使用的存储资源是由DirectPV随机的从属于Kubernetes的DirectPV存储池中分配出来的,那实际的数据会随机的分布在node节点上的硬盘上,只要node节点硬盘数量较多,很大程度上可以规避硬盘单点故障的问题。

  • 分布式
    minio集群将数据分布在每个minio集群节点上,每个集群节点至少拥有4个驱动器,数据被均匀分布在每个集群节点的驱动器上,一半的驱动器空间用于数据备份利用,一半的空间用于存储。

  • 高可用
    minio集群的高可用特性,即驱动器只要有总数的N/2在线,即可完整的同步和还原数据,解决了硬盘单点故障导致数据丢失的问题。只要minio的集群节点数量够多,也能规避minio集群节点故障大面积的驱动器掉线导致存储数据丢失的问题。


1. MinIO部署


1.1 部署规划

  • Kubernetes 安装
    本实验不涉及 Kubernetes 部署, Kubernetes 部署参考 Kubernetes_v1.30.3高可用部署架构二 。

  • 节点规划
    已完成部署的Kubernetes集群的规划及磁盘相关信息如下:

主机IP磁盘备注
master01172.24.10.11——master节点
master02172.24.10.12——master节点
master03172.24.10.13——master节点
worker01172.24.10.14/dev/nvme0n2worker节点+ MinIO 节点 + DirectPV节点
worker02172.24.10.15/dev/nvme0n2worker节点+ MinIO 节点 + DirectPV节点
worker03172.24.10.16/dev/nvme0n2worker节点+ MinIO 节点 + DirectPV节点

集群VIP: 172.24.10.100
相关域名均能正常解析,可通过hosts解析相关域名至 VPI 。


1.2 DirectPV部署

DirectPV部署安装参考:002.DirectPV介绍及安装

通常安装完DirectPV后会自动生成默认的 directpv-min-io StorageClass 。

[root@master01 directpv]# kubectl get sc -o wide
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
directpv-min-io      directpv-min-io      Delete          WaitForFirstConsumer   true                   11h


1.3 配置MinIO

根据当前规划,参考 DirectPV部署MinIO存储官方yaml 进行修改。

也可参考 MinIO官方yaml 修改。

当前版本的minio把API端口和WebUI端口进行了区分,本实验API保留9000,webui配置为9090。
部署在独立的namespace minio-dev中。

[root@master01 minio]# curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O[root@master01 minio]# vim minio-dev.yamlapiVersion: v1kind: Namespacemetadata:
  name: minio-dev
  labels:
    name: minio-dev---kind: ServiceapiVersion: v1metadata:
  name: minio
  namespace: minio-dev
  labels:
    app: miniospec:
  selector:
    app: minio
  type: NodePort
  ports:
    - name: api
      port: 9000
      protocol: TCP
      targetPort: 9000
      nodePort: 9000
    - name: webui
      port: 9090
      protocol: TCP
      targetPort: 9090
      nodePort: 9090---apiVersion: apps/v1kind: StatefulSetmetadata:
  name: minio
  namespace: minio-dev
  labels:
    app: miniospec:
  serviceName: "minio"
  replicas: 4
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
        directpv.min.io/organization: minio
        directpv.min.io/app: minio-example
        directpv.min.io/tenant: tenant-1
    spec:
      containers:
      - name: minio
        image: minio/minio
        env:
        - name: MINIO_ACCESS_KEY
          value: minio
        - name: MINIO_SECRET_KEY
          value: minio123
        volumeMounts:
        - name: minio-data-1
          mountPath: /data1
        - name: minio-data-2
          mountPath: /data2
        - name: minio-data-3
          mountPath: /data3
        - name: minio-data-4
          mountPath: /data4
        args:
        - "server"
        - "http://minio-{0...3}.minio.minio-dev.svc.cluster.local/data{1...4}"
        - "--console-address"
        - ":9090"
  volumeClaimTemplates:                 #配置StorageClass
  - metadata:
      name: minio-data-1
    spec:
      accessModes: [ "ReadWriteOnce" ]      resources:
        requests:
          storage: 1Gi
      storageClassName: directpv-min-io #配置已存在的storageClass
  - metadata:
      name: minio-data-2
    spec:
      accessModes: [ "ReadWriteOnce" ]      resources:
        requests:
          storage: 1Gi
      storageClassName: directpv-min-io #配置已存在的storageClass
  - metadata:
      name: minio-data-3
    spec:
      accessModes: [ "ReadWriteOnce" ]      resources:
        requests:
          storage: 1Gi
      storageClassName: directpv-min-io #配置已存在的storageClass
  - metadata:
      name: minio-data-4
    spec:
      accessModes: [ "ReadWriteOnce" ]      resources:
        requests:
          storage: 1Gi
      storageClassName: directpv-min-io #配置已存在的storageClass


1.4 正式部署

[root@master01 minio]# kubectl apply -f minio-dev.yaml

[root@master01 minio]# kubectl -n minio-dev get all -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP             NODE       NOMINATED NODE   READINESS GATES
pod/minio-0   1/1     Running   0          2m42s   10.10.30.123   worker02              pod/minio-1   1/1     Running   0          2m33s   10.10.196.75   worker04              pod/minio-2   1/1     Running   0          2m25s   10.10.5.11     worker01              pod/minio-3   1/1     Running   0          2m16s   10.10.19.65    worker03              NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                       AGE     SELECTOR
service/minio   NodePort   10.20.113.61           9000:9000/TCP,9090:9090/TCP   2m42s   app=minio

NAME                     READY   AGE     CONTAINERS   IMAGES
statefulset.apps/minio   4/4     2m42s   minio        minio/minio
[root@master01 minio]# kubectl directpv list drives
┌──────────┬─────────┬──────────────────────────┬────────┬────────┬─────────┬────────┐
│ NODE     │ NAME    │ MAKE                     │ SIZE   │ FREE   │ VOLUMES │ STATUS │
├──────────┼─────────┼──────────────────────────┼────────┼────────┼─────────┼────────┤
│ worker01 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4       │ Ready  │
│ worker02 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4       │ Ready  │
│ worker03 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4       │ Ready  │
│ worker04 │ nvme0n2 │ VMware Virtual NVMe Disk │ 20 GiB │ 16 GiB │ 4       │ Ready  │
└──────────┴─────────┴──────────────────────────┴────────┴────────┴─────────┴────────┘

[root@master01 minio]# kubectl -n minio-dev get pvc

MinIO-DirectPV分布式存储部署(pic1)


1.5 ingress访问webui

使用ingress将Webui开放出来。
创建证书。

[root@master01 minio]# ll *com*-rw-r--r-- 1 root root 3.9K Aug 24 06:19 api.linuxsb.com.crt-rw-r--r-- 1 root root 1.7K Aug 24 06:19 api.linuxsb.com.key-rw-r--r-- 1 root root 3.9K Aug 24 05:36 minio.linuxsb.com.crt-rw-r--r-- 1 root root 1.7K Aug 24 05:36 minio.linuxsb.com.key[root@master01 minio]# kubectl -n minio-dev create secret tls minio-webui-tls --cert=minio.linuxsb.com.crt --key=minio.linuxsb.com.key[root@master01 minio]# kubectl -n minio-dev create secret tls minio-api-tls --cert=api.linuxsb.com.crt --key=api.linuxsb.com.key[root@master01 minio]# kubectl -n minio-dev describe secrets minio-webui-tls
[root@master01 minio]# kubectl -n minio-dev describe secrets minio-api-tls

创建ingress规则。

[root@master01 minio]# vim minio-ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:
  name: minio-webui-ingress
  namespace: minio-dev
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /spec:
  ingressClassName: "nginx"
  tls:
    - hosts:
        - 'minio.linuxsb.com'
      secretName: minio-webui-tls
  rules:
    - host: minio.linuxsb.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: minio
                port:
                  number: 9090---apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
  name: minio-api-ingress
  namespace: minio-dev
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /spec:
  ingressClassName: "nginx"
  tls:
    - hosts:
        - 'api.linuxsb.com'
      secretName: minio-api-tls
  rules:
    - host: api.linuxsb.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: minio
                port:
                  number: 9000
                  [root@master01 minio]# kubectl apply -f minio-ingress.yaml [root@master01 minio]# kubectl -n minio-dev get ingress -o wideNAME                  CLASS   HOSTS               ADDRESS        PORTS     AGEminio-api-ingress     nginx   api.linuxsb.com     172.24.10.11   80, 443   64sminio-webui-ingress   nginx   minio.linuxsb.com   172.24.10.11   80, 443   64s


1.6 确认验证

  • 浏览器验证
    使用浏览器访问 https://172.24.10.100:9090 ,默认minio账号密码: minioadmin / minioadmin ,本实验已设置账号密码: minio / minio123 。

MinIO-DirectPV分布式存储部署(pic2)

MinIO-DirectPV分布式存储部署(pic3)

也可使用ingress所暴露的域名访问: https://minio.linuxsb.com 。

MinIO-DirectPV分布式存储部署(pic4)

MinIO-DirectPV分布式存储部署(pic5)

  • MC验证
    MinIO Client mc命令行工具提供了ls、cat、cp、mirror和diff等命令,支持文件系统和Amazon s3兼容的云存储服务。

mc命令行工具是为与AWS S3 API兼容而构建的,并在MinIO和AWS S3上测试了预期的功能和行为。

安装mc:

[root@master01 minio]# curl https://dl.min.io/client/mc/release/linux-amd64/mc \  --create-dirs \
  -o /usr/local/bin/mc

[root@master01 minio]# chmod +x /usr/local/bin/mc
[root@master01 minio]# mc --help

连接minio:
使用mc alias set命令将Amazon s3兼容的服务添加到mc配置中,将alias替换为要关联到S3服务的名称。
mc命令通常需要alias作为参数来标识要对哪个S3服务执行,如果省略ACCESS_KEY和SECRET_KEY,执行命令时会提示在CLI中输入这些值。

[root@master01 minio]# mc alias set myminio https://api.linuxsb.com minio minio123Added `myminio` successfully.
[root@master01 minio]# mc admin info myminio

MinIO-DirectPV分布式存储部署(pic6)

提示:更多mc命令使用参考: MinIO Client 。


2. MinIO扩容


2.1 在线扩容

MinIO结合DirectPV部署的分布式存储集群,可通过DirectPV的特性完成在线卷扩容,不需要重新启动使用这些卷的pod,调整扩容后的大小,然后Persistent Volume Claim自动完成相应动作。

[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0 -o yaml > minio-data-1-minio-0.yaml        #将需要扩容的卷的yaml导出[root@master01 minio]# vim minio-data-1-minio-0.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: directpv-min-io
    volume.kubernetes.io/selected-node: worker02
    volume.kubernetes.io/storage-provisioner: directpv-min-io
  creationTimestamp: "2024-08-23T16:27:13Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: minio
  name: minio-data-1-minio-0
  namespace: minio-dev
  resourceVersion: "1536089"
  uid: 4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167espec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi                          #直接修改大小
  storageClassName: directpv-min-io
  volumeMode: Filesystem
  volumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167estatus:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Gi
  phase: Bound[root@master01 minio]# kubectl apply -f minio-data-1-minio-0.yaml……

2.2 确认验证

验证扩容后的相应的卷是否为2G。

[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0 -o yamlapiVersion: v1kind: PersistentVolumeClaim#……spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi                          #扩容后的当前容量
  storageClassName: directpv-min-io
  volumeMode: Filesystem
  volumeName: pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167estatus:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi[root@master01 minio]# kubectl -n minio-dev get pvc minio-data-1-minio-0NAME                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGEminio-data-1-minio-0   Bound    pvc-4f6e5be4-4ed7-47e8-8cc1-5b0f3c65167e   2Gi        RWO            directpv-min-io                    6h20m


提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享但请务必注明出处,感谢您的理解,谢谢

以下部分内容需要登录查看 立即登录

点击这里复制本文地址 以上内容由用户上传和网络在徐州鑫坤机电设备有限公司整理呈现,如有侵权请联系站长:xzxkjd@qq.com !

1. 本网站可能包含第三方链接,请注意甄别,我们不对其内容负责。

2. 请遵守网络法律法规,在浏览网站时,不传播违法、不良信息,共同维护网络健康。否则后果自负!

3. 本网站内容受版权保护,未经许可,严禁转载!

4. 长时间浏览网站请注意适时休息,保护眼睛,保持身心健康。

5. 在浏览网站过程中,如有任何疑问或需要帮助,请随时联系我们的客服团队。

6. 如有好的内容可投稿申请发布我们收到会第一时间审核发布。

7. 请注意系统即将进行维护可能会影响部分功能的正常使用请提前规划好您的浏览时间,感谢您的理解,享受每一次在线体验

相关内容

加载中~

Copyright ©2012-2024徐州鑫坤机电设备有限公司版权所有
苏ICP备2023032739号-1ICP备2023032739号-2苏ICP备2023032739号-3X
苏公网安备 32038202000884号增值电信业务经营许可证:合字B1-20235517
开发中| 关键词| 网站地图| 网站地图| 网站地图| TAG集合

今日IP人数0今日浏览量(PV)0昨日IP人数0昨日浏览量(PV)07天IP人数07天浏览量(PV)0

网站已运行:

在线客服
服务热线

服务热线

0516-86596070

联系邮箱

服务热线

xzxkjd.@qq.com

微信咨询
我的网站名称
我的网站名称
交流群
返回顶部
X我的网站名称

截屏,微信识别二维码

微信号:xkyinxiu

(点击微信号复制,添加好友)

  打开微信

微信号已复制,请打开微信添加咨询详情!