003.DirectPV存储管理
DirectPV drives管理
先决条件
- 已安装DirectPV插件。
- 在Kubernetes中已安装DirectPV CSI驱动程序。
添加drives
将Drives添加到DirectPV中,已用于提供volumes,主要有两步流程:
- 执行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"
- 执行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 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
作者:木二
出处:http://www.cnblogs.com/itzgr/
关于作者:云计算、虚拟化,Linux,多多交流!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!如有其他问题,可邮件(xhy@itzgr.com)咨询。