使用卷时,Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).
hostPath
hostPath为在Pod上挂载宿主机上的文件或目录,它通常可以用于以下几方面。
- 容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储。
- 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。
注意点:
- 在不同的Node上具有相同配置的Pod,可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致。
- 如果使用了资源配额管理,则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 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。
apiVersion: v1
kind: Pod
metadata:
name: vol-emp-demo
namespace: default
labels:
app: vol-emp-demo
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
- name: alpine
image: alpine:3.12
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/
command: ["/bin/sh", "-c", "sleep 3600"]
执行yaml 文件
$ kubectl apply -f vol-emptyDir-demo.yaml
pod/vol-emp-demo created
查看pod信息
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
vol-emp-demo 2/2 Running 0 12s 10.1.0.231 docker-desktop <none> <none>
进入Nginx容器
$ kubectl exec -it vol-emp-demo -c nginx bash
root@vol-emp-demo:/# cd /usr/share/nginx/html/
在容器中执行
root@vol-emp-demo:/usr/share/nginx/html# date >> index.html
root@vol-emp-demo:/usr/share/nginx/html# cat index.html
Thu Jul 8 17:02:43 UTC 2021
busybox 看到index.html
$ kubectl exec -it vol-emp-demo -c alpine sh
/ # cd /data/
/data # ls
index.html
/data # cat index.html
Thu Jul 8 17:02:43 UTC 2021
写入数据
/data # echo "helloworld" >> index.html
/data # date >> index.html
/data # cat index.html
Thu Jul 8 17:02:43 UTC 2021
helloworld
Thu Jul 8 17:05:46 UTC 2021
安装curl 或者直接使用wget
apk --update add curl
显示结果如下
# wget -q localhost -O-
Thu Jul 8 17:02:43 UTC 2021
helloworld
Thu Jul 8 17:05:46 UTC 2021
# curl localhost
Thu Jul 8 17:02:43 UTC 2021
helloworld
Thu Jul 8 17:05:46 UTC 2021