存储卷
持久卷
卷概述
- 容器化带来的问题
容器中的文件在磁盘上是临时存放的,这给容器中的运行的重要的应用程序带来一些问题
- 问题1:当容器崩溃或重启的时候,kubelet会以干净的状态(镜像的状态)重启容器,容器内的历史数据会丢失
- 问题2:当容器被删除时(k8s没有停止容器的概念,只有创建、删除),容器内的数据也会被一起清理
- 问题3:多个容器中有共享文件或目录的需求
- 卷是什么?
- 为什么要使用卷?
- 卷可以解决容器崩溃或重启后历史数据丢失的问题
- 卷可以解决容器或Pod被删除后数据持久保存的问题
- 卷可以解决在多个容器内共享数据的问题
- Pod可以同时使用任意数目的卷
- k8s支持的卷类型
- 持久卷:持久卷是集群中的存储资源,就像他的名字一样,在里面存储的数据不会随着Pod的删除而丢失
- 临时卷:有些应用程序需要额外的存储,但并不关系数据在重启后是否仍然可用。卷会遵从Pod的生命周期,与Pod一起创建和删除
- 投射卷:它允许将多个现有卷源映射到同一个目录。通过将这些不同类型的卷源组成一个统一的卷,可以更方便地管理和使用这些资源
- 如何使用卷?
- 首先编写一个Pod的资源清单文件
- 在Pod.spec下添加volumes字段,配置外部存储为卷
- 在Pod.spec.containers[*]中添加volumeMounts字段,声明卷在容器中的挂载位置
- 注意事项
- 卷不能挂载到其他卷之上,也不能与其他卷有硬链接
- Pod配置中的每个容器必须独立指定各个卷的挂载位置
hostPath存储卷
- hostPath是持久卷
- hostPath卷的本质是使用本地设备,例如磁盘、分区、目录、Socket、CharDevice和BlockDevice等等。hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康,那么hostPath卷也将不可被访问
- hostPath卷里面的数据不会随着Pod的结束而消失
- 注意事项:配置相同的Pod,可能在不同的节点上表现不同,因为不同节点上映射的文件内容不同,因为不同节点上映射的文件内容不同
- 使用hostPath卷保存日志
- type对应类型
类型 |
说明 |
DirectoryOrCreate |
卷映射对象是一个目录,如果不存在就创建它 |
Directory |
卷映射对象是一个目录,且必须存在 |
FileOrCreate |
卷映射对象是一个文件,如果不存在就创建它 |
File |
卷映射对象是一个文件,且必须存在 |
Socket |
卷映射对象是一个Socket套接字,且必须存在 |
CharDevice |
卷映射对象是一个字符设备,且必须存在 |
BlockDevice |
卷映射对象是一个块设备,且必须存在 |
- hostPath卷
[root@master ~] vim web1.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: web1
spec:
volumes:
- name: logdata
hostPath:
path: /var/weblog
type: DirectoryOrCreate
containers:
- name: nginx
image: myos:nginx
volumeMounts:
- name: logdata
mountPath: /usr/local/nginx/logs
[root@master ~] kubectl apply -f web1.yaml
pod/web1 created
[root@master ~] kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
web1 1/1 Running 0 45m 10.244.2.16 node-0002
[root@master ~] curl http://10.244.2.16/
Nginx is running !
[root@master ~] kubectl delete pod web1
pod "web1" deleted
[root@node-0002 ~] cat /var/weblog/access.log
10.244.0.0 - - [27/Jun/2022:02:00:12 +0000] "GET / HTTP/1.1" 200 19 "-" "curl/7.29.0"
NFS存储卷
- NFS存储
- k8s中允许将nfs存储以卷的方式挂载到你的Pod中。
- 在删除Pod时,nfs存储卷会被卸载(umount),而不是被删除。nfs卷可以在不同节点的Pod之间共享数据
- NFS卷的用途
- NFS最大的功能就是在不同节点的不同Pod中共享读写数据。本地NFS的客户端可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
- 部署NFS服务
名称 |
IP地址 |
配置 |
nfs |
192.168.1.10 |
1CPU,1GMEM |
[root@nfs ~] mkdir -p /var/webroot
[root@nfs ~] echo "nfs server" >/var/webroot/index.html
[root@nfs ~] dnf install -y nfs-utils