K8S实战(十五)| 存储卷概念

前言

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

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

更新历史

Volume 的类型

emptyDir 卷

  1. 容器崩溃并不会致使 Pod 被从节点上移除,所以容器崩溃时 emptyDir 卷中的数据是安全的。
  2. 当 Pod 由于某些缘由被从节点上删除时,emptyDir 卷中的数据也会永久删除。

示例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 卷

persistentVolumeClaim 卷用来将持久卷(PersistentVolume)挂载到 Pod 中。
持久卷(PV)是用户在不知道特定云环境细节的状况下"申领"持久存储(例如 NFS 或者 iSCSI 卷)的一种方法。nginx

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 的更新。

示例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 卷

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

微信扫码关注

相关文章
相关标签/搜索