八、持久卷使用
1、emptyDir
EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: web-volume
mountPath: /usr/share/nginx/html
readOnly: true
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
args:
- "-c"
- "while true;do echo $(date) >> /data/index.html;sleep 1;done"
volumeMounts:
- name: web-volume
mountPath: /data
volumes:
- name: web-volume
emptyDir:
medium: Memory
sizeLimit: 10Mi
验证
[root@master volume]# kubectl get po pod-emptydir -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-emptydir 2/2 Running 0 29s 10.244.1.132 node2 <none> <none>
[root@master volume]# curl 10.244.1.132
Thu Dec 2 14:01:16 UTC 2021
Thu Dec 2 14:01:17 UTC 2021
Thu Dec 2 14:01:18 UTC 2021
......
2、hostPath
HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: web-hostpath
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: web-hostpath
hostPath:
path: /data/web
type: DirectoryOrCreate
验证
[root@master volume]# kubectl get po pod-hostpath -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath 1/1 Running 0 58s 10.244.1.134 node2 <none> <none>
[root@node2 ~]# echo myWeb_hostPath > /data/web/index.html
[root@master volume]# curl 10.244.1.134
myWeb_hostPath
关于type字段的说明:
DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
Directory 目录必须存在
FileOrCreate 文件存在就使用,不存在就先创建后使用
File 文件必须存在
Socket unix套接字必须存在
CharDevice 字符设备必须存在
BlockDevice 块设备必须存在
3、第三方存储卷配置
emptyDir和hostPath的数据并不能真正意义上保存,如果真正意义上保存还需要使用第三方存储。k8s支持的第三方后端存储有awsElasticBlockStore、azureDisk、cephfs、glusterfs、cinder、fc、iscsi、nfs、rbd、scaleIO等
具体支持的第三方设备及其配置参数可查看官方文档https://kubernetes.io/docs/concepts/storage/volumes/
以nfs为例
[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
kind: Pod
metadata:
name: pod-nfs
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: web-nfs
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: web-nfs
nfs:
path: /data/volume1
server: 192.168.1.51
验证
[root@master volume]# kubectl get po pod-nfs -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nfs 1/1 Running 0 18s 10.244.2.124 node1 <none> <none>
[root@master volume]# echo test-nfs-volume > /data/volume1/index.html
[root@master volume]# curl 10.244.2.124
test-nfs-volume
4、PV,PVC
管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim
PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。
4.1PV创建
[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
/data/volume2 192.168.1.0/24(rw,root_squash,sync)
/data/volume3 192.168.1.0/24(rw,root_squash,sync)
以nfs为例
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-volume1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/volume1
server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-volume2
spec:
accessModes:
- ReadOnlyMany
capacity:
storage: 5Gi
nfs:
path: /data/volume2
server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-volume3
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 3Gi
nfs:
path: /data/volume3
server: 192.168.1.51
验证
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv-volume1 10Gi RWO Retain Available 28s
test-pv-volume2 5Gi ROX Retain Available 55s
test-pv-volume3 3Gi RWX Retain Available 7s
- 存储类型
底层实际存储的类型,kubernetes支持多种存储类型,每种存储类型的配置都有所差异- 存储能力(capacity)
用于存储空间的设置- 访问模式(accessModes)
用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:- ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
- ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
- ReadWriteMany(RWX):读写权限,可以被多个节点挂载
需要注意的是,底层不同的存储类型可能支持的访问模式不同
- 回收策略(persistentVolumeReclaimPolicy)
当PV不再被使用了之后,对其的处理方式。目前支持三种策略:- Retain (保留) 保留数据,需要管理员手工清理数据
- Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
- Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
需要注意的是,底层不同的存储类型可能支持的回收策略不同
- 存储类别
PV可以通过storageClassName参数指定一个存储类别- 具有特定类别的PV只能与请求了该类别的PVC进行绑定
- 未设定类别的PV则只能与不请求任何类别的PVC进行绑定
- 状态(status)
一个 PV 的生命周期中,可能会处于4中不同的阶段:- Available(可用): 表示可用状态,还未被任何 PVC 绑定
- Bound(已绑定): 表示 PV 已经被 PVC 绑定
- Released(已释放): 表示 PVC 被删除,但是资源还未被集群重新声明
- Failed(失败): 表示该 PV 的自动回收失败
4.2PVC创建
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test1-volume
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
验证
[root@master volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
test-pv-volume1 10Gi RWO Retain Available 14m
test-pv-volume2 5Gi ROX Retain Available 14m
test-pv-volume3 3Gi RWX Retain Bound default/test1-volume 13m
[root@master volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test1-volume Bound test-pv-volume3 3Gi RWX 23s
4.3pod使用
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
namespace: default
spec:
containers:
- name: web
image: nginx:1.14
volumeMounts:
- name: test1-volume
mountPath: /usr/share/nginx/html
volumes:
- name: test1-volume
persistentVolumeClaim:
claimName: test1-volume
readOnly: false
验证
[root@master volume]# echo test1-pvc > /data/volume3/index.html
[root@master volume]# kubectl get po pod-pvc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-pvc 1/1 Running 0 94s 10.244.2.126 node1 <none> <none>
[root@master volume]# curl 10.244.2.126
test1-pvc
5、configMap
ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。
[root@master volume]# kubectl create cm wordpress --from-literal=wordpress-db-host=wordpress-mysql
configmap/wordpress created
[root@master volume]# kubectl get cm wordpress
NAME DATA AGE
wordpress 1 4m15s
6、secret
在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。
[root@master volume]# kubectl create secret generic wordpress --from-literal=wordpress-db-password=wordpresspwd --from-literal=mysql-root-password=wordpresspwd
[root@master volume]# kubectl get secret wordpress
NAME TYPE DATA AGE
wordpress Opaque 2 69s