1、emptyDir
EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。
yamlapiVersion: v1kind: Podmetadata:name: pod-emptydirnamespace: defaultspec:containers:-name: webimage: nginx:1.14volumeMounts:-name: web-volumemountPath: /usr/share/nginx/htmlreadOnly: true-name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand:-"/bin/sh"args:-"-c"-"while true;do echo $(date) >> /data/index.html;sleep 1;done"volumeMounts:-name: web-volumemountPath: /datavolumes:-name: web-volumeemptyDir:medium: MemorysizeLimit: 10Mi
验证
[root@master volume] kubectl get popod-emptydir -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-emptydir 2/2 Running 0 29s 10.244.1.132 node2 <none> <none>[root@master volume] curl 10.244.1.132Thu Dec 2 14:01:16 UTC 2021Thu Dec 2 14:01:17 UTC 2021Thu Dec 2 14:01:18 UTC 2021......
2、hostPath
HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。
yamlapiVersion: v1kind: Podmetadata:name: pod-hostpathnamespace: defaultspec:containers:-name: webimage: nginx:1.14volumeMounts:-name: web-hostpathmountPath: /usr/share/nginx/htmlreadOnly: truevolumes:-name: web-hostpathhostPath:path: /data/webtype: DirectoryOrCreate
验证
[root@master volume] kubectl get popod-hostpath -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-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.134myWeb_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/volume1192.168.1.0/24(rw,root_squash,sync)
yamlkind: Podmetadata:name: pod-nfsnamespace: defaultspec:containers:-name: webimage: nginx:1.14volumeMounts:-name: web-nfsmountPath: /usr/share/nginx/htmlreadOnly: truevolumes:-name: web-nfsnfs:path: /data/volume1server: 192.168.1.51
验证
[root@master volume] kubectl get po pod-nfs-o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-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.124test-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/volume1192.168.1.0/24(rw,root_squash,sync)/data/volume2192.168.1.0/24(rw,root_squash,sync)/data/volume3192.168.1.0/24(rw,root_squash,sync)
>以nfs为例
yamlapiVersion: v1kind: PersistentVolumemetadata:name: test-pv-volume1spec:capacity:storage: 10GiaccessModes:-ReadWriteOncenfs:path: /data/volume1server: 192.168.1.51---apiVersion: v1kind: PersistentVolumemetadata:name: test-pv-volume2spec:accessModes:-ReadOnlyManycapacity:storage: 5Ginfs:path: /data/volume2server: 192.168.1.51---apiVersion: v1kind: PersistentVolumemetadata:name: test-pv-volume3spec:accessModes:-ReadWriteManycapacity:storage: 3Ginfs:path: /data/volume3server: 192.168.1.51
验证
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEtest-pv-volume1 10Gi RWO Retain Available 28stest-pv-volume2 5Gi ROX Retain Available 55stest-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创建
yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: test1-volumenamespace: defaultspec:accessModes:-ReadWriteManyresources:requests:storage: 2Gi
验证
[root@master volume] kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEtest-pv-volume1 10Gi RWO Retain Available 14mtest-pv-volume2 5Gi ROX Retain Available 14mtest-pv-volume3 3Gi RWX Retain Bound default/test1-volume 13m[root@master volume] kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEtest1-volume Bound test-pv-volume3 3Gi RWX 23s
4.3pod使用
apiVersion: v1kind: Podmetadata:name: pod-pvcnamespace: defaultspec:containers:-name: webimage: nginx:1.14volumeMounts:-name: test1-volumemountPath: /usr/share/nginx/htmlvolumes:-name: test1-volumepersistentVolumeClaim:claimName: test1-volumereadOnly: false
验证
[root@master volume] echo test1-pvc >/data/volume3/index.html[root@master volume] kubectl get po pod-pvc-o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-pvc 1/1 Running 0 94s 10.244.2.126 node1 <none> <none>[root@master volume] curl 10.244.2.126test1-pvc
5、configMap
ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。
[root@master volume] kubectl create cmwordpress --from-literal=wordpress-db-host=wordpress-mysqlconfigmap/wordpress created[root@master volume] kubectl get cmwordpressNAME DATA AGEwordpress 1 4m15s
6、secret
在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。
[root@master volume] kubectl create secretgeneric wordpress --from-literal=wordpress-db-password=wordpresspwd--from-literal=mysql-root-password=wordpresspwd[root@master volume] kubectl get secretwordpressNAME TYPE DATA AGEwordpress Opaque 2 69s




