前言
容器中的文件在磁盘上是长期寄存,容器解体重启后,容器将被以洁净状态重建,解体之前创立的文件将被革除。
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