暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

八、存储卷使用

运维实习生 2021-12-03
363

1emptyDir

EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。

EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。

yaml
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 popod-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
......

2hostPath

HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

yaml
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 popod-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、第三方存储卷配置

emptyDirhostPath的数据并不能真正意义上保存,如果真正意义上保存还需要使用第三方存储。k8s支持的第三方后端存储有awsElasticBlockStoreazureDiskcephfsglusterfscinderfciscsinfsrbdscaleIO

具体支持的第三方设备及其配置参数可查看官方文档https://kubernetes.io/docs/concepts/storage/volumes/

>nfs为例

[root@master volume] vim /etc/exports
/data/volume1192.168.1.0/24(rw,root_squash,sync) 
yaml
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

 

4PVPVC

 管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolumePersistentVolumeClaim

 

PersistentVolumePV)是集群中由管理员配置的一段网络存储。它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个podAPI对象捕获存储实现的详细信息,包括NFSiSCSI或特定于云提供程序的存储系统。

 

PersistentVolumeClaimPVC)是由用户进行存储的请求。它类似于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为例

yaml
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

用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

> - ReadWriteOnceRWO):读写权限,但是只能被单个节点挂载

> - ReadOnlyManyROX):只读权限,可以被多个节点挂载

> - ReadWriteManyRWX):读写权限,可以被多个节点挂载


>- 回收策略(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创建

yaml
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

 

5configMap

ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。

[root@master volume] kubectl create cmwordpress --from-literal=wordpress-db-host=wordpress-mysql
configmap/wordpress created
[root@master volume] kubectl get cmwordpress
NAME DATA AGE
wordpress 1 4m15s

6secret

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 secretwordpress
NAME TYPE DATA AGE
wordpress Opaque 2 69s

 


文章转载自运维实习生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论