容器中的文件在磁盘上是临时存放,容器崩溃重启后,容器将被以干净状态重建,崩溃以前建立的文件将被清除。html
K8S 使用卷的概念来管理容器生成的需持久化的文件,卷也可用于同一个 Pod 中多个容器之间共享文件。mysql
示例linux
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 卷用来将持久卷(PersistentVolume)挂载到 Pod 中。
持久卷(PV)是用户在不知道特定云环境细节的状况下"申领"持久存储(例如 NFS 或者 iSCSI 卷)的一种方法。nginx
示例sql
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 中api
路径由 spec.containers 中参数 volumeMounts.mountpath 和 volumes 中参数 items.path 拼接而成安全
secret 卷用来给 Pod 传递敏感信息,例如密码。服务器
能够将 secret 存储在 Kubernetes API 服务器上,而后以文件的形式挂在到 Pod 中,实现与 Pod 解耦。微信
secret 卷由 tmpfs(基于内存的文件系统)提供存储,所以它们永远不会被写入持久化的存储器。网络
容器以 subPath 卷的方式挂载 Secret 时,它将没法实时获取 Secret 的更新。
nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。
不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。
这意味着 nfs 卷能够被预先填充数据,而且这些数据能够在 Pod 之间"传递"。
hostPath 卷能将主机节点文件系统上的文件或目录挂载到 Pod 中。
当 Pod 漂移到其余节点后,数据没法复用,仅适用于开发和测试环境。
引用卷的时候,默认会将卷的根目录挂载到指定路径中。
能够经过 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