持久化存储
持久化存储#
这个 感觉 很重要
Volumes#
HostPath
将节点上的文件或目录挂载到 Pod 上,该目录会变成持久化存储目录,即使 Pod 删除后重启,也可以重新加载到该目录,目录下的文件不会丢失
- 首先创建配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16apiVersion: v1
kind: Pod
metadata:
name: test-volume-pd
spec:
volumes: # 卷定义在spec级别
- name: test-volume
hostPath: # 与主机共享目录
path: /usr/share/xx # 主机上的路径
type: DirectoryOrCreate # 目录的类型
containers:
- image: nginx
name: nginx-volume
volumeMounts: # 挂载卷的配置在容器级别
- mountPath: /test-pd
name: test-volume- 可以在主机上找到配置目录
1
2
3
4
5
6
7
8hhhyc@hhhyc:~$ cd ..
hhhyc@hhhyc:/home$ ls
hhhyc
hhhyc@hhhyc:/home$ cd ..
hhhyc@hhhyc:/$ ls
Docker **data** home lib32 lost+found opt run srv usr
bin dev init lib64 media proc sbin sys var
boot etc lib libx32 mnt root snap tmp- 也可以在容器内找到挂载的路径
1
2
3
4
5hhhyc@hhhyc:~/volumes$ sudo kubectl exec -it test-volume-pd -- sh
# ls
bin docker-entrypoint.d home media proc sbin test-pd var
boot docker-entrypoint.sh lib mnt root srv tmp
dev etc lib64 opt run sys usrEmptyDir
用于一个Pod 不同的 Container 共享数据使用
在删除 Pod 的时候同样也会被删除
NFS挂载#
需要将NFS服务器挂载到Pod中
NFS 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味者 NFS 卷可以被预先填充数据,并目这些数据可以在 Pod 之间共享,
就是可以不同的 Pod 挂载到同一个 NFS 服务中,就可以共享数据了
但是 这个经过网络访问后 ,稳定性比较差,传输较慢
安装 nfs
1
yum install nfs-utils -y
启动 nfs
1
systemctl start nfs -server
查看 nfs 版本
1
cat /proc/js/nfsd/version
创建共享目录
1
mkdir -p /data/nfs
然后 gpt 启动
PV 与 PVC#
这才是最重要的东西,上面的东西没啥用
概念了解#
之前如果要做数据持久化的操作,就会绑定某个路径或者NFS,但是如果服务器多了,每个节点都有不同的选择,选择起来就会非常混乱,因此我们需要一个存储管理工具,也可以看作是 存储方式的抽象
PV:存储卷 其本身没有存储功能的,他只是会指定数据去哪个工具去存储,很方便
PVC:持久卷申领 对于如何使用 PV
,就需要使用 PVC
来申领持久卷
形象一点的比喻就是:
消费者 问 代购 买 具体数量 的 某个产品;然后代购会向厂家申报,厂家申报成功后 选择相应数量和具体产品返回给消费者。
一个 PVC 只能绑定一个 PV
一个Pod 可以绑定多个 PVC
构建#
静态构建
创建模板
集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息,并且对集群用户可用(可见)。PV卷对象存在于Kubemetes Api中,可供用户消费(使用)
动态构建
原有模板不符合,需要新创建(
StorageClass
)如果集群中已经有的 PV 无法满足 PVC的需求,那么集群会根据 PVC 自动构建一个 PV,该操作是通过 Storageclass 实现的 , 想要实现这个操作,前提是
PVC
必须设置Storageclass
,否则会无法动志构建该 PV,可以通过启用Defaultstorageclass
来实现PV
的构建。
绑定#
但用户创建一个 PVC 对象后,主节点会检测新的 PVC 对象,并且寻找与之匹配的 PV 对象,找到PV卷后两者绑定在一起。
如果找不到对应的PV,则需要看PVC是否设置了 Storageclass 来决定是否动态创建 PV,如果没有配置,则PVC就会一直处于未绑定的状态,知道有匹配的PV
使用#
Pod 会把 PVC 当作存储卷来使用,集群会通过 PVC 找到绑定的PV ,并为Pod挂载该卷
Pod 一旦使用PVC绑定 PV后,为了保护数据,PV对象无法被删除
删除#
- Retain(保留):
- 这是默认的回收策略。当PVC被删除时,PV不会被自动删除,其资源不会被释放。你需要手动清理PV的资源,包括删除PV对象和清理底层存储中的相关数据。
- Recycle(回收):
- 在这种策略下,当PVC被删除时,Kubernetes会尝试删除PV,并且对底层存储执行基本的清理操作。这通常意味着删除存储中的文件。Recycle策略适用于动态供应的PV,特别是那些使用云服务提供商存储或通用存储系统的情况。(现已废弃)
- Delete(删除):
- 当设置为Delete策略时,当PVC被删除,PV也会被自动删除。如果PV是由动态存储供应器创建的,相应的存储资源也会被释放。这是一种干净的回收方式,但请谨慎使用,因为这会导致数据的永久丢失。
- Retain(保留):
PV#
配置:
pv-nfs.yaml:
1 | apiVersion: v1 # 指定API版本,对于PV通常是v1 |
1 | sudo kubectl create -f pv-nfs.yaml |
状态(status):
- available: 空闲,违背绑定多个
- Bound: 已经被 PVC 绑定
- Released: PVC 已经被删除,资源已回收,但是 PV 未被重新使用
- Failed: 自动回收失败
PVC#
我们一般使用 Pod 来管理 PVC
- PV 与 PVC 进行绑定
配置:
1 | apiVersion: v1 # 使用正确的API版本 |
创建:
1 | sudo kubectl create -f pvc-test.yaml |
- Pod 与 PVC 进行绑定
1 | apiVersion: v1 |
1 | sudo kubectl create -f pod-test.yaml |
🆗了
StorageClass#
sc
– 存储类 – 动态制备PV
每一个 StorageClass 都有一个制备器,用来决定使用哪个卷插件来制备PV (本地磁盘/nfs/cri)
这个要自己构建,要用了再学吧,感觉用处不大了