Kubernetes(K8S) 卷(Volume)

  • Kubernetes 卷(Volumes)

    在Kubernetes中,可以将卷视为目录,容器中的容器可以访问该目录。Kubernetes中有不同类型的卷,并且该类型定义了卷的创建方式及其内容。
    卷的概念存在于Docker中,但是唯一的问题是卷非常受限于特定的Pod。Pod的使用寿命一结束,卷也随之丢失。
    另一方面,通过Kubernetes创建的卷不限于任何容器。它支持Kubernetes容器内部署的任何或所有容器。Kubernetes卷的主要优势在于,它支持不同类型的存储,其中Pod可以同时使用多个存储。
  • Kubernetes卷的类型

    这是一些流行的Kubernetes卷的列表-
    • emptyDir - 这是在将Pod首次分配给节点时创建的一种卷。只要Pod在该节点上运行,它就保持活动状态。该卷最初是空的,并且容器中的容器可以读取和写入emptyDir卷中的文件。从节点中删除Pod后,将清空emptyDir中的数据。
    • hostPath - 这种类型的卷将文件或目录从主机节点的文件系统挂载到您的Pod中。
    • gcePersistentDisk - 这种类型的卷将Google Compute Engine(GCE)永久磁盘安装到Pod中。从节点中删除Pod后,gcePersistentDisk中的数据将保持不变。
    • awsElasticBlockStore - 这种类型的卷将Amazon Web Services(AWS)弹性块存储装载到Pod中。就像gcePersistentDisk,在一个数据awsElasticBlockStore当POD从节点取出保持不变。
    • nfs - nfs卷允许将现有的NFS(网络文件系统)安装到您的Pod中。从节点中删除Pod时,不会擦除nfs卷中的数据。该卷仅被卸载。
    • iscsi - iscsi卷允许将现有的iSCSI(IP上的SCSI)卷安装到Pod中。
    • flocker - 这是一个开源集群容器数据卷管理器。它用于管理数据量。甲flocker体积允许Flocker数据集将被安装到吊舱。如果数据集在Flocker中不存在,那么您首先需要使用Flocker API创建它。
    • glusterfs - Glusterfs是一个开放源代码的网络文件系统。glusterfs体积允许将glusterfs体积安装到您的吊舱中。
    • rbd - RBD代表Rados Block Device。一个RBD量允许拉多什块设备的体积被安装到您的吊舱。从节点中删除Pod后,数据仍保留。
    • cephfs - cephfs卷允许将现有的CephFS卷挂载到您的Pod中。从节点中删除Pod后,数据将保持不变。
    • gitRepo - gitRepo卷挂载一个空目录,并将git存储库克隆到其中,以供您的pod使用。
    • secret - secret卷用于将敏感信息(例如密码)传递到Pod。
    • persistentVolumeClaim - persistentVolumeClaim卷用于一个PersistentVolume安装到容器。PersistentVolume是用户“声明”持久存储(例如GCE PersistentDisk或iSCSI卷)的一种方式,而无需了解特定云环境的详细信息。
    • DownwardAPI - DownwardAPI卷用于使向下API数据可供应用程序使用。它安装目录,并将请求的数据写入纯文本文件。
    • azureDiskVolume - AzureDiskVolume用于将Microsoft Azure数据磁盘安装到Pod中。
  • 持久量和持久量声明

    永久卷(PV) -这是由管理员提供的一部分网络存储。它是群集中的一种资源,它独立于使用PV的任何单个容器。
    持久体积声明(PVC) -Kubernetes请求为其Pod分配的存储称为PVC。用户不需要知道基础供应。必须在创建容器的相同名称空间中创建声明。
    创建持久卷
    
    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文件是用于创建持久卷的。
    • 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: →这是容器中将要进行安装的路径。
    • volumes: →此定义定义了我们要声明的体积定义。
    • persistentVolumeClaim: →在此之下,我们定义将在定义的pod中使用的卷名。