应用程序是跑在容器中的,那么必然会有数据的产生,有数据就离不开存储,就是本文所要介绍的存储卷volume,那么容器的存储有哪些方式呢?能想到的就是:非持久化存储和持久化存储两类。因为pod在运行的过程中可能会被销毁,所以运行在他上面的容器产生的数据我们需要对它进行一个存储,根据需求是永久存储还是随着pod生命周期结束就回收了来决定使用什么类型的volume。根据具体的实际应用场景来确定,不是所有的数据都需要永久存储。k8s将volume的类型划分为以下几类。
简单存储:emptydir hostpath nfs
高级存储:pv pvc
配置存储:configmap secret
下面分别来介绍这几种存储方式的特点和适合什么样的应用场景下的容器来选择。
简单存储:
- EmptyDir:这种方式的存储卷是声明在pod里面,所以它的缺点也很明显,就是pod重启数据就会丢失,不能够保证持久化。
所以这种方式很少用。
2.hostpath:听名字就知道存储卷是放在host上的,那么只要主机不损坏,数据就不会丢失,但是也不能够做到完全的持久化,只要机器挂掉pod,容器就不能够对数据进行读写操作了。
3、nfs:是一种外置存储服务器,就是在集群节点外搭建一个nfs服务器,定义pod的时候声明为nfs存储,就可以了。很显然这种方式能够保证持久化,除非nfs服务器挂掉,这种情况就没办法了。
具体的yml文件中参数的是如何声明的,下面举一个例子,大致都是一样的。
apiVersion: v1
kind: Pod
metadata:
name: volume-hostpath
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
volumesMounts:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","tail -f /logs/access.log"]
volumeMounts:
- name: logs-volume
mountPath: /logs
volumes:
- name: logs-volume
hostPath:
path: /root/logs
type: DirectoryOrCreate #目录存在就使用,不存在就先创建再使用
高级存储:pv和pvc
pv(persistent volume):持久化存储卷
pvc(persistent volume claim):持久化存储卷声明
从上面我们可以看到kubernetes支持的存储类型有很多,不管是nfs 还是glusterfs等等,都需要用户在自己的pod对应的yml文件中进行声明,比较麻烦,其实对用来来说,他根本不需要去关心你给我提供的是nfs的存储类型,还是glusterfs,我其实只想要对应容量的存储就行了。具体怎么配置,这个由存储卷那边自己来做。
有需求那么就有对应的方案来解决,pv和PVC就是为了解决用户对于不同存储卷的使用的时候需要指定配置存在的问题。
那么什么是pv,什么又是pvc呢?
pv:中文翻译就是持久化存储卷,它是对底层的各种存储类型的一个抽象。不管底层的存储是NFS还是glusterfs,我对外(也就是对用户来说)就提供统一的接口,统一的方式供给用户来使用。这样把底层多样的存储类型进行了封装起来,用户就不用去关系底层具体是什么,封装的工作由k8s的管理员来实现。
那么pvc呢?中文是持久化存储卷声明,这个其实就是针对用户来说的,比如用户需要多大的存储,那么他直接通过pvc来声明一下空间,pvc再去调用pv,进行资源的申请,以满足用户的需求。下面给个图来加深理解。
pv的声明yml文件格式:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2 #可以看到和别的资源声明不一样的地方,这个资源没有命名空间namespace
spec:
nfs: #存储类型,与底层真正存储对应
capacity: #存储能力,目前只支持存储空间的设置
storage: 2Gi
accessModes: #访问模式
storageClassName: #存储类别
persistentVolumeReclaimPolicy: #回收策略
上述的声明中,可以看到pv的声明中是没有namespace的,原因是pv的级别是集群资源,是跨namespace的。
①nfs:这个不是固定必须是nfs,根据你底层的存储系统是什么就写什么。
②capacity:
③accessmodes:访问模式:
ReadWriteOnce(可以执行读写权限,只能单节点,不能被多个节点挂载)
readonlymany:只读权限,可以被多个节点挂载
readwritemay:支持读写权限,可以被多个节点挂载
④persistentVolumeReclaimPolicy:回收策略
retain
recycle:删除pv中的数据,效果相当于;rm -rf /thevolume/*
delete:也是删除,与pv相连的后端存储来完成volume的删除操作。
⑤status:
available(可用):表示pv可用,但是没有被pvc绑定
Bound(已绑定):表示PV已经被PVC绑定
release(已释放):表示pvc被删除,但是资源还未被集群重新声明
failed(失败):表示该pv的自动回收失败
配置存储:configmap secret
配置存储主要是用来存储配置信息的。下面给出一个configmap的yml配置文件。
#configmap.yml文件
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap
namespace: dev
data:
info:
username: admin
password: 123456
通过:
kubectl create -f configmap.yml
创建完成之后,然后需要将把它绑定到pod上。
#pod-configmap.yml
apiVersion: v1
kind:pod
metadata:
name: cpod-configmap
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
volumeMounts: #将configmap挂载到目录
- name: config
mountPath: /configmap/config
volumes: #声明一个名字叫config的存储卷,并引用configmap
- name: config
configMap:
name: configmap #这个名字需要和上面创建的configmap中的name保持一致
通过:
kubectl create -f pod-configmap.yml
创建完成之后,可以进去pod,然后查看/configmap/config文件下有info的信息:
kubectl exec -it pod-configmap -n dev /bin/bash
#cd /configmap/config
#ls
info
#more info
username: admin
password: 123456
上面可以看到配置信息的数据都是明文的方式存储的,那么有些场景下,比如密码的存储想要加密存储,那么这种情况下,可以使用secret类型的存储卷。
secret:
使用方法,就是将配置信息进行编码后,放入secret的yml文件中,然后挂载到pod中,这样pod可以读配置信息后进行解码。
以上就是k8s中容器的数据存储volume的几种类型。