volumes的管理上
一、前言
(1)、pod存储问题
容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。
(2)、Volumes的引入
Kubernetes 抽象出 Volume 对象来解决这两个问题。
1、Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。
2、当一个 Pod 不再存在时,卷也将不再存在。Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。
3、卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置
二、emptyDir卷
(1)、emptyDir的简介
卷最初是空的,当 Pod 指定到某个节点上时,会自动创建 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
(2)、emptyDir 的使用场景
1、缓存空间,例如磁盘的归并排序。
2、为耗时较长的计算任务提供检查点,以便任务能方便的从崩溃前状态台恢复执行
3、在web服务器容器服务数据时,保存内容管理器容器获取的文件
(3)、多容器共享pod
创建一个包含busyboxplus和nginx的pod,同时限制emptyDir的大小为100Mi
1、建立yaml文件,建立容器
mkdir volumes
cd volumes/
vim vol1.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol1
spec:
containers:
- image: busyboxplus
name: vm1
command: ["sleep", "300"]
volumeMounts:
- mountPath: /cache
name: cache-volume
- name: vm2
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
medium: Memory
sizeLimit: 100Mi
2、执行清单,查看pod
kubectl apply -f vol1.yaml
kubectl get pod -o wide
3、进入VM2容器的挂载路径,编写发布文件
kubectl exec -it vol1 sh -c vm2
4、进入VM1容器的挂载路径
发现VM2编写的发布内容在VM1中也能查看到,说明挂载是可以共享的
kubectl exec -it vol1 sh -c vm1
5、创建一个200Mi的文件,测试emptyDir的限制,观察到pod为Evicted状态
kubectl exec -it vol1 sh -c vm1
dd if=/dev/zero of=/cache/bigfile bs=1M count=200
kubectl get pod -o wide
6、当文件超过sizeLimit后,pod不会“立即”被evict,是因为kubelet是定期进行检查的,会存在一个时间差。
7、emptyDir缺点
不能及时禁止用户使用内存。虽然过1-2分钟kubelet会将Pod挤出,但是这个时间内,其实对node还是有风险的
影响kubernetes调度,因为emptydir并不涉及node的resources,这样会造成Pod“偷偷”使用了node的内存,但是调度器并不知晓
用户不能及时感知到内存不可用
三、hostPath卷
(1)、hostPath卷简介
hostPath 卷能将node主机节点文件系统上的文件或目录挂载到node上的的Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。
hostPath 的用法
1、容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储。
2、需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。
hostPath 卷的 type
除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type
使用卷时的注意事项
1、具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
2、当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
3、基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。
(2)、使用hostPath卷
1、创建hostPath卷
kubectl delete -f vol1.yaml 删除刚刚创建的vol1
vim host.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /test-pd 挂载到容器内的地址
name: test-volume 使用创建的卷
volumes:
- name: test-volume 卷名
hostPath:
path: /data 创建的位置
type: DirectoryOrCreate 直接创建
2、应用清单,在node上查看生成的目录
kubectl apply -f host.yaml
kubectl get pod -o wide
3、进入/data,编写文件
因为外部卷创造的地址是/data,在这里写index.html文件是为了查看实验效果。
cd /data/
echo linux > index.html
4、进入pod中的容器,查看到有相同文件
说明node主机上的目录挂载到pod容器中的目录