乐趣区

关于k8s:K8S实战十五-存储卷概念

前言

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

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

更新历史

  • 20200708 – 初稿 – 左程立
  • 原文地址 – https://blog.zuolinux.com/2020/07/08/about-storage-volume.html

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

退出移动版