1、什么是卷
在某些场景下,我们可能希望新的容器可以在之前容器结束的位
置继续运⾏,⽐如在物理机上重启进程。可能不需要(或者不想要)
整个⽂件系统被持久化,但又希望能保存实际数据的⽬录。
Kubernetes通过定义存储卷来满⾜这个需求,它们不像pod这样的
顶级资源,⽽是被定义为pod的⼀部分,并和pod共享相同的⽣命周
期。这意味着在pod启动时创建卷,并在删除pod时销毁卷。因此,在
容器重新启动期间,卷的内容将保持不变,在重新启动容器之后,新
容器可以识别前⼀个容器写⼊卷的所有⽂件。另外,如果⼀个pod包含
多个容器,那这个卷可以同时被所有的容器使⽤。
2、卷的类型
2.1 emptyDir
最简单的卷类型是emptyDir卷,卷从⼀个空⽬录开始,运⾏在pod内的
应⽤程序可以写⼊它需要的任何⽂件。因为卷的⽣存周期与pod的⽣存
周期相关联,所以当删除pod时,卷的内容就会丢失。
emptyDir卷是最简单的卷类型,但是其他类型的卷都是在它的基础
上构建的,在创建空⽬录后,它们会⽤数据填充它。
2.2 gitRepo
gitRepo卷基本上也是⼀个emptyDir卷,它通过克隆Git仓库并在pod
启动时(但在创建容器之前)检出特定版本来填充数据
gitRepo容器就像emptyDir卷⼀样,基本上是⼀个专⽤⽬录,专门
⽤于包含卷的容器并单独使⽤。当pod被删除时,卷及其内容被删除。
2.3 hostPath
hostPath卷指向节点⽂件系统上的特定⽂件或⽬录。在同⼀个节点上运⾏并在其hostPath
卷中使⽤相同路径的pod可以看到相同的⽂件。
hostPath卷是我们介绍的第⼀种类型的持久性存储,因为gitRepo和
emptyDir卷的内容都会在pod被删除时被删除,⽽hostPath卷的内容则不
会被删除。如果删除了⼀个pod,并且下⼀个pod使⽤了指向主机上相
同路径的hostPath卷,则新pod将会发现上⼀个pod留下的数据,但前提
是必须将其调度到与第⼀个pod相同的节点上。
查看kubectl-system 是否存在hostPath 卷
一般都是kubenetes放配置文件才会放到hostpath卷
⼤多数情况下都使⽤这种类型的卷来访问节点的⽇志⽂件、kubeconfig(Kubernetes配置⽂件)
或CA证书。
请记住仅当需要在节点上读取或写⼊系统⽂件时才使⽤
hostPath,切勿使⽤它们来持久化跨pod的数据。
3、持久化存储
3.1 GCE (Google Compute Engine)
创建GCE持久磁盘
同⼀区域中创建GCE持久磁盘
使 ⽤ gce Persistent Disk 卷 的 pod: mongodbpodgcepd.yaml
如果要使⽤Minikube,就不能使⽤GCE持久磁盘,但是可以
部署mongodb-pod-hostpath.yaml,这个使⽤的是hostpath卷⽽不是GCE
持久磁盘。
pod包含⼀个容器和⼀个卷,被之前创建的GCE持久磁盘⽀持。因为MongoDB就是在
/data/db上存储数据的,所以容器中的卷也要挂载在这个路径上
3.2 AWS****弹性块存储卷
AWS弹性块存储(Aws Elastic Block Store)
3.3 NFS****卷
如果集群是运⾏在⾃有的⼀组服务器上,那么就有⼤量其他可移
植的选项⽤于在卷内挂载外部存储。例如,要挂载⼀个简单的NFS共
享,只需指定NFS服务器和共享路径
3.4 其他
其他的⽀持选项包括⽤于挂载ISCSI磁盘资源的iscsi,⽤于挂载
GlusterFS的glusterfs,适⽤于RADOS块设备的rbd,还有fiexVolume、
cinder、cephfs、fiocker、fc(光纤通道)等。rbd如果你不会使⽤到它
们,就不需要知道所有的信息。这⾥提到是为了展⽰Kubernetes⽀持⼴
泛的存储技术,并且可以使⽤喜欢和习惯的任何存储技术。
4、持久卷使用
4.1 NFS、PV(PersistentVolume)、PVC(PersistentVolumeClain)
NFS 储存服务器
真实磁盘
PersistentVolume 持久卷,简称PV
持久分区目录
PVC PersistentVolumeClain 持久卷声明
指定所需要的最低容量要求和访问模式,然后⽤户将持久卷声明清单提交给Kubernetes
API服务器,Kubernetes将找到可匹配的持久卷并将其绑定到持久卷声
明
4.2 创建持久卷
# 查看现有持久卷
kubectl get pv
4.3 创建持久卷声明 绑定持久卷
# 查看现有持久卷
kubectl get pvc
# 查看yaml
kubectl get pvc datadir-zk-0 -o yaml -n ydxs-uat
# 修改yaml
kubectl edit pvc datadir-zk-0 -o yaml -n ydxs-uat
RWO------ReadWriteOnce------仅允许单个节点挂载读写。
ROX------ReadOnlyMany------允许多个节点挂载只读。
RWX------ReadWriteMany------允许多个节点挂载读写这个卷。
# 查看持久卷
kubectl get pv
持久卷显⽰被绑定在default/mongodb-pvc的声明上,这个default部
分是声明所在的命名空间(在默认命名空间中创建的声明),我们之
前有提到过持久卷是集群范围的,因此不能在特定的命名空间中创
建,但是持久卷声明又只能在特定的命名空间创建,所以持久卷和持
久卷声明只能被同⼀命名空间内的pod创建使⽤。
4.4 创建pod 绑定持久卷声明
4.5 创建持久卷声明的好处
是研发⼈员不需要关⼼底层实际使⽤的存储技术。
可以对卷的进行声明配置
4.6 卷的回收 Retain Recycle Delete
⼿动回收持久卷 persistentVolumeReclaimPolicy 配置
设 置 为 Retain 从 ⽽ 通 知 到
Kubernetes,我们希望在创建持久卷后将其持久化,让Kubernetes可以
在持久卷从持久卷声明中释放后仍然能保留它的卷和数据内容。据我
所知,⼿动回收持久卷并使其恢复可⽤的唯⼀⽅法是删除和重新创建
持久卷资源。当这样操作时,你将决定如何处理底层存储中的⽂件:
可以删除这些⽂件,也可以闲置不⽤,以便在下⼀个pod中复⽤它们。
⾃动回收持久卷 persistentVolumeReclaimPolicy 配置
Recycle 删除卷的内容并使卷可⽤于再次声明,通过这种⽅式,持久卷可以被不同的
持久卷声明和pod反复使⽤
Delete 策略删除底层存储。需要注意当前GCE持久磁盘
⽆法使⽤Recycle选项。这种类型的持久卷只⽀持Retain和Delete策略,
其他类型的持久磁盘可能⽀持这些选项,也可能不⽀持这些选项
4.7 StorageClass
# 创建 sc
创建StorageClass资源后,⽤户可以在其持久卷声明中按名称引⽤
存储类。
创建⼀个请求特定存储类的PVC定义
可以修改mongodb-pvc以使⽤动态配置。以下代码清单显⽰了PVC
中更新后的YAML定义。
# 查看pvc
kubectl get pvc
# 自动生成pv