一、可用的卷类型
1、emptyDir 用于存储临时数据的简单空目录
2、hostPath 用于将目录从工作节点的文件系统挂在到pod中
3、gitRepo 通过检出Git仓库的内容来初始化的卷
4、nfs 挂载到pod中的NFS共享卷
5、gcePersistentDisk (google高效能型存储磁盘卷)、awsElaseticBlockStore(aws WEB服务弹性块存储卷)、azureDisk(微软云磁盘卷) 用于挂载云服务商提供的特定存储类型
6、cinder、cephfs、iscsi、flocker、glusterfs、quobyte、rbd、flexVolume、vshphere-Volume、photonPersistentDisk、scaleIO 用于挂载其他类型的网络存储
7、configMap、secret、downwardAPI 用于将kubernetes部分资源和集群信息公开给POD的特殊类型卷
8、persistentVolumeClaim 一种用于预置或者动态配置的持久存储类型。
二、卷在容器之间共享数据
1、使用emptyDir卷
运行在pod内的应用程序可以写入任何需要的文件,卷的生存周期与pod生存周期想关联、删除pod时卷的内容就会丢失。也可以将emptyDir卷指定为内存
.....
volumeMounts:
- name: html
mountPath: /var/htdocs #将名为html的卷挂载到容器 /var/htdocs 中。
readOnly: true #设置为只读
指定emptyDir的介质:
volumeMounts:
- name: html
emptyDir:
medium: Memory
2、 gitRepo 卷基本上也是一个emptyDir卷,通过可克隆git仓库并在pod启动时检出特定版本来填充数据。
创建gitRepo卷后,Git仓库推送更新时,卷中的文件不会自动更新。如果pod是由RC或RS 管理,删除这个pod将触发新建一个pod,这个新创建的pod则是最新的内容。
示例:
从一个克隆的git仓库中运行web服务器的pod的服务文件
apiVersion: v1
kind: pod
metadata:
name: gitrepo-volume-pod
spec:
containers:
- image: nginx:alpine
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
volumes:
- name: html
gitRepo: #创建一个gitrepo卷,
repository: https://github.com/luksa/kubia-websit.git #这个卷克隆至一个git仓库
revision: master #检出主分支
directory: . #将repo克隆到卷的根目录。
3、访问工作节点文件系统上的文件 (hostPath卷)
大多数pod应该忽略他们的主机节点,因此不应该访问节点上的文件系统,但某些系统级别的pod,确实要访问节点文件系统例如通常由DaemonSet管理的系统。
hostPath卷是指向节点文件系统上的特定文件目录,hostPath是一种持久性存储,删除pod后hostPath卷上的数据不会丢失。
hostPath卷不适合于在多节点情况下数据共享。
4、持久化存储(网络存储NAS)
volumes:
- name: nas-data
nfs: #这个卷受NFS支持
server: 1.2.3.4 #NFS服务器IP
path: /data/html #服务器提供的路径
网络存储的方案比较多,这里不一一介绍。
5、持久卷(PersisteneVolume) PV 和持久卷申明(PersisteneVolumeClaim) PVC
开发人员无需向POD中添加特定技术的卷,有集群管理员设置底层存储,然后通过k8s api服务器创建持久卷注册,管理员可以指定其大小及访问模式。
当集群用户需要在其pod中使用持久化存储时,他们首先创建持久化申明,然后用户将持久卷申明清单提交给K8S api,k8s找到可以匹配的持久卷并将其绑定到持久声明。
PVC可以当作pod中的一个卷使用,其他用户不能使用相同的PV,除非通过删除PVC绑定来释放。
流程:
(1、管理员创建某类型的网络存储
(2、管理员通过向K8S API传递PV申明来创建持久卷
(3、用户创建一个持久卷申明(PVC)
(4、K8S找到一个具有足够容量的PV将其置于访问模式并将PVC绑定到PV
(5、用户创建一个POD并通过卷配置引用PVC
6、创建持久卷
apiVersion: v1
kind: PersistentVolme
metadata:
name: mongodb-pv
spec:
capacity:
storage: 1Gi #定义PV大小
accessModes:
- ReadWriteOnce # 可以被单个客户端或多个客户端挂在为只读、读写模式
- ReadOnluMany #
persistentVolumeReclaimPolicy: Retain #申明被释放后PV会被保留(不清理和删除)
gecPersistentDisk: #PV指定GCE持久磁盘
pdName: mongodb
faType: ext4
kubectl get pv #查看PV状态
status列 应该显示为Available状态
7、通过持久卷申明来获取持久卷
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc #声明的名称,声明将当作pod的卷使用时会用到。
spec:
resources:
requests:
storage: 1Gi #申请1G存储空间
accessModes:
- ReadWriteOnce #允许单个客户端访问(同时支持读写操作)
storageClassName: "" #关于动态配置。
kubectl get pvc #查看PVC状态 status列显示 Bound显示绑定成功
ACCESSMODES列状态:
RWO 仅允许单个节点挂在读写
ROX 允许多个节点挂载只读
RWX 允许多个节点挂载读写这个卷
这个时候 kubectl get pv 显示的STATUS 列也应该Bound状态。
8、在pod中使用PVC
apiVersion: v1
kind: pod
metadata:
name: mongodb
spec:
containers:
- image: mongo
name: mongodb
volumeMounts:
- name: mongodb-data
mountPath: /data/db
ports:
- containerPort: 27017
protocol: TCP
volumes:
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc #pod卷中通过名称引用持久卷申明
至此从创建PV到pod 根据PVC引用存储已完成。