Container 中的文件在磁盘上是临时存放的
容器运行时存在的问题
- 问题之一是当容器崩溃时文件丢失。 kubelet 会重新启动容器,但容器会以干净的状态重启。
- 第二个问题会在同一 Pod 中运行多个容器并共享文件时出现。
Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题
生命周期
临时卷的生命周期与POD是相同的,但是根据卷的类型,可以有这超过pod的生命周期,比如持久卷,当pod生命周期结束的时候,k8s是会直接清理临时卷的,至于数据的清理策略,取决于yml配置
卷的类型有哪些
- 持久卷
顾名思义,数据长期存储的卷 - 临时卷
临时使用的,随着pod生命周期而结束 - 投射卷
类似 configMap挂载配置文件到指定路径 - 动态制备卷(即PVC那一套管理策略,很常用)
动态分配资源存储空间
k8s卷的设计方案分析
- 卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。
- 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。
- 使用卷时, 在
spec.volumes
字段中设置为 Pod 提供的卷,并在spec.containers[*].volumeMounts
字段中声明卷在容器中的挂载位置。 容器中的进程看到的文件系统视图是由它们的容器镜像的初始内容以及挂载在容器中的卷(如果定义了的话)所组成的。 其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。
卷的应用场景
- 需要持久化存储某些数据
- 需要多个工作负载之间共享某些持久化数据
- 需要一个可靠的存储
常见的使用方案
emptyDir(临时存储卷)
当 Pod 分派到某个节点上时,emptyDir 卷会被创建,并且在 Pod 在该节点上运行期间,卷一直存在。 就像其名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。
说明
容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃期间 emptyDir 卷中的数据是安全的。
用途:
- 缓存空间,例如基于磁盘的归并排序。
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
使用方式
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
hostPath(节点存储卷)
hostPath类型的存储卷是指将工作节点上某个文件系统的目录或文件挂载于Pod中的一种存储卷,它独立于Pod资源的生命周期,因而具有持久性。但它是工作节点本地的存储空间,仅适用于特定情况下的存储卷使用要求。
例如:
- 将工作节点上的文件系统关联为Pod的存储卷,从而使得容器访问节点文件系统上的数据。
- 使用ES或者SOLR的相关的搜索引擎,将数据持久化存储至node的所在磁盘,降低网络存储压力
使用方式
apiVersion: v1
kind: Pod
metadata:
name: test-nginx
spec:
containers:
- name: nginx-demo
image: nginx
volumeMounts:
- mountPath: /var/logs/
name: data-log
#定义hostPath卷名,和宿主机共享的路径
volumes:
- name: data-log
hostPath:
path: /data/logs