【项目实战21】K8s(7)—volumes的管理上(emptyDir卷和hostPath卷)

一、前言

(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容器中的目录
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值