0
点赞
收藏
分享

微信扫一扫

部署k8s集群存储-数据卷


Volume: 数据卷

kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。volume的生命周期与pod的生命周期相同,pod内的容器停止和重启时一般不会影响volume中的数据。所以一般volume被用于持久化pod产生的数据。

volume类型有多种本次介绍常用的两种:

emptyDir

emptyDir的生命周期与所属的pod相同。
pod删除时,其emptyDir中的数据也会被删除。

emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配一个目录,因此无需指定宿主机node上对应的目录文件。

适用场合:emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

示例:

1、编写yaml文件(运行两个容器)

kind: Pod
apiVersion: v1
metadata:
name: producer-consumer
spec:
containers:
- name: producer
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /producer_dir
name: shared-volume
args:
- /bin/sh
- -c
- echo "hello world" > /producer_dir/hello.txt ; sleep 30000

- name: consumer
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /consumer_dir
name: shared-volume
args:
- /bin/sh
- -c
- cat /consumer_dir/hello.txt ;sleep 30000

volumes:
- name: shared-volume
emptyDir: {}

2、验证:

部署k8s集群存储-数据卷_docker


部署k8s集群存储-数据卷_容器_02


第二个容器,可以查看到刚创建的文件,即:多个容器的共享目录

部署k8s集群存储-数据卷_运维_03


docker inspect e8fdb49412e0

部署k8s集群存储-数据卷_容器_04


查看到本地路径,有刚在容器创建的文件

部署k8s集群存储-数据卷_运维_05


部署k8s集群存储-数据卷_容器_06


删除pod

部署k8s集群存储-数据卷_k8s_07


本地目录也被清除

部署k8s集群存储-数据卷_kubernetes_08


hostPath

将主机节点的文件系统中的文件或目录挂载到集群中。

相对于emtpyDir来说,hostPath就等于运行容器是使用的命令:

docker run -v /host/path:/container/path

除了path属性之外,用户还可以指定type:
空 空字符串(默认),挂载hostPath卷之前不会执行任何检查
DirectoryOrCreate 如果指定的位置没有目录,将创建空目录,权限755,与kubelet具有相同的所有权
Directory 指定的位置必须存在目录
FileOrCreate 如果指定的位置没有文件,将创建空文件,权限644,与kubelet具有相同的所有权
File 指定的位置必须存在文件
Socket 指定的位置必须存在Unix套接字
CharDevice 指定的位置必须存在字符设备
BlockDevice 指定的路径下必须存在块设备

//这里没有创建新的yaml文件,直接将emptyDir.yaml文件的volumes字段更改为:hostPath.

[root@node01 volume]# mkdir /data/hostPath -p

---省略部分同上---
volumes:
- name: shared-volume
hostPath:
path: "/data/hostPath"
type: Directory

特殊存储卷

NFS卷:

为什么用它?解决单个node宕机,本机的挂载目录也随之不可用,在其他node新建pod,也没有数据的问题。

怎么用? 将目录挂载到远端一台NFS服务器,node宕机,其他节点新建的pod,也可使用数据,数据不会丢失!

部署k8s集群存储-数据卷_docker_09


PV与PVC:

部署k8s集群存储-数据卷_kubernetes_10

PV(Persistent Volume) 持久化卷,是对底层的共享存储的一种抽象。PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

PVC(Persistent Volume Claim) 是持久卷声明,是用户对于存储需求的一种声明。其实就是用户向kubernetes系统发出的一种资源需求申请。

示例:这里将NFS服务部署在master节点上,需要在master节点上提前规划好共享的目录

创建流程四步骤:创建pv - pvc - pod

1、部署NFS服务

yum install nfs-utils rpcbind -y

[root@master ~]# mkdir /nfsdata
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)

[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl enable rpcbind
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server

2、创建pv1.yaml文件

kind: PersistentVolume 
apiVersion: v1
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata
server: 172.16.0.168

重要参数释义:
capacity最大容量:目前只支持存储空间大小的设置( storage=1Gi )
accessModes访问模式:底层不同的存储类型可能支持的访问模式不同
ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
ReadWriteMany(RWX):读写权限,可以被多个节点挂载
persistentVolumeReclaimPolicy持久卷回收策略:
Retain (保留) 保留数据,需要管理员手工清理数据
Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
storageClassName存储类别:
具有特定类别的PV只能与请求了该类别的PVC进行绑定
未设定类别的PV则只能与不请求任何类别的PVC进行绑定

使用命令生成pv:
kubectl apply -f pv1.yaml

3、创建一个PVC,向刚才的PV申请使用空间
pvc.yaml

kind: PersistentVolumeClaim 
apiVersion: v1
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs
resources:
requests:
storage: 1Gi

4、创建一个Pod,来使用上述PVC

kind: Pod 
apiVersion: v1
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 30000
volumeMounts:
- mountPath: "/data"
name: mydata
volumes:
- name: mydata
persistentVolumeClaim:
claimName: pvc1

命令执行三个yaml文件:
kubectl apply -f pod.yaml

验证:注意看status变化

部署k8s集群存储-数据卷_运维_11

部署k8s集群存储-数据卷_k8s_12


在NFS服务器(即master)创建测试文件

部署k8s集群存储-数据卷_运维_13


进入容器(node1)查看到,刚创建的文件

部署k8s集群存储-数据卷_kubernetes_14


举报

相关推荐

0 条评论