003.DirectPV存储管理

DirectPV drives管理

先决条件

  • 已安装DirectPV插件。
  • 在Kubernetes中已安装DirectPV CSI驱动程序。

添加drives

将Drives添加到DirectPV中,已用于提供volumes,主要有两步流程:

  1. 执行discover命令
    discover命令从DirectPV节点探测符合条件的硬盘,并将硬盘信息存储在YAML文件中。

建议仔细检查YAML文件,并将select字段设置为yes或no值,以选择对应的driver。“Select”字段默认设置为“yes”。

# kubectl directpv discover

# vim drives.yaml
version: v1
nodes:
    - name: master
      drives:
        - id: 252:16$ud8mwCjPTH8147TysmiQ2GGLpffqUht6bz7NtHqReJo=
          name: vdb
          size: 536870912
          make: ""
          select: "yes"
    - name: node1
      drives:
        - id: 252:16$gGz4UIuBjQlO1KibOv7bZ+kEDk3UCeBneN/UJdqdQl4=
          name: vdb
          size: 536870912
          make: ""
          select: "yes"
  1. 执行init命令初始化
    init命令创建一个请求,将选定的驱动器添加到使用discover命令生成的YAML文件中。
    由于此过程擦除所选驱动器上的所有数据,错误的驱动器选择将导致永久数据丢失,一定需要谨慎。
# kubectl directpv init drives.yaml

列出drives

需要从DirectPV获取驱动器信息,使用list drives命令。

# kubectl directpv list drives

标记drives

对驱动器设置自定义标记,以便于在卷配置中使用。

# kubectl directpv label drives tier=hot        #将标签'tier'键设置为'hot'值

# kubectl directpv label drives tier-           #删除标签“tier”

替换drives

替换driver可以在同一节点上更换故障硬盘。
在此过程中,将故障驱动器中的所有卷移动到新驱动器中,然后将故障驱动器从DirectPV中移除。
目前,DirectPV不支持将卷上的数据移动到新驱动器。
可以使用 replace.sh 脚本执行驱动器更换。。

# replace.sh sdd sdf node1

移除drives

可以移除不包含任何卷的驱动器。

# kubectl directpv remove --drives=vdb --nodes=node1

暂停drives

根据Kubernetes的设计,只有当所有pod都处于运行状态时,StatefulSet工作负载才处于活动状态,任何故障驱动器都将阻止statfulset启动。
DirectPV提供了一个解决方案来挂起故障驱动器,它将以只读访问权限将相应的卷挂载到空的/var/lib/directpv/tmp目录上,这可以通过执行suspend drives命令来完成。

# kubectl directpv suspend drives af3b8b4c-73b4-4a74-84b7-1ec30492a6f0

挂起的驱动器一旦故障修复就可以恢复,恢复后,相应的卷将使用各自分配的驱动器恢复。
这可以通过使用resume drives命令来完成。

# kubectl directpv resume drives af3b8b4c-73b4-4a74-84b7-1ec30492a6f0

修复drives

在极少数情况下,可以修复故障驱动器上的文件系统使其可以继续使用。
作为第一步,必须挂起故障驱动器,然后为它们运行修复命令。

repair命令创建一次性Kubernetes作业,pod名称为repair-,这些作业在作业完成五分钟后自动删除。可以使用kubectl log命令查看驱动器修复的进度和状态。

# kubectl directpv suspend drives af3b8b4c-73b4-4a74-84b7-1ec30492a6f0      #挂起驱动器

重新启动pod,并确保关联的卷未绑定。

在挂起的驱动器上运行修复命令。

# kubectl directpv repair af3b8b4c-73b4-4a74-84b7-1ec30492a6f0

扩容Volume

在线扩容

DirectPV 支持在线卷扩展,扩容过程中使用这些卷的 Pod 不需要重启。
同时扩展相关的 PVC 的大小后是自动完成的。

# kubectl get pvc [PersistentVolumeClaimName] -o yaml > my-file-name.yaml

在PVC中,修改 spec.resources.requests.storage 以更改请求的大小。
应用更改后,PVC 更新,DirectPV 自动增加分配给申请卷的大小。
使用kubectl get pvc [PersistentVolumeClaimName] -o yaml验证,查看 status.capacity.storage 以查看更新后的大小。

删除Volume

只有当卷处于 Ready 状态且没有pod正在使用该卷时,卷才能被删除。
执行kubectl delete pvc命令触发删除 DirectPV 卷,删除卷将导致数据永久丢失,请确认要删除的卷。

# kubectl delete pvc sleep-pvc                  #删除sleep-pvc卷

清理残留Volume

当 pod 和 Persistent Volume Claims 被强制删除时,关联的 DirectPV 卷可能不会被删除,这将导致卷残留,使用clean命令删除残留卷。

# kubectl directpv clean --all                  #清理残留卷

暂停Volume

数据丢失:

根据Kubernetes的设计,只有当它的所有pod都处于运行状态时,StatefulSet工作负载才处于活动状态,故障卷导致statfulset无法启动。

DirectPV提供了一种解决方案,通过将失败的卷挂载到具有只读访问权限的空/var/lib/directpv/tmp目录上来挂起它们,这可以通过执行suspend volumes命令来完成。

# kubectl directpv suspend volumes --nodes node-1 --drives dm-3

一旦修复了挂起的卷,就可以恢复它们,恢复后,相应的卷返回使用各自分配的驱动器。

# kubectl directpv resume volumes --nodes node-1 --drives dm-3

提示:如上操作比较危险,可能导致数据丢失,同时如上操作通常用于更换损坏的硬盘。

DirectPV drives使用

使用介绍

卷配置包括使用默认的directpv-min-io storage class 或具有directpv-min-io提供程序的自定义 storage class 制作 persistentvolumecclaim ,由于 storage class 自带卷绑定模式 WaitForFirstConsumer 。
此模式延迟 PersistentVolume 的卷绑定和供应,直到使用 persistentvolumecclaim 的Pod被创建。将根据Pod的调度约束指定的拓扑来选择或配置 PersistentVolumes 。

这些包括(但不限于)资源需求、节点选择器、pod亲和和反亲和、污点和容忍,使用卷的pod被调度到调度卷的节点。这确保了对pod的高性能数据访问。

DirectPV volume 处于 Ready 状态,表示该卷可以绑定到pod,绑定完成后,该卷设置为 Bound 状态。

创建PVC

PV声明必须在persistentvolumecclaim规范中使用特定参数定义。

[root@master01 directpv]# vim directpv-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: directpv-pvc
  namespace: default
spec:
  volumeMode: Filesystem
  storageClassName: directpv-min-io
  accessModes: 
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi

[root@master01 directpv]# kubectl get pvc -o wide
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE    VOLUMEMODE
directpv-pvc   Bound    pvc-49c5aeff-0a8f-4a1d-b497-e4cd0af59c7d   100Mi      RWO            directpv-min-io   <unset>                 2m7s   Filesystem

创建Pod

对于WaitForFirstConsumer卷绑定模式,必须定义一个消耗directpv-pvc的pod,下面是一个在/mnt上使用directpv-volume的例子。

[root@master01 directpv]# vim directpv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: directpv-pod
spec:
  volumes:
    - name: directpv-volume
      persistentVolumeClaim:
        claimName: directpv-pvc
  containers:
    - name: directpv-container
      image: busybox:1.36.1
      args: [/bin/sh, -c, while true; do echo "$(date)" >> /tmp/1.log && sleep 10; done]
      volumeMounts:
        - mountPath: "/tmp"
          name: directpv-volume

[root@master01 directpv]# kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE       NOMINATED NODE   READINESS GATES
directpv-pod   1/1     Running   0          2m3s   10.10.5.55   worker01   <none>           <none>

[root@master01 directpv]# kubectl exec -ti directpv-pod -- cat /tmp/1.log
Thu Aug 22 18:16:55 UTC 2024
Thu Aug 22 18:17:05 UTC 2024
Thu Aug 22 18:17:15 UTC 2024
Thu Aug 22 18:17:25 UTC 2024
Thu Aug 22 18:17:35 UTC 2024
Thu Aug 22 18:17:45 UTC 2024
Thu Aug 22 18:17:55 UTC 2024
posted @ 2024-08-23 22:50  木二  阅读(18)  评论(0编辑  收藏  举报