[转帖]Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践
Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践
个人理解浅谈
1. 关于在kubernetes上部署分布式存储服务,K8s存储的选择
非云环境部署K8s Pod时存储的选择
在非云环境部署Kubernets时,一般采用的都是本地的直连式存储和文件系统,如hostpath、或者local卷,即使是利用K8s存储的PV卷,都需要本地已经有提前准备好的块存储或者已经创建好文件目录,若利用local卷还会有亲和性问题的限制,node节点故障时,会因为local卷和node的绑定关系导致pod调度失败。
使用CSI存储接口作为K8s的存储
K8s也支持利用网络存储,如NAS、NFS等方式给k8s提供存储资源,但是网络存储首先需要事先在每台节点部署网络存储服务不仅增加了复杂性,另外不可避免的问题就是网络存储服务具有单点故障,若服务出现问题不可用,将导致数据丢失,影响到k8s的所有pod的数据。
2. 使用DirectPV作为部署k8s minio集群存储的最佳实践
DirectPV
DirectPV是一个分布式持久卷管理器,是用于直连存储(DAS)的容器存储接口(CSI)驱动程序。
K8s hostpath、local和本地静态配置都有的痛点即需要事先在node节点准备好可用的块存储或文件系统,例如对插入的硬盘,或者磁盘阵列做分区格式化,文件系统则需提前创建好k8s即将利用的挂载目录,并且两种方法都会有亲和性限制,无法做到让k8s自身的去调度让数据卷分布在不同的node节点上。
在传统的基于SAN或NASCSI 驱动程序(网络 PV)上部署minio集群的局限性
若利用传统的SAN或者NAS的CSI存储驱动(网络PV)来为minio集群提供存储,minio集群本身就分布式存储和保障高可用的特点,不仅会在数据路径中增加另一层复制/擦除编码和额外的网络跃点。这种额外的分解层还会导致复杂性增加和性能下降的问题。
DirectPV优势
而DirectPV正是为了解决这些问题,DirectPV做到了跨服器发现可用存储资源、跨服器格式化存储、创建供k8s PV使用的存储池,由k8s API通过DirectPV CSI调度存储资源为POD分配直连式存储PV,分布式地在node节点创建符合PVC申请要求的PV。DirectPV创建的存储资源统一由部署DirectPV的节点监视和维护。
通俗点讲,即在master节点部署后DirectPV后,只需在node节点插入硬盘或者组建磁盘阵列,后续的格式化只需在安装了DirectPV的master节点上操作,node节点无需后续操作,PV由k8s自行调度和创建,并由PV卷将数据持久化。
DirectPV局限性
DirectPV本质上是利用节点磁盘创建并挂载了一个挂载分区供k8s pod使用,始终还是规避不了节点单点故障和硬盘损坏的问题,并且数据的持久化受到由DirectPV分配的PV卷的限制。
minio集群特性
分布式
minio集群将数据分布在每个minio集群节点上,每个集群节点至少拥有4个驱动器,数据被均匀分布在每个集群节点的驱动器上,一半的驱动器空间用于数据备份利用,一半的空间用于存储。高可用
minio集群的高可用特性,即驱动器只要有总数的N/2在线,即可完整的同步和还原数据,解决了硬盘单点故障导致数据丢失的问题。只要minio的集群节点数量够多,也能规避minio集群节点故障大面积的驱动器掉线导致存储数据丢失的问题。
DirectPV结合Minio集群突破DirectPV的局限性
每个minio集群节点上由K8s调度,而每个集群节点的驱动器使用的PV由DirectPV调度,也就是说驱动器实际使用的存储资源是由DirectPV随机的从属于K8s的DirectPV存储池中分配出来的,那实际的数据会随机的分布在node节点上的硬盘上。
硬盘单点故障
若是k8s node节点本身使用的是JOBD存储,那自然已经没有硬盘单点故障的问题,即使没有使用JOBD存储,因为minio集群存储的数据是分布式地在各个不同minio集群节点的驱动器上,本质上就是在各个k8
s node节点的不同硬盘上,只要node节点硬盘数量够多,很大程度上可以规避硬盘单点故障的问题k8s node节点单点故障
同样的,node节点上故障时将会有大量的PV不可用,从而导致minio集群驱动器大量的掉线,规避该问题的方法既是存在有大量的k8s node节点,保证实际的驱动器数据分布在不同的节点硬盘上
2. 部署实践
2.1. 安装使用DirectPV
DirectPV设计为轻量级,可扩展到1000个驱动器中的10个。它由三个组件组成:控制器、节点驱动程序、用户界面

控制器
在进行卷声明时,控制器会从无池驱动器统一调配卷。DirectPV知道pod的关联约束,并将卷从本地驱动器分配到pod。请注意,每个群集只运行一个活动的controller实例
节点驱动程序
节点驱动程序实现卷管理功能,例如发现、格式化、装载和监视节点上的驱动器。每个存储服务器上都运行一个节点驱动程序实例。
用户界面
存储管理员可以使用kubectl CLI插件来选择、管理和监视驱动器。基于Web的UI目前正在开发中。
2.2. 在K8s Master节点上部署Directpv
安装先决条件
- 已经安装Krew插件工具(参考博文:安装Kubernetes Krew工具)
- Node节点有可用的磁盘
# 安装directpv插件(未上网可能会下载失败,亲测尝试多次后即可成功)
kubectl krew install directpv # 使用directpv插件在k8s集群安装directpv的组件
kubectl directpv install # 查看directpv信息
kubectl directpv info # 查看可用的驱动器
kubectl directpv drives ls # 选择供directpv管理的驱动器进行格式化后加入存储池{a...c}=a,b,c、{1...3}=1,2,3
kubectl directpv drives format --drives /dev/sd{a...f} --nodes directpv-{1...4}
#执行完毕后等待一会,使用kubectl directpv drives ls可用看到驱动器状态为Ready,即可供PVC声明使用
#--drives后接实践磁盘分区位置,博主的为:/dev/sd{b...c}
#--nodes后接k8s node节点的名称,博主的为:node0{1...2}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
2.3. 使用DirectPV案例
2.3.1. 创建PVC
vim pvc-direct.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-pvc-2
namespace: default
spec:
storageClassName: directpv-min-io #Directpv使用的SC,directpv-min-io,在安装directpv时自动创建
accessModes:
- ReadWriteOnce #注意directpv不支持多节点写入模式
resources:
requests:
storage: 1024Mi #申请PV空间大小
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
kubectl create -f pvc-direct.yaml

2.3.2 创建使用Directpv PVC的Pod
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: csipod-2
spec:
volumes:
- name: pvc-storage
persistentVolumeClaim:
claimName: csi-pvc-2 #指定使用刚刚创建的PVC:csi-pvc-2
containers:
- image: busybox:1.28
name: box
args: [/bin/sh, -c, while true; do echo "$(date)" >> /tmp/1.log && sleep 10; done]
resources:
requests:
cpu: 100m
volumeMounts:
- name: pvc-storage
mountPath: /tmp #PV挂载至容器里的/tmp目录
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
kubectl create -f pod.yaml

2.4. 查看实际PV创建的位置
2.4.1. PV在Pod实际调度的节点上被创建,首先查看Pod被调度到node2节点

2.4.2. 确认分配的pvc的名称

2.4.3. 进入node2节点查看到有两个硬盘被用于directpv的存储池,切换到/var/lib/direct-csi/mnt/

2.4.4. 使用tree命令查看到pvc实际被创建在了38296a09-bc76-47f0-8861-d5bd52ff1855下

2.5. 测试挂载的PV
2.5.1. 在pv下创建文件

2.5.2. 查看pod的tmp目录确认

2.5. 使用Directpv CSI创建PV提供给minio集群使用
2.5.1. 使用Deployment部署minio集群
- 每个驱动器需要对应一个PVC,即一个集群至少创建四个PVC
- 这里实例使用单节点minio集群
2.5.2. 创建PVC
vim minio-pv.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-data-d0
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: directpv-min-io
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-data-d1
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: directpv-min-io
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-data-d2
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: directpv-min-io
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-data-d3
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: directpv-min-io
resources:
requests:
storage: 1Gi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
kubectl create -f minio-pv.yaml

成功创建PVC
2.5.3. 创建Deployment
vim minio-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
namespace: default
spec:
selector:
matchLabels:
name: minio
replicas: 1
template:
metadata:
labels:
name: minio
spec:
containers:
- name: minio
env:
- name: MINIO_ROOT_USER
value: minioadmin
- name: MINIO_ROOT_PASSWORD
value: miniopassword
image: docker.io/minio/minio
args:
- server
- /data0
- /data1
- /data2
- /data3
- --console-address
- ":9090"
ports:
- containerPort: 9000
- containerPort: 9090
volumeMounts:
- name: data0
mountPath: /data0
- name: data1
mountPath: /data1
- name: data2
mountPath: /data2
- name: data3
mountPath: /data3
volumes:
- name: data0
persistentVolumeClaim:
claimName: pvc-data-d0
- name: data1
persistentVolumeClaim:
claimName: pvc-data-d1
- name: data2
persistentVolumeClaim:
claimName: pvc-data-d2
- name: data3
persistentVolumeClaim:
claimName: pvc-data-d3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
kubectl create -f minio-deployment.yaml
2.5.4. directpv成功分配PV给pod使用

pod成功创建

2.5.5. 暴露Minio集群访问端口(pod内部端口为9090,宿主机即k8s集群端口为30513)

2.5.7. 登录minio控制台(使用浏览器:http://{k8s-address}:30513访问)
- 账号:minioadmin
- 密码:miniopassword

2.5.8. 确认驱动器

手动创建使用DirectPV CSI的PVC部署K8s Minio集群的实践分享至此完毕,使用Depolyment方式部署的Minio集群维护起来相对麻烦,而最佳实践使用MinIO Operator工具创建Minio集群,是最推荐的方式。
MinIO Operator
MinIO Operator 致力于在Kubernetes上创建/配置/管理 MinIO 集群,也是一种将私有和公共云基础设施(混合云)最佳的minio部署方法。
MinIO Operator会自动调用DirectPV创建PVC和PV,并且直接通过一个命令技能创建自定义minio节点和驱动器数量的Minio集群。
MinIO Operator的使用及利用Minio存储桶(对象存储)作为K8s存储的经验将在后续的博文介绍分享,挖个坑~~~
引用
https://min.io/directpv
https://github.com/minio/directpv
[转帖]Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践的更多相关文章
- kubernetes部署 etcd 集群
本文档介绍部署一个三节点高可用 etcd 集群的步骤: etcd 集群各节点的名称和 IP 如下: kube-node0:192.168.111.10kube-node1:192.168.111.11 ...
- kubernetes 实现redis-statefulset集群
Kubernetes 通过statefulset部署redis cluster集群 部署redis集群方式的选择 Statefulset Service&depolyment 对于redis, ...
- 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)
一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...
- 教你在Kubernetes中快速部署ES集群
摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...
- 在 Kubernetes 中部署 Redis 集群
在 Kubernetes 中部署 Redis 集群 在Kubernetes中部署Redis集群面临挑战,因为每个 Redis 实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色.为此,我们需 ...
- Kubernetes后台数据库etcd:安装部署etcd集群,数据备份与恢复
目录 一.系统环境 二.前言 三.etcd数据库 3.1 概述 四.安装部署etcd单节点 4.1 环境介绍 4.2 配置节点的基本环境 4.3 安装部署etcd单节点 4.4 使用客户端访问etcd ...
- Centos7离线部署kubernetes 1.13集群记录
一.说明 本篇主要参考kubernetes中文社区的一篇部署文章(CentOS 使用二进制部署 Kubernetes 1.13集群),并做了更详细的记录以备用. 二.部署环境 1.kubernetes ...
- 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...
- 二十八. Ceph概述 部署Ceph集群 Ceph块存储
client :192.168.4.10 node1 :192.168.4.11 ndoe2 :192.168.4.12 node3 :192.168.4.13 1.实验环境 准备四台KVM虚 ...
- 部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下
七.高可用架构(扩容多Master架构) Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失 ...
随机推荐
- Spring Batch 的基本使用
简介 A lightweight, comprehensive batch framework designed to enable the development of robust batch a ...
- JVM优化:如何进行JVM调优,JVM调优参数有哪些
Java虚拟机(JVM)是Java应用运行的核心环境.JVM的性能优化对于提高应用性能.减少资源消耗和提升系统稳定性至关重要.本文将深入探讨JVM的调优方法和相关参数,以帮助开发者和系统管理员有效地优 ...
- Python 潮流周刊第 35 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 十分钟从入门到精通(上)——OBS权限配置
[摘要]作为公有云的数据底座,大量的应用场景产生的数据都会存储到OBS对象存储服务中,如直播.电商.大数据可视化.机器学习.物联网等.作为公有云的海量存储基础服务, OBS提供了灵活的权限配置功能,解 ...
- 震惊!火爆全网的ChatGPT背后使用的数据库居然是……
摘要:ChatGPT承认了自己背后使用的数据库是Cassandra. OpenAI最近发布的AI驱动的智能聊天机器人ChatGPT在互联网上掀起了一阵风暴,热衷于尝试这一新AI成果的网民不在少数.Ch ...
- 聊聊LiteOS中生成的Bin、HEX、ELF三种文件格式
摘要:我们在使用编译器在编译工程后会要求生成可执行文件,将这些文件烧录到MCU进行运行,达到我们测试和使用程序的目的,再使用工具链进行编译的时候往往生成.bin..hex ..elf ..alf等文件 ...
- 解析Stream foreach源码
摘要:串行流比较简单,对于parallelStream,站在它背后的是ForkJoin框架. 本文分享自华为云社区<深入理解Stream之foreach源码解析>,作者:李哥技术 . 前言 ...
- OpenMetric与时序数据库模型之主流TSDB分析
摘要:为大家带来当下时序数据模型的主流TSDB分析及云厂商在时序数据模型方面的最新动态. 本文分享自华为云社区<[万字干货]OpenMetric与时序数据库存储模型分析(下)>,作者:敏捷 ...
- 关于 DataLeap 中的 Notebook,你想知道的都在这
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维 ...
- SpringBoot Kafka SSL接入点PLAIN机制收发消息
applycation.yml spring: # https://developer.aliyun.com/article/784990 kafka: bootstrap-servers: XXXX ...
