前言
容器中的文件在磁盘上是临时存放,容器崩溃重启后,容器将被以干净状态重建,崩溃之前创建的文件将被清除。
K8S 使用卷的概念来管理容器生成的需持久化的文件,卷也可用于同一个 Pod 中多个容器之间共享文件。
更新历史
- 20200708 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/07/08/about-storage-volume.html
Volume 的类型
emptyDir 卷
- 容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
- 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
示例
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
persistentVolumeClaim 卷
persistentVolumeClaim 卷用来将持久卷(PersistentVolume)挂载到 Pod 中。
持久卷(PV)是用户在不知道特定云环境细节的情况下"申领"持久存储(例如 NFS 或者 iSCSI 卷)的一种方法。
cephfs 卷
- cephfs 允许您将现存的 CephFS 卷挂载到 Pod 中。
- cephfs 卷的内容在删除 Pod 时会被保留,卷只是被卸载掉了。
- 这意味着 CephFS 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。
- CephFS 卷可同时被多个写者挂载。
configMap 卷
- ConfigMap 资源提供了向 Pod 注入配置数据的方法。
- ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被应用到 Pod 中运行的容器。
- 可以在 volumes 字段中引用 configMap 名称来生成一个卷。
- 可以自定义 ConfigMap 中特定条目所要使用的路径。
- 如果容器以 subPath 卷挂载方式使用 ConfigMap 时,将无法接收 ConfigMap 的更新。
示例
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
spec:
containers:
- name: test
image: busybox
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: log-config
items:
- key: log_level
path: log_level
ConfigMap 中 key log_level 中的内容将被挂载到 Pod 路径 /etc/config/log_level 中
路径由 spec.containers 中参数 volumeMounts.mountpath 和 volumes 中参数 items.path 拼接而成
secret 卷
secret 卷用来给 Pod 传递敏感信息,例如密码。
可以将 secret 存储在 Kubernetes API 服务器上,然后以文件的形式挂在到 Pod 中,实现与 Pod 解耦。
secret 卷由 tmpfs(基于内存的文件系统)提供存储,因此它们永远不会被写入持久化的存储器。
容器以 subPath 卷的方式挂载 Secret 时,它将无法实时获取 Secret 的更新。
nfs 卷
nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。
不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。
这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。
hostPath 卷
hostPath 卷能将主机节点文件系统上的文件或目录挂载到 Pod 中。
当 Pod 漂移到其他节点后,数据无法复用,仅适用于开发和测试环境。
使用 subPath
引用卷的时候,默认会将卷的根目录挂载到指定路径中。
可以通过 subPath 挂载卷的子目录,而不是根目录。
示例
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
将挂载 site-data 卷的子目录 mysql 到容器目录 /var/lib/mysql 中
资源限制
emptyDir、hostPath 卷可以消耗的磁盘资源不受限制,就是说可能会写满磁盘。
结束语
卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。
使用卷时, Pod 声明中需要提供卷的类型 (.spec.volumes)和卷挂载的位置 (.spec.containers.volumeMounts)。
容器中的进程能看到由它们的 Docker 镜像和卷组成的文件系统视图。
Docker 镜像位于文件系统层次结构的根部,并且任何 Volume 都挂载在镜像内的指定路径上。
卷不能挂载到其他卷,也不能与其他卷有硬链接。
联系我
微信公众号:zuolinux_com