前言

容器中的文件在磁盘上是临时存放,容器崩溃重启后,容器将被以干净状态重建,崩溃之前创建的文件将被清除。

K8S 使用卷的概念来管理容器生成的需持久化的文件,卷也可用于同一个 Pod 中多个容器之间共享文件。

更新历史

Volume 的类型

emptyDir 卷

  1. 容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
  2. 当 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 卷

  1. cephfs 允许您将现存的 CephFS 卷挂载到 Pod 中。
  2. cephfs 卷的内容在删除 Pod 时会被保留,卷只是被卸载掉了。
  3. 这意味着 CephFS 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递”。
  4. CephFS 卷可同时被多个写者挂载。

configMap 卷

  1. ConfigMap 资源提供了向 Pod 注入配置数据的方法。
  2. ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被应用到 Pod 中运行的容器。
  3. 可以在 volumes 字段中引用 configMap 名称来生成一个卷。
  4. 可以自定义 ConfigMap 中特定条目所要使用的路径。
  5. 如果容器以 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

微信扫码关注