使用卷时,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: v1kind: Podmetadata:name: vol-emp-demonamespace: defaultlabels:app: vol-emp-demospec:volumes:- name: htmlemptyDir: {}containers:- name: nginximage: nginx:1.14imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80volumeMounts:- name: htmlmountPath: /usr/share/nginx/html/- name: alpineimage: alpine:3.12imagePullPolicy: IfNotPresentvolumeMounts:- name: htmlmountPath: /data/command: ["/bin/sh", "-c", "sleep 3600"]
执行yaml 文件
$ kubectl apply -f vol-emptyDir-demo.yamlpod/vol-emp-demo created
查看pod信息
$ kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESvol-emp-demo 2/2 Running 0 12s 10.1.0.231 docker-desktop <none> <none>
进入Nginx容器
$ kubectl exec -it vol-emp-demo -c nginx bashroot@vol-emp-demo:/# cd /usr/share/nginx/html/
在容器中执行
root@vol-emp-demo:/usr/share/nginx/html# date >> index.htmlroot@vol-emp-demo:/usr/share/nginx/html# cat index.htmlThu Jul 8 17:02:43 UTC 2021
busybox 看到index.html
$ kubectl exec -it vol-emp-demo -c alpine sh/ # cd /data//data # lsindex.html/data # cat index.htmlThu Jul 8 17:02:43 UTC 2021
写入数据
/data # echo "helloworld" >> index.html/data # date >> index.html/data # cat index.htmlThu Jul 8 17:02:43 UTC 2021helloworldThu Jul 8 17:05:46 UTC 2021
安装curl 或者直接使用wget
apk --update add curl
显示结果如下
# wget -q localhost -O-Thu Jul 8 17:02:43 UTC 2021helloworldThu Jul 8 17:05:46 UTC 2021# curl localhostThu Jul 8 17:02:43 UTC 2021helloworldThu Jul 8 17:05:46 UTC 2021
