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中的数据仍然保持完整。;
nfs: nfs卷允许现有的NFS(网络文件系统)被挂载到你的Pod中,当Pod从节点上删除时,nfs卷中的数据不会被删除,只会被取消挂载;
iscsi: iscsi卷允许现有的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 后,数据仍会保留;
cephfs: cephfs卷允许将现有的 CephFS 卷挂载到你的 pod 中,从节点中删除 Pod 后,数据保持不变;
gitRepo: gitRepo卷挂载了一个空目录,并将一个git仓库克隆到其中,供你的pod使用;
secret: secret卷用于将敏感信息(例如密码)传递给 pod;
persistentVolumeClaim: persistentVolumeClaim卷用于将一个PersistentVolume挂载到一个pod中,PersistentVolumes是一种让用户在不知道特定云环境细节的情况下 "要求 "持久存储(如GCE PersistentDisk或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→ 已经将类型定义为 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 中使用的卷名称。