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 卷将数据持久化。

005

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"

006

初始化driver

初始化 drives.yaml 中选择的驱动器。

[root@master01 directpv]# kubectl directpv init drives.yaml

提示:潜在的数据丢失风险:

  • 初始化将擦除驱动器上的所有现有数据;
  • 确保在 yaml 里只传递了符合预期的磁盘的信息给init命令;
  • 若原磁盘已格式化,或存在脏数据(非首次裸盘),则会出现提示,可通过 --dangerous 选项,强制格式化,注意数据风险!

007

验证确认

使用如下命令,验证是否成功,确保符合预期的结果,即列出已格式化并添加到DirectPV中的驱动器的信息。

[root@master01 directpv]# kubectl directpv info

008

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

009

方式二:污点标记安装

可以通过相应的污点标记设置需要安装drivepv的节点标签,从而通过 --toleration 安装到特定节点上,可参考官方示例 指定污点容忍

方式三:非标准目录安装

通常默认会安装在 /var/lib/kubelet/plugins/directpv-min-io/ ,若需要指定其他目录,可参考官方示例 在非标准kubelet目录安装

posted @ 2024-08-23 11:03  木二  阅读(4)  评论(0编辑  收藏  举报