002.DirectPV介绍及安装
DirectPV简介
DirectPV概述
DirectPV 是直接连接存储的 CSI 驱动程序。从更简单的意义上说,它是一个分布式持久卷管理器,而不是像 SAN 或 NAS 那样的存储系统。
它可以用于发现、格式化、挂载、调度和监视跨服务器的硬盘驱动器。
由于 Kubernetes hostPath 和本地 pv 是静态配置的,功能有限,DirectPV 的创建就是为了解决这个限制。
DirectPV 使用这些挂载的驱动器来创建持久卷( PV ), Kubernetes 使用 PV 来实现持久卷声明( pvc )。
分布式数据存储集群(如对象存储、数据库和消息队列)通常最终都使用了直连存储,集群自身处理高可用性和数据持久性。
在传统的基于 SAN 或 NAS 的 CSI 驱动程序上运行这样的数据存储会增加不必要的 replication/erasure 层,从而导致数据路径上的额外网络跳数,这种额外的分解层会增加复杂性和较差的性能。
而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的设计是轻量级的,可扩展到数万个驱动器。
它由三个组件组成:Controller 、Node Driver、UI。
- Controller
当存在 pvc 时,控制器将统一地从池中空闲驱动器提供卷。
DirectPV 知道 pod 的关联约束,并将本地驱动器的卷分配给pod。
提示:每个集群只运行一个活动的控制器实例。
-
Node Driver
Node Driver 实现对节点上的驱动器的发现、格式化、挂载、监控等卷管理功能。
每个存储服务器上运行一个节点驱动程序实例。 -
UI
存储管理员可以使用kubectl CLI插件来选择、管理和监控驱动器,基于Web的UI暂时不可用。
DirectPV 在根据部署 pod 的工作节点分配存储时强制节点约束。
如果 pod 部署到没有 DirectPV 管理的驱动器或驱动器不足的工作节点,则 DirectPV 无法为该 pod 分配存储。DirectPV 不会将存储从一个节点分配给另一个节点上的 pod 。
DirectPV局限性
DirectPV 本质上是利用节点磁盘创建并挂载了一个挂载分区供 Kubernetes pod 使用,最终依旧规避不了节点单点故障和硬盘损坏的问题,并且数据的持久化受到由 DirectPV 分配的 PV 卷的限制。
DirectPV 结合 Minio 集群突破 DirectPV 的局限性,每个 minio 集群节点上由 Kubernetes 调度,而每个集群节点的驱动器使用的 PV 由 DirectPV 调度,也就是说驱动器实际使用的存储资源是由 DirectPV 随机的从属于 Kubernetes 的 DirectPV 存储池中分配出来的,那实际的数据会随机的分布在 node 节点上的硬盘上。
-
硬盘单点故障
若是 Kubernetes node 节点本身使用的是 JOBD 存储,那自然没有硬盘单点故障的问题,即使没有使用 JOBD 存储,因为 minio 集群存储的数据是分布式地在各个不同 minio 集群节点的驱动器上,本质上就是在各个 Kubernetes node 节点的不同硬盘上,只要 node 节点硬盘数量够多,很大程度上可以规避硬盘单点故障的问题。 -
Kubernetes node 节点单点故障
同样的,node 节点上故障时将会有大量的 PV 不可用,从而导致 minio 集群驱动器大量的掉线,可以通过部署大量 Kubernetes node 节点,使实际的硬盘驱动器散列的分布在不同节点硬盘上。
DirectPV部署
前置准备
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 节点 |
worker02 | 172.24.10.15 | /dev/nvme0n2 | worker节点+ MinIO 节点 |
worker03 | 172.24.10.16 | /dev/nvme0n2 | worker节点+ MinIO 节点 |
krew安装
在本地环境中安装 DirectPV 插件来管理 Kubernetes 集群中的 DirectPV CSI Driver ,可以使用krew或作为二进制文件进行安装。
[root@master01 ~]# mkdir /tmp/krew
[root@master01 ~]# cd /tmp/krew/
[root@master01 krew]# OS="$(uname | tr '[:upper:]' '[:lower:]')"
[root@master01 krew]# ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')"
[root@master01 krew]# KREW="krew-${OS}_${ARCH}"
[root@master01 krew]# curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz"
[root@master01 krew]# ll
total 4.4M
-rw-r--r-- 1 root root 4.4M Aug 18 07:07 krew-linux_amd64.tar.gz
[root@master01 krew]# tar zxvf "${KREW}.tar.gz"
./LICENSE
./krew-linux_amd64
[root@master01 krew]# ./"${KREW}" install krew
[root@master01 krew]# echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> .bashrc
[root@master01 krew]# source .bashrc
参考: DirectPV最佳实践
DirectPV Plugin安装
使用 krew 安装 DirectPV 。
[root@master01 ~]# kubectl krew update #更新Krew以下载最新版本的插件
[root@master01 ~]# kubectl krew install directpv #将DirectPV安装到krew安装目录(默认:$HOME/.krew)
[root@master01 ~]# kubectl directpv --version #确认安装版本
提示:krew 相关命令参考: DirectPV CLI 。
Drive标准安装
安装说明
标准安装使用默认选项并在所有节点上安装 DirectPV 。
也可以使用自定义安装,进行更多的设置。
- 先决条件
-
在x86架构上已部署 Kubernetes ,其版本大于等于 v1.18 ;
-
如果使用私有仓库,必须将如下镜像推送到该仓库:
quay.io/minio/csi-node-driver-registrar:v2.8.0
quay.io/minio/csi-provisioner:v3.5.0 (for Kubernetes >= v1.20)
quay.io/minio/csi-provisioner:v2.2.0-go1.18 (for kubernetes < v1.20)
quay.io/minio/livenessprobe:v2.10.0
quay.io/minio/csi-resizer:v1.8.0
quay.io/minio/directpv:latest -
开启ExpandCSIVolumes特性,便于卷扩展。
-
正式安装后,会创建一个名为 directpv-min-io 的新storage class。
然后可以通过使用此 storage class 作为 PodSpec.VolumeClaimTemplates 中的 storageClassName 来提供 DirectPV 卷。
安装DirectPV组件
在 kubernetes 集群的所有节点上安装 directpv-min-io CSI 驱动程序。
[root@master01 ~]# mkdir directpv && cd directpv
[root@master01 directpv]# kubectl directpv install
命令释义:
- DirectPV 组件安装在 directpv 命名空间中。
- 使用 kubectl directpv --kubeconfig /path/to/kubeconfig 指定一个备用 kubecconfig 。
- DirectPV driver 需要规范文档中列出的基于角色的访问控制( RBAC )。
- DirectPV driver 以特权模式运行,需要能执行挂载、卸载和格式化驱动器。
- DirectPV 使用的守护进程需要以下开放端口:
- 10443 表示度量使用的端口
- 准备处理程序的端口 30443
要在指定的节点上安装 DirectPV ,使用 tolerations 或非标准 kubelet 目录,请参考 自定义安装 部分。
提示:也可以使用如下命令下载 install.sh 脚本并运行,从而实现在所有节点上执行 DirectPV 的标准安装。
curl -sfL https://github.com/minio/directpv/raw/master/docs/tools/install.sh | sh - apply
,
但通常不建议,避免出现非预期内的磁盘被初始化。
发现driver
列出 kubernetes 集群中所有可用的 driver,DirectPV 生成一个 init 配置文件(默认:drivers .yaml),可以使用它来初始化这些驱动器。
可根据事情需要修改文件,以便删除任何 DirectPV 不应该控制的驱动器。
[root@master01 directpv]# kubectl directpv discover
[root@master01 directpv]# vim drives.yaml #本实验仅使用nvme0n2设备
version: v1
nodes:
- name: worker02
drives:
- id: 259:3$vKn1G3ntpurBUVN/Vg57Blr3Xu0iIjzEsmR60LncxaA=
name: nvme0n2
size: 21474836480
make: VMware Virtual NVMe Disk
fs: xfs
select: "yes"
- name: worker03
drives:
- id: 259:3$pP6hicwQMveTPLBfiPiMBhEoBEkLzgkT3wha3RsYKEs=
name: nvme0n2
size: 21474836480
make: VMware Virtual NVMe Disk
fs: xfs
select: "yes"
- name: worker01
drives:
- id: 259:3$7qZt1jd+YV9YxDsLJLgrbYhka3KyZL1jfRFoHS5Sa68=
name: nvme0n2
size: 21474836480
make: VMware Virtual NVMe Disk
fs: xfs
select: "yes"
初始化driver
初始化 drives.yaml 中选择的驱动器。
[root@master01 directpv]# kubectl directpv init drives.yaml
提示:潜在的数据丢失风险:
- 初始化将擦除驱动器上的所有现有数据;
- 确保在 yaml 里只传递了符合预期的磁盘的信息给init命令;
- 若原磁盘已格式化,或存在脏数据(非首次裸盘),则会出现提示,可通过 --dangerous 选项,强制格式化,注意数据风险!
验证确认
使用如下命令,验证是否成功,确保符合预期的结果,即列出已格式化并添加到DirectPV中的驱动器的信息。
[root@master01 directpv]# kubectl directpv info
Drive自定义安装
方式一:指定节点安装
指定节点安装可以通过设置需要安装drivepv的节点标签,从而通过 --node-selector 安装到特定节点上。
[root@master01 directpv]# kubectl label nodes worker0{1,2,3} drivepv=enable
[root@master01 directpv]# kubectl directpv install --node-selector drivepv=enable
方式二:污点标记安装
可以通过相应的污点标记设置需要安装drivepv的节点标签,从而通过 --toleration 安装到特定节点上,可参考官方示例 指定污点容忍 。
方式三:非标准目录安装
通常默认会安装在 /var/lib/kubelet/plugins/directpv-min-io/ ,若需要指定其他目录,可参考官方示例 在非标准kubelet目录安装 。
作者:木二
出处:http://www.cnblogs.com/itzgr/
关于作者:云计算、虚拟化,Linux,多多交流!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!如有其他问题,可邮件(xhy@itzgr.com)咨询。