MinIO-DirectPV分布式存储部署
.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 | 磁盘 | 备注 |
---|---|---|---|
master01 | 172.24.10.11 | —— | master节点 |
master02 | 172.24.10.12 | —— | master节点 |
master03 | 172.24.10.13 | —— | master节点 |
worker01 | 172.24.10.14 | /dev/nvme0n2 | worker节点+ MinIO 节点 + DirectPV节点 |
worker02 | 172.24.10.15 | /dev/nvme0n2 | worker节点+ MinIO 节点 + DirectPV节点 |
worker03 | 172.24.10.16 | /dev/nvme0n2 | worker节点+ 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 worker02pod/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
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 。
也可使用ingress所暴露的域名访问: https://minio.linuxsb.com 。
- 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
提示:更多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-io6h20m
提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享,但请务必注明出处,感谢您的理解,谢谢!
以下部分内容需要登录查看 立即登录