使用卷时,Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).

hostPath

hostPath为在Pod上挂载宿主机上的文件或目录,它通常可以用于以下几方面。

  1. 容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储。
  2. 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。

注意点:

  1. 在不同的Node上具有相同配置的Pod,可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致。
  2. 如果使用了资源配额管理,则Kubernetes无法将hostPath在宿主机上使用的资源纳入管理。

除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。支持的 type 值如下:

行为
空字符串(默认)用于向后兼容,这意味着在安装hostPath卷之前不会执行任何检查。
DirectoryOrCreate 如果给定路径中不存在任何内容,则将根据需要创建一个空目录,权限设置为0755,与Kubelet具有相同的组和所有权。
Directory 目录必须存在于给定路径中
FileOrCreate 如果给定路径中不存在任何内容,则会根据需要创建一个空文件,权限设置为0644,与Kubelet具有相同的组和所有权。
File 文件必须存在于给定路径中
Socket UNIX套接字必须存在于给定路径中
CharDevice 字符设备必须存在于给定路径中
BlockDevice 块设备必须存在于给定路径中

emptyDir

当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。
当 Pod 被从节点上删除时,emptyDir 卷中的数据也会永久删除。
注意: 容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。

emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 “Memory”,以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: vol-emp-demo
  5. namespace: default
  6. labels:
  7. app: vol-emp-demo
  8. spec:
  9. volumes:
  10. - name: html
  11. emptyDir: {}
  12. containers:
  13. - name: nginx
  14. image: nginx:1.14
  15. imagePullPolicy: IfNotPresent
  16. ports:
  17. - name: http
  18. containerPort: 80
  19. volumeMounts:
  20. - name: html
  21. mountPath: /usr/share/nginx/html/
  22. - name: alpine
  23. image: alpine:3.12
  24. imagePullPolicy: IfNotPresent
  25. volumeMounts:
  26. - name: html
  27. mountPath: /data/
  28. command: ["/bin/sh", "-c", "sleep 3600"]

执行yaml 文件

  1. $ kubectl apply -f vol-emptyDir-demo.yaml
  2. pod/vol-emp-demo created

查看pod信息

  1. $ kubectl get pods -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. vol-emp-demo 2/2 Running 0 12s 10.1.0.231 docker-desktop <none> <none>

进入Nginx容器

  1. $ kubectl exec -it vol-emp-demo -c nginx bash
  2. root@vol-emp-demo:/# cd /usr/share/nginx/html/

在容器中执行

  1. root@vol-emp-demo:/usr/share/nginx/html# date >> index.html
  2. root@vol-emp-demo:/usr/share/nginx/html# cat index.html
  3. Thu Jul 8 17:02:43 UTC 2021


busybox 看到index.html

  1. $ kubectl exec -it vol-emp-demo -c alpine sh
  2. / # cd /data/
  3. /data # ls
  4. index.html
  5. /data # cat index.html
  6. Thu Jul 8 17:02:43 UTC 2021

写入数据

  1. /data # echo "helloworld" >> index.html
  2. /data # date >> index.html
  3. /data # cat index.html
  4. Thu Jul 8 17:02:43 UTC 2021
  5. helloworld
  6. Thu Jul 8 17:05:46 UTC 2021

安装curl 或者直接使用wget

  1. apk --update add curl

显示结果如下

  1. # wget -q localhost -O-
  2. Thu Jul 8 17:02:43 UTC 2021
  3. helloworld
  4. Thu Jul 8 17:05:46 UTC 2021
  5. # curl localhost
  6. Thu Jul 8 17:02:43 UTC 2021
  7. helloworld
  8. Thu Jul 8 17:05:46 UTC 2021

参考

https://www.cnblogs.com/zhanglianghhh/p/13844062.html