当前位置: 代码迷 >> 综合 >> k8s专栏-持久化存储(二) Local Persistent Volume
  详细解决方案

k8s专栏-持久化存储(二) Local Persistent Volume

热度:45   发布时间:2023-12-16 20:03:32.0

前言:

参考k8s教程由浅入深(哔哩哔哩课程)  深入剖析Kubernetes(极客时间)

一、Local Persistent Volume

意义:直接使用本地磁盘目录进行存储,增加读写性能

Local Persistent Volume设计难点:

1)如何将本地磁盘抽象成PV

  • 问题:不应该把一个宿主机上的目录当作 PV 使用,因为缺乏io隔离,并且有可能被应用写满,造成宿主机宕机
  • 解决:Local Persistent Volume 对应的存储介质须是额外挂载在宿主机的磁盘或者块设备

2)如何保证Pod始终能被正确的调度到它所请求的 Local Persistent Volume 所在的节点上

  • 问题:使用两阶段处理是在pod调度到结点之后才执行的,对于Local PV来说,必须是事先知道宿主机上有哪些可用磁盘,才可以进行调度,不能在调度后才执行绑定
  • 解决:调度器必须知道所有结点与Local Persistent Volume对应的磁盘关联关系,然后使用这个信息来调度Pod。(由VolumeBindingChecker 的过滤条件专门负责)

部署方法:

方法一:在宿主机上挂载并格式化一个可用本地磁盘

方法二:对于实验环境,可用在宿主机上挂载几个RAM Disk模拟本地磁盘

二、部署示例

1.创建挂载点

# 在node-1上执行
$ mkdir /mnt/disks
$ for vol in vol1 vol2 vol3; domkdir /mnt/disks/$volmount -t tmpfs $vol /mnt/disks/$vol
done

如果希望其他节点能支持Local Persistent Volume,需要在其他节点上执行挂载,并保证磁盘名称不重复

2.为本地磁盘定义PV

apiVersion: v1
kind: PersistentVolume
metadata:name: example-pv
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: DeletestorageClassName: local-storagelocal:       # 指定它是一个 Local Persistent Volumepath: /mnt/disks/vol1  # PV对应的本地磁盘路径nodeAffinity:     # 亲和性标志required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node-1   # 必须部署在node-1上

pod要使用PV,必须运行在node-1上,因此必须增加亲和性标志

3.创建StorageClass

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: local-storage
provisioner: kubernetes.io/no-provisioner   # no-provisioner代表不会自动创建PV,创建PV步骤不可省略
volumeBindingMode: WaitForFirstConsumer     #延迟绑定

延迟绑定意义:避免一个被指定调度到特定结点的pod被绑定到合适的PV,根据调度器必须在调度的时候考虑 Volume 分布”的原则,导致pod被调度到不符合要求的node上

延迟调度时机:推迟到调度的时候。等到第一个声明使用该PVC的Pod出现在调度器之后,考虑调度规则,包括结点位置,来统一决定Pod声明的PVC要和哪一个PV绑定

延迟调度实现原理:维护了一个和Volume Controller 类似的控制循环,专门负责为声明了延迟绑定的PV/PVC绑定工作。当一个Pod的PVC未完成绑定时,调度器不会等待,而是直接把Pod重新放回待调度队列中,等下一个调度周期再处理

4.创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: example-local-claim
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5GistorageClassName: local-storage

5.编写pod使用PVC


kind: Pod
apiVersion: v1
metadata:name: example-pv-pod
spec:volumes:- name: example-pv-storagepersistentVolumeClaim:claimName: example-local-claimcontainers:- name: example-pv-containerimage: nginxports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: example-pv-storage

在Pod调度后,PVC才会和PV进行绑定

三、删除PV/PVC

删除步骤:

  1. 删除使用这个 PV 的 Pod;
  2. 从宿主机移除本地磁盘(比如,umount 它);
  3. 删除 PVC;
  4. 删除 PV。

四、 Static Provisioner

k8s提供 Static Provisioner帮助管理PV。当 Static Provisioner 启动后,它就会通过 DaemonSet,自动检查每个宿主机的挂载目录,然后,调用 Kubernetes API,为这些目录下面的每一个挂载,创建一个对应的 PV 对象出来。

  相关解决方案