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 常用命令