Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。本文主要介绍Kubernetes(K8s) Volume(存储卷)。

1、Kubernetes(K8s) Volume(存储卷)

在Kubernetes中,Volume(存储卷)可以被看作是一个目录,可以被pod中的容器访问。我们在Kubernetes中有不同类型的Volume(存储卷),该类型定义了如何创建Volume(存储卷)及其内容。

Docker的Volume(存储卷)概念是存在的,但唯一的问题是Volume(存储卷)非常局限于一个特定的Pod。当一个Pod的生命周期结束时,Volume(存储卷)也消失了。另一方面,通过Kubernetes创建的Volume(存储卷)并不局限于任何容器。它支持任何或所有部署在Kubernetes Pod的容器。Kubernetes Volume(存储卷)的一个关键优势是,它支持不同类型的存储,其中Pod可以在同一时间使用多个。

2、Kubernetes(K8s) Volume 类型

1)emptyDir

emptyDir是一种Volume(存储卷)类型,在第一次将Pod分配给Node时创建。只要Pod在该节点上运行,它就一直处于活动状态。Volume(存储卷)最初是空的,Pod中的容器可以读写emptyDir卷中的文件。一旦Pod从节点中删除,emptyDir中的数据就会被删除。

2)hostPath

hostPath这种类型的Volume(存储卷)将一个文件或目录从主机节点的文件系统挂载到指定的pod中。

3)gcePersistentDisk

gcePersistentDisk这种类型的Volume(存储卷)挂载谷歌计算引擎(GCE)持久磁盘到指定的Pod。当Pod从节点中移除时,gcePersistentDisk中的数据保持不变。

4)awsElasticBlockStore

awsElasticBlockStore这种类型的Volume(存储卷)挂载一个亚马逊网络服务(AWS)弹性块存储到指定的Pod。就像gcePersistentDisk一样,awsElasticBlockStore中的数据在Pod从节点中移除时保持不变。

5)nfs

nfs Volume(存储卷)允许将现有的nfs(网络文件系统)挂载到指定的Pod中。从节点上移除Pod时,nfs Volume(存储卷)中的数据不会被擦除。Volume(存储卷)只被卸载。

6)iscsi

iscsi Volume(存储卷)允许一个现有的iscsi (SCSI over IP) Volume(存储卷)被挂载到指定的pod中。

7)flocker

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

8)glusterfs

Glusterfs是一个开源的网络文件系统。一个glusterfs卷允许一个glusterfs卷被安装到指定的Pod。

9)rbd

RBD代表Rados块设备。rbd Volume(存储卷)允许Rados块设备卷被安装到指定的pod中。移除Pod后,节点上的数据将保持不变。

10)cephfs

cephfs Volume(存储卷)允许将现有的cephfs Volume(存储卷)安装到指定的pod中。将Pod从节点中移除后,数据不会丢失。

11)gitRepo

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

12)secret

secret Volume(存储卷)用于将敏感信息(如密码)传递到pod中。

13)persistentVolumeClaim

persistentVolumeClaim Volume(存储卷)用于将PersistentVolume挂载到pod中。PersistentVolumes是用户在不知道特定云环境细节的情况下 "claim" 持久存储(例如GCE PersistentDisk或iSCSI卷)的一种方式。

14)downwardAPI

downwardAPI Volume(存储卷)用于向应用程序提供向下API数据。它挂载一个目录,并将请求的数据写入纯文本文件。

15)azureDiskVolume

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

2、Volume常用操作

Persistent Volume (PV) 是由管理员提供的网络存储的一部分。它是集群中的一种资源,独立于使用PV的任何单独的pod。Kubernetes为其Pod要求的存储被称为Persistent Volume Claim (PVC) 。用户不需要知道底层供应。声明必须在创建pod的同一个名称空间中创建。

1)创建PV

kind: PersistentVolume
apiVersion: v1
metadata:
   name: pv0001
   labels:
      type: local
spec:
   capacity:
      storage: 10Gi
   accessModes:
      - ReadWriteOnce
      hostPath:
         path: "/tmp/data01" 

说明:

kind: PersistentVolume 

定义了类型为PersistentVolume,表示kubernetes

使用yaml文件创建持久卷。

name: pv0001 

创建PersistentVolume的名称

capacity: 

将定义要创建的PV容量。

storage:10Gi 

定义的路径上要求10Gi空间。

ReadWriteOnce 

正在创建的Volume(存储卷)的访问权限

path:

/tmp/data01 

在这个路径下创建Volume(存储卷)基础设施。

创建命令:

$ kubectl create –f local-01.yaml

2)检测PV

$ kubectl get pv

3)查看PV

$ kubectl describe pv pv0001

4)创建PVC

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

说明:

kind: PersistentVolumeClaim 

它指示声明的底层基础结构指定数量的空间。

name: myclaim-1 

创建claim的名称

ReadWriteOnce 

创建的claim的模式。

5)创建PVC

$ kubectl create –f myclaim-1

6)获取PVC

$ kubectl get pvc

7)查看PVC

$ kubectl describe pv pv0001

8)使用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: 
      - mountPath: "/usr/share/tomcat/html"
         name: mypd
   volumes: 
      - name: mypd
         persistentVolumeClaim: 
         claimName: myclaim-1

说明:

volumeMounts: 

容器中将在其上进行安装的路径。

Volume: 

要定义Volume(存储卷)的声明。

persistentVolumeClaim: 

定义在pod中使用的Volume(存储卷)名。

相关文档:

Kubernetes(K8s) kubectl get 常用命令

Kubernetes(K8s) kubectl describe常用命令

Kubernetes(K8s) kubectl create常用命令

Kubernetes(K8s) kubectl replace常用命令

Kubernetes(K8s) kubectl patch常用命令

Kubernetes(K8s) kubectl edit 常用命令

Kubernetes(K8s) kubectl delete 常用命令

Kubernetes(K8s) kubectl apply 常用命令

Kubernetes(K8s) kubectl logs 常用命令

推荐文档