问题
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃
时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在
Pod 中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解决了
这些问题
背景
Kubernetes 中的卷有明确的寿命 —— 与封装它的 Pod
相同。所以,卷的生命比 Pod 中的所有容器都长,当这
个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes
支持多种类型的卷,Pod 可以同时使用任意数量的卷
卷的类型:
这里主要介绍两种:emptyDir、hostpath.
emptyDir
当pod被分配节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod中的容器可以读写和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中相同或不同的路径上。当处于任何原因从节点中删除Pod时,emptyDir中的数据将被永久删除
注意:容器崩溃不会从节点中移除,因此emptyDir卷中的数据在容器崩溃时时安全的。
emptyDir的用法有:
- 暂存空间,例如用基于磁盘的合作排序
- 用作长时间计算崩溃恢复时的检查点
- Web服务容器提供数据时,保存内容管理容器提取的文件
EmptyDir示例:
启动一个pod,里面有两个容器并且在不同的目录都挂载emptyDir:
[root@apiserver volume]# cat em.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-empty
spec:
containers:
- image: nginx
name: volume-empty
volumeMounts:
- mountPath: /cache
name: cache-volume
- image: redis
name: volume-empty1
volumeMounts:
- mountPath: /test
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
#查看第一个容器挂载点
root@volume-empty:/cache# date > index.html
root@volume-empty:/cache# cat index.html
Sun May 3 09:24:48 UTC 2020
#查看第二个容器
root@volume-empty:/test# date >> index.html
root@volume-empty:/test# cat index.html
Sun May 3 09:24:48 UTC 2020
Sun May 3 09:25:06 UTC 2020
HostPath:
hostpath卷将主机节点的文件、系统中的文件或目录中挂载到集群中.
hostpath的用途:
-
运行需要访问的Docker内部的容器;使用/var/lib/docker的hostpath
-
在容器中运行cAdisor;使用/dev/cgroups的hostpath
使用这种卷类型是请注意,因为: -
由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为
可能会有所不同 -
当 Kubernetes 按照计划添加资源感知调度时,将无法考虑
hostPath
使用的资源 -
在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机
上的文件权限以便写入hostPath
卷
[root@apiserver volume]# cat volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- image: nginx
name: volume-test
volumeMounts:
- mountPath: /test
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory
我的node1节点有一个文件,pod running后进入容器查看容器/test目录下是否有此文件:
[root@apiserver volume]# kubectl exec -it volume-test bash
root@volume-test:/# cd /test/
root@volume-test:/test# ls
mariadb-galera
有mariadb-galera此文件,表示挂在成功.