【k8s】卷

k8s中卷是pod的一个组成部分,它不是一个独立的对象,所以不能单独创建和删除。
pod中所有容器都可以使用卷,但必须先将它挂载在每个需要访问它的容器中。
每个容器可以在其文件系统的任意位置挂载卷。

可创建挂载的卷的类型有多种:

  • emptyDir:用于存储临时数据的简单空目录。
  • hostPath:用于将目录从工作节点的文件系统挂载到pod中。
  • gitRepo:通过检出Git仓库的内容来初始化的卷。
  • nfs:挂载到pod中的NFS的共享卷。
  • ....
  1. emptyDir是最简单的卷类型,其它类型都是在它的基础上构建的。
volumes:
- name: name
  emptyDir: {}
  1. gitRepo卷基本上也是一个emptyDir卷,它通过克隆Git仓库并在pod启动时(但在容器创建前)检出特定版本来填充数据。但不会跟着Git仓库的代码同步更新。
volumes:
- name: html
  gitRepo:
    repository: https://gihub.com//....
    revision: master
    directory: . # 将repo克隆到卷的根目录
  1. hostPath一般是由某些系统级的pod进行访问,一般普通业务pod不应该去操作宿主机上的文件系统。这种类型的卷不会随着pod的删除而删除。

  2. 到现在为止其实有一个问题,就是上面的的存储卷类型要么是会随着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数据库添加文档来将数据写入持久化存储。