Kubernetes(K8s)_05_卷
Kubernetes(K8s)数据持久化存储-卷
卷
卷:属于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
更多推荐
所有评论(0)