Kubernetes - 卷

在 Kubernetes 中,可以将卷视为 pod 中的容器可以访问的目录。 我们在 Kubernetes 中有不同类型的卷,类型定义了卷的创建方式及其内容。

Docker 中存在卷的概念,但唯一的问题是卷非常受限于特定的 pod。 pod 的生命周期一结束,volume 也会丢失。

另一方面,通过 Kubernetes 创建的卷不限于任何容器。 它支持部署在 Kubernetes 的 pod 内的任何或所有容器。 Kubernetes 卷的一个关键优势是,它支持不同类型的存储,其中 pod 可以同时使用多个。

Kubernetes 卷的类型

这里是一些流行的 Kubernetes 卷的列表 −

  • emptyDir − 它是一种在 Pod 首次分配给 Node 时创建的卷。 只要 Pod 在该节点上运行,它就会保持活动状态。 卷最初是空的,pod 中的容器可以读取和写入 emptyDir 卷中的文件。 一旦 Pod 从节点中移除,emptyDir 中的数据就会被擦除。

  • hostPath − 这种类型的卷将文件或目录从主机节点的文件系统挂载到您的 pod 中。

  • gcePersistentDisk − 这种类型的卷将 Google Compute Engine (GCE) Persistent Disk 挂载到您的 Pod 中。 当 Pod 从节点中移除时,gcePersistentDisk 中的数据保持不变。

  • awsElasticBlockStore − 这种类型的卷将 Amazon Web Services (AWS) 弹性块存储安装到您的 Pod 中。 与 gcePersistentDisk 一样,当 Pod 从节点中移除时,awsElasticBlockStore 中的数据保持不变。

  • nfsnfs 卷允许将现有的 NFS(网络文件系统)挂载到您的 pod 中。 当 Pod 从节点中移除时,nfs 卷中的数据不会被擦除。 卷只是卸载。

  • iscsiiscsi 卷允许将现有 iSCSI(基于 IP 的 SCSI)卷挂载到您的 pod 中。

  • flocker − 它是一个开源的集群容器数据卷管理器。 它用于管理数据量。 flocker 卷允许将 Flocker 数据集挂载到 pod 中。 如果数据集在 Flocker 中不存在,那么您首先需要使用 Flocker API 创建它。

  • glusterfs − Glusterfs 是一个开源的网络文件系统。 glusterfs 卷允许将 glusterfs 卷挂载到您的 pod 中。

  • rbd − RBD 代表 Rados 块设备。 rbd 卷允许将 Rados 块设备卷挂载到您的 pod 中。 从节点移除 Pod 后,数据仍然保留。

  • cephfscephfs 卷允许将现有的 CephFS 卷挂载到您的 pod 中。 Pod 从节点中移除后数据保持不变。

  • gitRepogitRepo 卷挂载一个空目录并将 git 存储库克隆到其中供您的 pod 使用。

  • secretsecret 卷用于将敏感信息(例如密码)传递给 pod。

  • persistentVolumeClaimpersistentVolumeClaim 卷用于将 PersistentVolume 挂载到 pod 中。 PersistentVolume 是用户在不了解特定云环境详细信息的情况下"声明"持久存储(例如 GCE PersistentDisk 或 iSCSI 卷)的一种方式。

  • downwardAPIdownwardAPI 卷用于向应用程序提供向下 API 数据。 它挂载一个目录并将请求的数据写入纯文本文件。

  • azureDiskVolumeAzureDiskVolume 用于将 Microsoft Azure 数据磁盘挂载到 Pod 中。


持久卷和持久卷声明

持久卷 (PV) − 它是由管理员配置的一块网络存储。 它是集群中的一个资源,独立于任何使用 PV 的单个 pod。

持久卷声明 (PVC) − Kubernetes 为其 pod 请求的存储称为 PVC。 用户不需要知道底层配置。 声明必须在创建 pod 的同一命名空间中创建。

创建持久卷

kind: PersistentVolume ---------> 1
apiVersion: v1
metadata:
   name: pv0001 ------------------> 2
   labels:
      type: local
spec:
   capacity: -----------------------> 3
      storage: 10Gi ----------------------> 4
   accessModes:
      - ReadWriteOnce -------------------> 5
      hostPath:
         path: "/tmp/data01" --------------------------> 6

在上面的代码中,我们定义了 −

  • kind: PersistentVolume → 我们将类型定义为 PersistentVolume,它告诉 kubernetes 正在使用的 yaml 文件是用于创建 Persistent Volume。

  • name: pv0001 → 我们正在创建的 PersistentVolume 的名称。

  • capacity: → 该规范将定义我们尝试创建的 PV 容量。

  • storage: 10Gi → 这告诉底层基础设施我们正在尝试在定义的路径上申请 10Gi 空间。

  • ReadWriteOnce → 这告诉我们正在创建的卷的访问权限。

  • path: "/tmp/data01" → 这个定义告诉机器我们正在尝试在底层基础设施的这个路径下创建卷。

创建 PV

$ kubectl create –f local-01.yaml
persistentvolume "pv0001" created

检查 PV

$ kubectl get pv
NAME        CAPACITY      ACCESSMODES       STATUS       CLAIM      REASON     AGE
pv0001        10Gi            RWO         Available                            14s

描述 PV

$ kubectl describe pv pv0001

创建持久卷声明

kind: PersistentVolumeClaim --------------> 1
apiVersion: v1
metadata:
   name: myclaim-1 --------------------> 2
spec:
   accessModes:
      - ReadWriteOnce ------------------------> 3
   resources:
      requests:
         storage: 3Gi ---------------------> 4

在上面的代码中,我们定义了 −

  • kind: PersistentVolumeClaim → 它指示底层基础架构我们正在尝试申请指定数量的空间。

  • name: myclaim-1 → 我们正在尝试创建的声明的名称。

  • ReadWriteOnce → 这指定了我们尝试创建的声明的模式。

  • storage: 3Gi → 这将告诉 kubernetes 我们试图声明的空间量。

创建 PVC

$ kubectl create –f myclaim-1
persistentvolumeclaim "myclaim-1" created

获取有关 PVC 的详细信息

$ kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESSMODES   AGE
myclaim-1   Bound    pv0001     10Gi         RWO       7s

描述 PVC

$ kubectl describe pv pv0001

通过 POD 使用 PV 和 PVC

kind: Pod
apiVersion: v1
metadata:
   name: mypod
   labels:
      name: frontendhttp
spec:
   containers:
   - name: myfrontend
      image: nginx
      ports:
      - containerPort: 80
         name: "http-server"
      volumeMounts: ----------------------------> 1
      - mountPath: "/usr/share/tomcat/html"
         name: mypd
   volumes: -----------------------> 2
      - name: mypd
         persistentVolumeClaim: ------------------------->3
         claimName: myclaim-1

在上面的代码中,我们定义了 −

  • volumeMounts: → 这是容器中将进行安装的路径。

  • Volume: → 这个定义定义了我们要声明的卷定义。

  • persistentVolumeClaim: → 在此之下,我们定义了将在定义的 pod 中使用的卷名。