前言:
参考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
删除步骤:
- 删除使用这个 PV 的 Pod;
- 从宿主机移除本地磁盘(比如,umount 它);
- 删除 PVC;
- 删除 PV。
四、 Static Provisioner
k8s提供 Static Provisioner帮助管理PV。当 Static Provisioner 启动后,它就会通过 DaemonSet,自动检查每个宿主机的挂载目录,然后,调用 Kubernetes API,为这些目录下面的每一个挂载,创建一个对应的 PV 对象出来。