k8s中卷是pod的一个组成部分,它不是一个独立的对象,所以不能单独创建和删除。
pod中所有容器都可以使用卷,但必须先将它挂载在每个需要访问它的容器中。
每个容器可以在其文件系统的任意位置挂载卷。
可创建挂载的卷的类型有多种:
- emptyDir:用于存储临时数据的简单空目录。
- hostPath:用于将目录从工作节点的文件系统挂载到pod中。
- gitRepo:通过检出Git仓库的内容来初始化的卷。
- nfs:挂载到pod中的NFS的共享卷。
- ....
- emptyDir是最简单的卷类型,其它类型都是在它的基础上构建的。
volumes:
- name: name
emptyDir: {}
- gitRepo卷基本上也是一个emptyDir卷,它通过克隆Git仓库并在pod启动时(但在容器创建前)检出特定版本来填充数据。但不会跟着Git仓库的代码同步更新。
volumes:
- name: html
gitRepo:
repository: https://gihub.com//....
revision: master
directory: . # 将repo克隆到卷的根目录
-
hostPath一般是由某些系统级的pod进行访问,一般普通业务pod不应该去操作宿主机上的文件系统。这种类型的卷不会随着pod的删除而删除。
-
到现在为止其实有一个问题,就是上面的的存储卷类型要么是会随着pod的删除而删除,要么就是只绑定到pod所在的宿主机上,一旦pod发生漂移,那么数据就会找不到,因此必须将其存储在某种类型的网络存储(NAS)中。
首先创建一个运行MongoDB的pod,并创建适当类型的卷挂载到MongoDB容器中。这里的适当类型的卷可以用GCE持久磁盘。
volumes:
- name: mongodb-data # 卷名
gcePersisitentDisk: # 卷类型是GCE持久磁盘
pdName: mongodb # 持久磁盘的名称必须与先前创建的实际PD一致
fsType: ext4 # 文件系统类型为EXT4,一种linux文件系统
containers:
- image: mongo
name: mongodb
volumeMounts:
- name: mongodb-data # 与上面的卷名一致
mountPath: /data/db # MongoDB数据存放的路径
ports:
- containerPort: 27017
protocol: TCP
pod包含一个容器和一个卷,被之前创建的GCE持久磁盘支持。因为MongoDB就是在/data/db上存储数据的,所以容器中的卷也要挂载在这个路径上。
然后其它pod通过向MongoDB数据库添加文档来将数据写入持久化存储。