Kubernetes 卷


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

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

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

Kubernetes 卷的类型

以下是一些流行的 Kubernetes Volumes 列表:

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

  • hostPath: 这种类型的卷将主机节点文件系统中的文件或目录挂载到你的 pod 中;

  • gcePersistentDisk : 这种类型的卷将谷歌计算引擎(GCE)的持久性磁盘挂载到你的Pod中,gcePersistentDisk中的数据在Pod从节点上移走时仍然保持不变;

  • awsElasticBlockStore: 这种类型的卷将亚马逊网络服务(AWS)的弹性块存储安装到你的Pod中,就像gcePersistentDisk一样,当Pod从节点上移走时,awsElasticBlockStore中的数据仍然保持完整。;

  • nfsnfs卷允许现有的NFS(网络文件系统)被挂载到你的Pod中,当Pod从节点上删除时,nfs卷中的数据不会被删除,只会被取消挂载;

  • iscsiiscsi卷允许现有的iSCSI(SCSI over IP)卷被安装到pod中;

  • flocker:  它是一个开源的集群式容器数据卷管理器,用于管理数据卷,Flocker卷允许Flocker数据集被挂载到一个pod中,如果数据集在Flocker中不存在,那么首先需要通过使用Flocker API来创建它;

  • glusterfs: Glusterfs 是一个开源的网络文件系统,glusterfs 卷允许将 glusterfs 卷挂载到你的 pod 中;

  • rbd: RBD 代表 Rados Block Device,rbd卷允许将 Rados 块设备卷安装到 pod 中,从节点中删除 Pod 后,数据仍会保留;

  • cephfscephfs卷允许将现有的 CephFS 卷挂载到你的 pod 中,从节点中删除 Pod 后,数据保持不变;

  • gitRepogitRepo卷挂载了一个空目录,并将一个git仓库克隆到其中,供你的pod使用;

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

  • persistentVolumeClaimpersistentVolumeClaim卷用于将一个PersistentVolume挂载到一个pod中,PersistentVolumes是一种让用户在不知道特定云环境细节的情况下 "要求 "持久存储(如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

创建持久卷声明PVC

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