volume
概述
什么是Valume
默认情况下容器的数据都是非持久化的,在容器消亡以后数据也跟着丢失,所以 Docker 提供了 Volume 机制以便将数据持久化存储。类似的,Kubernetes 提供了更强大的 Volume 机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。
与 Docker 不同,Kubernetes Volume 的生命周期与 Pod 绑定。容器挂掉后 Kubelet 再次重启容器时,Volume 的数据依然还在,而 Pod 删除时,Volume 才会清理。数据是否丢失取决于具体的 Volume 类型,比如 emptyDir 的数据会丢失,而 PV 的数据则不会丢
Volume类型
目前,Kubernetes 支持以下 Volume 类型:
emptyDir、hostPath、hostPath、gcepersistentDisk、awsElasticBlockStore、nfs、iscsi、flocker、glusterfs、rbd、cephfs、gitRepo、secret、persistentVolumeClaim、downwardAPI、azureFileVolume、azureDisk、vsphereVolume、Quobyte、PortworxVolume、scaleIO、FlexVolume、StorageOS、local
用的比较多的是:emptyDir、hostPath、nfs、glusterfs
本地数据卷
emptyDir
emptyDir表示空目录,会在宿主机上创建数据卷目录并挂在到容器中。
创建emptyDir类型的数据卷
下面通过yaml文件创建一个emptyDir类型的数据卷:
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- image: redis
name: redis
volumemounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
这里会创建一个叫redis-pod的pod,使用redis镜像,然后创建了一个emptyDir类型的volume,并挂载到容器的/cache。注意在yaml文件中volumes的定义和containers的定义在同一级。
创建这个pod:
kubectl create -f empty.yaml
查看数据卷
进入到这个pod中,可以看到我们挂载的cache目录:
hostPath
可以将宿主机中的目录挂载到容器中。
创建hostPath类型的volume
通过yaml文件创建:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /tmp-test
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /tmp
type: Directory
这里指定了源宿主机路径为/tmp,并指定它的类型为目录,将它挂在到容器的/tmp-test上
创建:
kubectl create -f hostpath.yaml
查看volume
进入这个pod:
可以看到容器将宿主机中的tmp目录挂载到了容器中的tmp-test上,其中的文件就是宿主机的文件。
因为我实在master上查看的,所以下意识看了一下master上的tmp文件,发现文件名不对啊,后来想到应该是看node节点的tmp目录
查看下pod分配到了哪个node,并查看该node下的tmp目录:
应用场景
比如说做宿主机性能分析的应用,将proc等目录挂载到容器中可以用到,因为这些目录在任何宿主机上都有。
网络数据卷
NFS
安装nfs
首先另起一台虚拟机安装nfs:
yum install -y rpcbind
yum install -y nfs-utils
配置exports:
echo "/opt/nfs/data *(rw,no_root_squash)" >> /etc/exports
创建nfs挂载文件的相关目录:
mkdir -p /opt/nfs/data
touch /opt/nfs/data/index.html
echo "This is nfs volume test for k8s" > /opt/nfs/data/index.html
启动nfs:
/etc/init.d/rpcbind start
/etc/init.d/nfs start
创建nfs类型的volume
通过yaml文件配置:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-nfs
spec:
replicas: 3
template:
metadata:
labels:
APP: nginx-nfs
spec:
containers:
- name: nginx-nfs
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
nfs:
server: 10.10.109.19
path: /opt/nfs/data
这里指定了创建3副本的nginx,并指定nfs数据卷服务器为10.10.109.19,挂载/opt/wwwroot到容器的/usr/share/nginx/html
创建:
kubectl create -f nfs.yaml
访问测试
首先将pod作为服务发布:
apiVersion: v1
kind: Service
metadata:
name: nginx-nfs-svc
labels:
app: nginx-nfs
spec:
ports:
- port: 90
targetPort: 80
selector:
app: nginx-nfs
发布:
kubectl create -f nginx-service.yaml
在node节点通过clusterIP进行访问.
GlusterFS
这是一个主流的分布式的存储,可以保证数据的可靠性和提高性能。
Presustent Volumes 持久卷
相关概念
Presustent Volumes:又称为 PV,持久卷,是对存储抽象实现,是的存储作为集群中的资源。
Presustent VolumesClaim:又称 PVC,持久卷申请,PVC消费PV资源
pv 和 pvc是一种对底层存储抽象化管理的机制。pod 申请 PVC作为卷来使用,集群通过PVC查找绑定的PV,并挂在给pod
PV类型
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- AzureDisk
- FC (Fibre Channel)
- FlexVolume
- Flocker
- NFS
- iSCSI
- RBD (Ceph Block Device)
- CephFS
- Cinder (OpenStack block storage)
- Glusterfs
- VsphereVolume
- Quobyte Volumes
- HostPath
- VMware Photon
- Portworx Volumes
- ScaleIO Volumes
- StorageOS
PV设定时的重要参数
访问模式(accessModes)
accessModes 主要有如下的几个:
- ReadWriteOnce:读写挂载在一个节点上(谁用谁挂载)
- ReadOnlyMany:只读挂载在多个节点上
- ReadWriteMany:读写挂载在多个节点上
回收策略(Recycling Policy)
主要的Recycling Policy有如下三个:
- retain:不做任何操作,不使用的时候需要手动删除(默认)
- Recycle:没有PVC使用的时候清空数据让其他PVC使用
- Delete:
PV状态(Phase)
常见的Phase有如下几种:
- Available:可用(可以被新的pvc挂载)
- Bound:已经被pvc挂载了
- Released:pvc已不再使用需要回收
- failed:创建失败
创建一个PV
通过nfs创建
这也是我这里采用的方法
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /opt/nfs/data
server: 10.10.109.19
kubectl create -f nfs-pv.yaml
通过glusterfs创建
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs-cluster"
path: "gv0"
readOnly: false
查看创建的PV资源:
可以看到通过NFS创建的容量5G的pv已经成功了
创建pvc
只创建pv并不能直接使用,还需要pvc进行对pv的消费
pvc是统一的,不用考虑后端是nfs还是glusterfs
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc001
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
kubectl create -f pvc.yaml
requests指定了这个pvc申请多大的pv
一般情况下可能会有多个pv,这种情况下pvc如何绑定pv的呢?其实是有两个条件:
1、根据pvc申请的容量,采用最小匹配原则,例如有5G、10G、20G的pv,pvc申请4G,那么就会匹配到5G的pv
2、根据访问模式匹配,匹配访问模式和pv模式一直的
查看创建情况:
可以看到pv和pvc已经是绑定的状态。
创建应用
现在创建一个nginx应用来使用这个pvc:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: wwwroot
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: pvc001
kubectl create -f pvc-app.yaml
在这个应用创建的时候指定了使用pvc的名称为pvc001
查看创建结果:
已经创建成功了
查看一下这个pod的ip,然后在任意节点上访问测试下这个pod:
现在nginx的页面是nfs中的index的内容了
然后尝试修改一下nfs中的index的内容然后重新访问:
在修改后nginx的页面也同时更改了
pv和pvc带来的好处
首先就是不需要过多的关注后端的存储,不论后端是nfs还是glasterfs,对于开发人员更加友好。
另外就是方便统一管理后端存储,运维人员负责生成不同大小的pv,开发人员只需要请求合适的pvc即可。
相关阅读
下载:http://www.ctdisk.com/file/8139185 FancyCache 概述 FancyCache是一个可以将系统内存或闪存虚拟成硬盘缓存的软件。它把从
电脑里每个盘下都出现$RECYCLE.BIN和system volume in
电脑里每个盘下都出现$RECYCLE.BIN和system volume information等文件夹,如下: 解决方案:如下图片中的四步操作。解释:首先说