kubernetes-Volumes

一:简介

Volume是对各种存储资源的抽象、虚拟化。为管理、控制、使用存储资源提供统一接口。如Openstack中的volume为虚拟机提供存储,而Docker中的volume为容器提供存储。

Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用 程序带来一些问题。问题之一是当容器崩溃时文件丢失。kubelet 会重新启动容器, 但容器会以干净的状态重启。 第二个问题会在同一 Pod中运行多个容器并共享文件时出现。 Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题。

Docker 也有 卷(Volume) 的概念,但对它只有少量且松散的管理。 Docker 卷是磁盘上或者另外一个容器内的一个目录。 Docker 提供卷驱动程序,但是其功能非常有限。

Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 因此,卷的存在时间会超出 Pod 中运行的所有容器,并且在容器重新启动时数据也会得到保留。 当 Pod 不再存在时,卷也将不再存在。

卷的核心是包含一些数据的一个目录,Pod 中的容器可以访问该目录。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放 的内容。

使用卷时, 在 .spec.volumes字段中设置为 Pod 提供的卷,并在.spec.containers[*].volumeMounts字段中声明卷在容器中的挂载位置。 容器中的进程看到的是由它们的 Docker 镜像和卷组成的文件系统视图。 Docker 镜像 位于文件系统层次结构的根部。各个卷则挂载在镜像内的指定路径上。 卷不能挂载到其他卷之上,也不能与其他卷有硬链接。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。

二:kubernetes中的卷

1.awsElasticBlockStore
awsElasticBlockStore卷将 Amazon Web服务(AWS)EBS 卷 挂载到你的 Pod 中。与emptyDir在 Pod 被删除时也被删除不同,EBS 卷的内容在删除 Pod 时 会被保留,卷只是被卸载掉了。 这意味着 EBS 卷可以预先填充数据,并且该数据可以在 Pod 之间共享。
你在使用 EBS 卷之前必须使用aws ec2 create-volume命令或者 AWS API 创建该卷。
限制:

1.Pod 运行所在的节点必须是 AWS EC2 实例。
2.这些实例需要与 EBS 卷在相同的地域(Region)和可用区Availability-Zone。
3.EBS 卷只支持被挂载到单个 EC2 实例上。

1).创建 EBS 卷

aws ec2 create-volume --availability-zone=eu-west-1a --size=10 --volume-type=gp2

2).AWS EBS 配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-ebs
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-ebs
      name: test-volume
  volumes:
  - name: test-volume
    # 此 AWS EBS 卷必须已经存在
    awsElasticBlockStore:
      volumeID: "<volume-id>"
      fsType: ext4

2.azureDisk
azureDisk卷类型用来在 Pod 上挂载 Microsoft Azure 数据盘(Data Disk) 。

详细使用官方链接:
https://github.com/kubernetes/examples/blob/master/staging/volumes/azure_disk/README.md

3.azureFile
azureFile 卷类型用来在 Pod 上挂载 Microsoft Azure 文件卷(File Volume)(SMB 2.1 和 3.0)。

详细使用官方链接:
https://github.com/kubernetes/examples/blob/master/staging/volumes/azure_file/README.md

4.cephfs
cephfs卷允许你将现存的 CephFS 卷挂载到 Pod 中。 不像emptyDir那样会在 Pod 被删除的同时也会被删除,cephfs卷的内容在 Pod 被删除 时会被保留,只是卷被卸载了。这意味着 cephfs 卷可以被预先填充数据,且这些数据可以在 Pod 之间共享。同一cephfs卷可同时被多个写者挂载。

详细使用官方链接:
https://github.com/kubernetes/examples/tree/master/volumes/cephfs/

5.cinder
Kubernetes 必须配置了 OpenStack Cloud Provider;cinder卷类型用于将 OpenStack Cinder 卷挂载到 Pod 中。

Cinder 卷示例配置

apiVersion: v1
kind: Pod
metadata:
  name: test-cinder
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-cinder-container
    volumeMounts:
    - mountPath: /test-cinder
      name: test-volume
  volumes:
  - name: test-volume
    # 此 OpenStack 卷必须已经存在
    cinder:
      volumeID: "<volume-id>"
      fsType: ext4

6.configMap
configMap 卷 提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap类型的卷引用,然后被 Pod 中运行的 容器化应用使用。

引用 configMap 对象时,你可以在 volume 中通过它的名称来引用。 你可以自定义 ConfigMap 中特定条目所要使用的路径。 下面的配置显示了如何将名为log-config 的 ConfigMap 挂载到名为configmap-pod的 Pod 中:

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

log-configConfigMap 以卷的形式挂载,并且存储在log_level条目中的所有内容 都被挂载到 Pod 的/etc/config/log_level 路径下。 请注意,这个路径来源于卷的mountPath和 log_level键对应的path
注意:
1.在使用 ConfigMap 之前你首先要创建它。
2.容器以 subPath 卷挂载方式使用 ConfigMap 时,将无法接收 ConfigMap 的更新。
3.文本数据挂载成文件时采用 UTF-8 字符编码。如果使用其他字符编码形式,可使用binaryData字段。

7.downwardAPI
downwardAPI卷用于使 downward API 数据对应用程序可用。 这种卷类型挂载一个目录并在纯文本文件中写入所请求的数据。

说明: 容器以 subPath 卷挂载方式使用 downwardAPI 时,将不能接收到它的更新。

8.emptyDir
当 Pod 分派到某个 Node 上时,emptyDir卷会被创建,并且在 Pod 在该节点上运行期间,卷一直存在。 就像其名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载emptyDir,卷的路径可能相同也可能不同,这些容器都可以读写emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。

  • 1.用途
    1.缓存空间,例如基于磁盘的归并排序。
    2.为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
    3.在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

  • 2.emptyDir 配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

9.glusterfs
glusterfs卷能将 Glusterfs (一个开源的网络文件系统) 挂载到你的 Pod 中。不像emptyDir那样会在删除 Pod 的同时也会被删除,glusterfs卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着glusterfs卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。 GlusterFS 可以被多个写者同时挂载。

使用参考官方文档:
https://github.com/kubernetes/examples/tree/master/volumes/glusterfs

10.hostPath
hostPath卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱

  • 1.用法
    1.运行一个需要访问 Docker 内部机制的容器;可使用hostPath挂载/var/lib/docker路径。
    2.在容器中运行 cAdvisor 时,以hostPath方式挂载/sys
    3.允许 Pod 指定给定的hostPath在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
    在这里插入图片描述

除了必需的 path属性之外,用户可以选择性地为hostPath 卷指定type

  • 2.hostPath 配置示例
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # 宿主上目录位置
      path: /data
      # 此字段为可选
      type: Directory

  • 3.案例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-tomcat-1
  labels:
    app: tomcat-1

spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat-1
  template:
    metadata:
      labels:
        app: tomcat-1
    spec:
      containers:
      - name: tomcat-1
        image: daocloud.io/library/tomcat:8-jdk8
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        volumeMounts:
        - mountPath: /usr/local/tomcat/webapps
          name: xingdian
      volumes:
      - name: xingdian
        hostPath: 
          path: /opt/apps/web 
          type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service-1
  labels:
    app: tomcat-1
spec:
  type: NodePort
  ports:
  - port: 888
    targetPort: 8080
    nodePort: 30021
  selector:
    app: tomcat-1
  • 4.特殊用法

FileOrCreate模式不会负责创建文件的父目录。 如果欲挂载的文件的父目录不存在,Pod 启动会失败。 为了确保这种模式能够工作,可以尝试把文件和它对应的目录分开挂载,如 FileOrCreate 配置 所示。
hostPath FileOrCreate 配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: k8s.gcr.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/local/aaa
      name: mydir
    - mountPath: /var/local/aaa/1.txt
      name: myfile
  volumes:
  - name: mydir
    hostPath:
      # 确保文件所在目录成功创建。
      path: /var/local/aaa
      type: DirectoryOrCreate
  - name: myfile
    hostPath:
      path: /var/local/aaa/1.txt
      type: FileOrCreate

11.iscsi
iscsi卷能将 iSCSI (基于 IP 的 SCSI) 卷挂载到你的 Pod 中。 不像 emptyDir那样会在删除 Pod 的同时也会被删除,iscsi卷的内容在删除 Pod 时 会被保留,卷只是被卸载。 这意味着 iscsi卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

在使用 iSCSI 卷之前,你必须拥有自己的 iSCSI 服务器,并在上面创建卷。

12.nfs
nfs卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像emptyDir那样会在删除 Pod 的同时也会被删除,nfs卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着nfs卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

官方使用参考文档:
https://github.com/kubernetes/examples/tree/master/staging/volumes/nfs

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐