:属于Pod的一部分,和Pod共享相同的生命周期

1)若Pod包含多个容器,则多个容器可共享Pod的卷;

2)若Pod内的容器需共享卷,可通过VolumeMount字段实现;

3)单个容器可同时使用多种不同类型的卷;


卷有以下8种类型:

(1)emptyDir:用于存储临时数据的简单空目录;

1)所有其他类型的卷都是基于emptyDir的基础上构建;

2)本质是在同一Pod内的容器共享部分数据;


(2)gitRepo:通过Git仓库的内容初始化卷;

1)本质是基于emptyDir的基础上,填充Git仓库的内容;


(3)hostPath:用于将目录从Node节点的文件系统挂载到Pod中;

1)本质是同一Node节点的Pod共享部分数据,且将数据保存在节点上;

2)当Pod被删除时,保存于节点的数据仍被保留;

3)常用于系统服务相关的数据(如:节点日志、CA证书和节点配置文件等)


(4)nfs:挂载到Pod中的NFS共享卷;


(5)configMap:用于配置容器的卷;


(6)secret:用于传输私密信息的卷;


(7)downwardAPI:用于和API服务器交互的卷;


(8)persistentVolumeClaim:预置或动态配置的持久存储的卷

功能卷

emptyDir

emptyDir:可共享且为空的卷

1)其他类型卷的Pod部分定义和emptyDir是相同的


创建带有emptyDir类型卷的Pod格式:

apivVersion: V1
kind: Pod
metadata:
  Pod元数据
spec:
  containers:
   - image: 容器1基于的镜像
     name: 容器1的名称
     volumeMounts:
     - name: 被挂载卷的名称
       mountPath: 容器内卷的挂载路径
       readonly: true或false
   - image: 容器N基于的镜像
     name: 容器N的名称
     volumeMounts:
     - name: 被挂载卷的名称
       mountPath: 容器内卷的挂载路径
       readonly: true或false
volumes:
 - name: 卷的名称1
   emptyDir: 卷的其他配置
 - name: 卷的名称N
   emptyDir: 卷的其他配置

(1)若卷无其他配置,则使用“{}”代替

1)若设置“medium: Memory”,则数据存储与内存(默认为硬盘);


如:创建带有emptyDir类型卷的Pod

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成Pod,并验证
在这里插入图片描述
3)访问8080端口验证
在这里插入图片描述

gitRepo

gitRepo:在Pod启动时,根据Git仓库填充数据

1)基于emptyDir卷;

2)填充数据前,会检测Pod相关信息(如:版本);

3)Git仓库中更新文件时,不会将已存在的Pod的卷更新文件

//若更新版本的Pod,则需手动删除Pod(前提由类似RS管理)


如:gitRepo工作流程
在这里插入图片描述


创建带有gitRepo类型卷的Pod格式:

volumes:
 - name: 卷名称
   gitRepo:
   repository: Git仓库的网站
   revision:  master
   directory: 数据填充路径

(1)gitRepo是基于emptyDir实现的,所以Pod部分的定义是相同的;


(2)directory字段指定的是相对于卷的路径,数据填充的路径;

1)若不指定数据填充路径,默认以URL的最后一段字符串作为路径;


如:创建带有emptyDir类型卷的Pod

1)编写Yaml文件
在这里插入图片描述
2)调用create命令生成Pod,并验证
在这里插入图片描述

hostPath

hostPath:利用节点上的目录存储/共享Pod的数据,实现持久化存储

1)不能用于跨节点的Pod持久化存储

//同一节点创建的Pod,才可存储/共享该节点的数据


如:将节点的目录挂载至Pod
在这里插入图片描述


创建带有hostPath卷的Pod格式:

volumes:
 - name: 卷名称
   hostPath:
   path: 节点路径
   type: 类型

如:查看一个已有的系统服务相关hostPath配置
在这里插入图片描述

持久化存储

Kubernetes集群通过持久卷资源和持久卷声明资源实现持久化存储

1)避免基础设施的细节问题,同时保证正常请求存储资源


如:持久卷和持久卷声明的工作流程
在这里插入图片描述


持久卷(PersistentVolume,PV)

1)配置底层存储真实卷的大小和所支持的访问模式;

2)配置完成后,通过Kubernetes API服务器创建持久卷并注册(已创建);

3)持久卷不属于任何命名空间(集群层面的资源);


持久卷声明(PersistentVolumeClaim,PVC)

1)指定所需的最低容量和访问模式;

2)将指定清单提交至Kubernetes API服务器;

3)Kubernetes将找到匹配的持久卷,并将其和持久卷声明绑定(可使用);

//若匹配不成功,PVC将会被挂起(直至有PV匹配成功)

4)当持久卷声明被Pod当成卷使用时,其他Pod就不能再使用该持久卷;

//若删除该Pod的持久卷说明,则其他Pod就可使用(释放持久卷)

5)持久卷声明只能被同一命名空间内的Pod所使用


如:命名空间、节点、PV和PVC之间的关系
在这里插入图片描述

创建持久卷

创建PV必须指定4点:

1)该PV所具有的容量大小;

2)是否可由单个节点或多个节点同时读取或写入;

3)当绑定的PVC被删除后,如何处理PV;

4)指定支持PV的实际存储类型、路径和其他属性


创建PV格式:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: PV的名称
  labels:
    标签名: 标签值
spec:
  capacity:
    storage: PV的大小
  accessModes:
  -	挂载模式1
  -	挂载模式N
  persistentVolumeReclaimPolicy: 回收策略
  nfs:
    server: NFS服务器IP
    path: 存储路径

(1)挂载模式具有以下3种:

1)ReadWriteOnce:仅单个节点可挂载为读写模式;

2)ReadOnlyMany:多个节点可同时挂载为只读模式;

3)ReadWriteMany:多个节点可通过挂载为读写模式;

//单个PV同一时刻仅能由一种挂载模式被挂载

//存储介质的不同,所支持的挂载模式有所差异


(2)当绑定的持久卷声明被删除后,有以下回收策略:

1)Retain:绑定的PVC被删除后,保留PV和PV中的数据;

2)Recycle:绑定的PVC被删除后,保留PV,但删除PV中的数据;

3)Delete:绑定的PVC被删除后,删除PV;


(3)存储介质不一定是nfs,也可以是hostPath或iSCSI等;

1)存储介质是hostPath的格式(spec字段下):

hostPath:
  path: 存储路径

2)hostPath仅支持ReadWriteOnce挂载模式(NFS全都支持);

3)当存储介质是NFS时,需在NFS权限配置上添加“no_root_squash”,且所有的节点都应挂载对应的NFS指定目录


如:创建PV,其存储介质为NFS

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成PV,并验证
在这里插入图片描述
//RWO代表ReadWriteOnce、ROX代表ReadOnlyMany、RWX代表ReadWriteMany


若PV使用delete无法正常删除时,可使用该命令:

kubectl patch pv PV名称 -p ‘{“metadata”:{“finalizers”:null}}’

创建持久卷声明

创建PVC必须指定4点:

1)该PVC所需容量的大小;

2)PVC支持的挂载模式;

3)是否为动态配置


创建PVC格式:

apiVersion: v1
kind:PersistentVolumeClaim
metadata:
  name: PVC名称
  labels:
    标签名: 标签值
spec:
  resources:
    requests:
      storage: 所需容量大小
  accessModes:
   - 挂载模式
   storageClassName: SC名称或“”


(1)若无动态配置(静态配置),可使用双引号(“”)代替

1)若引用的SC名称是个不存在的存储类,PVC将创建失败;

2)若没有storageClassName字段,系统自动为该PVC创建默认存储类的PV;

3)若手动配置PVC的存储类,需将PVC的storageClassName字段设置为“”


如:创建PVC,绑定PV

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成PVC,并验证
在这里插入图片描述
//defalut代表PVC所在的命名空间为默认命名空间


如:续上,创建Pod使用PVC

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成Pod,并验证
在这里插入图片描述

如:续上,删除所创建的Pod和PVC,再次创建PVC

1)删除Pod和PVC;
在这里插入图片描述
2)创建PVC
在这里插入图片描述
//PV设置的回收策略为Retain,导致PV不能自动被回收(被其他PVC使用),所以没有相匹配的PV,导致PVC被挂起等待

动态持久卷

StoreageClass(SC):定义存储类由特定的卷插件管理

1)StorageClass资源不属于命名空间;

2)当PVC请求存储类是由卷插件管理的时,插件会自动创建该PV;


如:动态持久卷的流程
在这里插入图片描述


创建SC格式:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: SC名称
provisioner: 卷插件名称
parameters:
  参数

(1)SC名称可理解为存储类的名称

添加NFS卷插件

(1)~(8)添加NFS卷插件,(9)~(10)创建NFS类型的StorageClass


(1)创建命名空间,并指定名称

kubectl create namespace nfs-storage
在这里插入图片描述

(2)编写rabc.yaml文件(见附录rabc.yaml)
在这里插入图片描述


(3)将rabc.yaml文件中的命名空间值改为创建的命名空间名称

sed -i ‘s/kafka-test/nfs-storage/’ rbac.yaml
在这里插入图片描述

(4)创建rabc

kubectl apply -f rbac.yaml
在这里插入图片描述

(5)编写deployment.yaml文件(见附录deployment.yaml)
在这里插入图片描述


(6)根据NFS服务器,配置deployment.yaml文件
在这里插入图片描述

(7)将deployment.yaml文件中的命名空间值该为创建的命名空间名称

sed -i ‘s/kafka-test/nfs-storage/’ deployment.yaml
在这里插入图片描述

(8)创建provisioner(生成的卷插件名称为“fuseim.pri/ifs”)

kubectl apply -f deployment.yaml
在这里插入图片描述

(9)编写SC
在这里插入图片描述

(10)创建SC

kubectl apply -f class.yaml
在这里插入图片描述

使用动态持久卷

如:创建具有动态持久卷的PVC

1)编写YAML文件;
在这里插入图片描述
2)调用create命令生成PVC,并验证PVC和PV
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐