Kubernetes - 卷



在 Kubernetes 中,卷可以被认为是一个目录,Pod 中的容器可以访问该目录。Kubernetes 中有不同类型的卷,并且类型定义了卷是如何创建的以及其内容。

卷的概念在 Docker 中就已经存在,但唯一的问题是卷非常局限于特定的 Pod。一旦 Pod 的生命周期结束,卷也会丢失。

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

Kubernetes 卷的类型

以下是 Kubernetes 卷的一些常用类型:

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

  • hostPath - 此类型的卷将主机节点文件系统中的文件或目录挂载到 Pod 中。

  • gcePersistentDisk - 此类型的卷将 Google Compute Engine (GCE) 持久性磁盘挂载到 Pod 中。当 Pod 从节点中移除时,gcePersistentDisk 中的数据保持不变。

  • awsElasticBlockStore - 此类型的卷将 Amazon Web Services (AWS) Elastic Block Store 挂载到 Pod 中。与 gcePersistentDisk 一样,当 Pod 从节点中移除时,awsElasticBlockStore 中的数据保持不变。

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

  • iscsi - iscsi 卷允许将现有的 iSCSI(IP 上的 SCSI)卷挂载到 Pod 中。

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

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

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

  • cephfs - cephfs 卷允许将现有的 CephFS 卷挂载到 Pod 中。当 Pod 从节点中移除后,数据保持不变。

  • gitRepo - gitRepo 卷挂载一个空目录,并将 git 存储库克隆到其中,供 Pod 使用。

  • secret - secret 卷用于将敏感信息(例如密码)传递给 Pod。

  • persistentVolumeClaim - persistentVolumeClaim 卷用于将 PersistentVolume 挂载到 Pod 中。PersistentVolume 是一种允许用户“声明”持久性存储(例如 GCE 持久性磁盘或 iSCSI 卷)而不必了解特定云环境的详细信息的方法。

  • downwardAPI - downwardAPI 卷用于使下行 API 数据可供应用程序使用。它挂载一个目录并在纯文本文件中写入请求的数据。

  • azureDiskVolume - AzureDiskVolume 用于将 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 → 我们将 kind 定义为 PersistentVolume,这告诉 Kubernetes 正在使用的 yaml 文件用于创建持久卷。

  • name: pv0001 → 我们要创建的持久卷的名称。

  • 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

将 PV 和 PVC 与 POD 一起使用

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 中使用的卷名称。

广告