Kubernetes(二十二)Volumes
容器中的磁盘文件是临时存放的,如果容器销毁、停止数据也将丢失。同时在一个pod运行多个容器的时候,常常需要在容器之间共享数据。kubernetes抽象出voleme对象来解决这2个问题。
- Volume类型
- emptyDir
- 当pod指定到某个节点上时,首先创建的是一个emptyDir,并且pod只要一直在这个node上运行,emptyDir就一直存在。当pod从节点删除时,emptydir卷也会被永久删除。它的主要用途如下:
- 缓存空间,例如基于磁盘的归并排序。
- 为耗时较长的任务提供检查点,以便于任务能够方便的从崩溃前恢复执行。
- 在web服务器容器服务数据时,保存内容管理器获取的文件。
- 应用场景:多容器之间的数据共享。
- 示例 emptyDir.yaml
apiVersion: v1kind: Podmetadata:name: test-pdspec:containers:- image: k8s.gcr.io/test-webserver #写入的容器name: test-container-writevolumeMounts:- mountPath: /cachename: cache-volume #使用的数据卷名称,跟volumes:name要能匹配上- image: k8s.gcr.io/test-webserver #读取的容器name: test-container-readvolumeMounts:- mountPath: /cachename: cache-volume #使用的数据卷名称,跟volumes:name要能匹配上volumes: #定义数据卷来源,支持定义多个数据卷- name: cache-volume #定义数据卷的名称1emptyDir: {}
- name: cache-volume2 #定义数据卷的名称2emptyDir: {} - kubectl apply -f emptyDir.yaml #创建带volume的pod
-
- 当pod指定到某个节点上时,首先创建的是一个emptyDir,并且pod只要一直在这个node上运行,emptyDir就一直存在。当pod从节点删除时,emptydir卷也会被永久删除。它的主要用途如下:
- hostPath
- hostpath挂载和docker原理是一样的;就是将卷挂载在node节点物理磁盘上。
- 支持以下type类型
- 空 空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
- DirectoryOrCreate 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权。
- Directory 在给定路径上必须存在的目录。
- FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。
- File 在给定路径上必须存在的文件。
- Socket 在给定路径上必须存在的 UNIX 套接字。
- CharDevice 在给定路径上必须存在的字符设备。
- BlockDevice 在给定路径上必须存在的块设备。
- 应用场景:pod容器需要访问宿主机文件。
- 示例 hostPath.yaml
-
apiVersion: v1kind: Podmetadata:name: test-pdspec:containers:- image: k8s.gcr.io/test-webservername: test-container #pod容器名称volumeMounts:- mountPath: /test-pd #容器内的目录name: test-volume #使用的数据卷名称,跟volumes:name要能匹配上volumes:- name: test-volume #定义数据卷的名称hostPath:# 宿主机的路径path: /data# type类型type: Directory
-
- kubectl apply -f emptyDir.yaml #创建带volume的pod
- nfs
- nfs网络卷可以不受容器销毁、节点销毁而永久存储数据在其他的服务端云服务器上。
- githup https://github.com/kubernetes/examples/tree/master/staging/volumes/nfs
- 安装客户端
- 挂载nfs需要node支持客户端的库nfs-utils
- yum install nfs-utils -y #安装nfs
- systemctl start nfs #启动nfs
- 安装服务端
- yum install nfs-utils -y #安装nfs
- vi /etc/exports
- /data/nfs *(rw,no_root_squash) #暴露/data/nfs 目录,支持所有的IP来访问,支持读写权限;
- systemctl start nfs #启动nfs
- nfs.yaml
apiVersion: apps/v1beta1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwrootmountPath: /usr/share/nginx/html #网站根目录ports:- containerPort: 80volumes:- name: wwwrootnfs:server: 192.168.31.61 #nfs服务地址path: /data/nfs #nfs暴露的目录
- kubectl apply -f nfs.yaml #创建nfs的pod