容器技术:用NFS,成共享存储。
Posted 杭州网银互联
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器技术:用NFS,成共享存储。相关的知识,希望对你有一定的参考价值。
文/张章
什么是PV?
Persistent Volume(持久化卷)简称PV, 是一个K8S资源对象,我们可以单独创建一个PV, 它和Pod没有直接关系, 而是通过 Persistent Volume Claim, 简称PVC来实现动态绑定, 我们会在Pod定义里指定创建好的PVC, 然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。
持久化卷下的PV和PVC概念
Persistent Volume(PV)是由管理员设置的存储,它是群集的一部分。
就像节点是集群中的资源一样,PV 也是集群中的资 源。
PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。
此 API 对象包含存储实现的细节,即 NFS、 iSCSI 或特定于云供应商的存储系统。
PersistentVolumeClaim(PVC)是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。
Pod 可以 请求特定级别的资源(CPU 和内存)。
PVC声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂 载)。
它和普通Volume的区别是什么呢?
普通Volume和使用它的Pod之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的Volume。
Volume是Pod 的附属品,我们无法单独创建一个Volume,因为它不是一个独立的K8S资源对象。
接下来我们通过一个小实验来实现nfs座位共享存储。
实验操作
1 准备一台机器,搭建NFS服务
[root@k8s-master ~]# yum install nfs-utils
[root@k8s-master ~]# vim /etc/exportfs
/data/k8s/ 172.7.15.0/24(sync,rw,no_root_squash)
[root@k8s-master ~]# systemctl start nfs;systemctl enable nfs
2 在node节点上测试
Yum安装nfs客户端
[root@k8s-node2 ~]# yum install nfs-utils
验证nfs是否通畅(弹出如下内容就是通畅的)
[root@k8s-node2 ~]# showmount -e 192.168.4.4
Export list for 192.168.4.4:
/data/k8s 192.168.4.0/24
3 创建pv(master上)
编辑创建pv的yaml文件
[root@k8s-master ~]# vim mypv.yaml //内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 10Gi #PV的容量为5G
accessModes: #设置pv的访问权限
- ReadWriteMany #权限为读写
nfs: #设置pv的存储方式为nfs
path: /data/k8s #设置nfs服务端开放出来的存储路径
使用如下命令创建pv
[root@k8s-master ~]# kubectl create -f mypv.yaml
查看创建的pv(如下内容为创建成功)
[root@k8s-master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 10Gi RWX Retain Available 10m
状态为Available,这是因为它还没有绑定到任何的pvc上面,当定义完pvc后,就可以自动绑定了。
4 创建pvc(master上)
编辑创建pvc的yaml文件
[root@k8s-master ~]# vim mypvc.yaml //内容如下
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteManyi #对nfs文件夹有读写权限
resources:
requests:
storage: 8Gi
用如下命令创建pvc
[root@k8s-master ~]# kubectl create -f mypvc.yaml
查看PVC是否创建成功(如下内容为成功)
[root@k8s-master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myclaim Bound pv001 10Gi RWX 2m
可以看到,pvc状态为Bound,它绑定了pv001
5 定义pod
定义和存储关联的pod
[root@k8s-master ~]# vim pvpod.yaml //内容如下
apiVersion: v1
kind: Pod
metadata:
name: httpd-pvpod
spec:
containers:
- image: httpd #镜像名称
name: httpd-withpvc-pod #httpd的镜像路径
imagePullPolicy: Always
volumeMounts:
- mountPath: "/usr/local/apache2/htdocs/" #httpd镜像内的路径
name: httpd-volume #引用下面volumes中name字段的名称
volumes:
- name: httpd-volume
persistentVolumeClaim:
claimName: myclaim # mypvc.yaml中name字段的名称
[root@k8s-master ~]# kubectl create -f pvpod.yaml
[root@k8s-master ~]# kubectl describe pod httpd-pvpod //查看Volumes那部分里的ClaimName
6 验证
到NFS的共享目录下创建一个文件
[root@k8s-master ~]# cd /data/k8s/ echo "Test file" > 1.html
进入到httpd-pod里 查看是否有1.html文件并且内容为Test file
[root@k8s-master ~]# kubectl exec -it httpd-pvpod bash
[root@k8s-master ~]# cat /usr/local/apache2/htdocs/1.html
总结
至此我们就完成了手动创建pv,pvc并和pod相关联,在生产环境中如果每次想给pod挂存储卷都进行手动挂载显然是很消耗人力和成本。
在网银互联牵头出版的《互联网企业容器技术实践》一书中,酷家乐在讲述容器化之路里也有提到这一块的内容,解释了PV和PVC怎么样提供了方便的持久化卷。
说明了Kubernetes中PV支持静态配置以及动态配置,动态卷配置可以根据需要动态地创建存储卷。
对于静态配置方式,集群管理员必须手动调用云或存储服务提供商的接口来配置新的固定大小的Image存储卷,然后创建PV对象在Kubernetes中请求分配使用它们。
再通过动态卷配置,能自动化地完成以上两步骤,它无须集群管理员预先配置存储资源,而是使用StorageClass对象指定的供应商来动态配置存储资源。
酷乐家使用Ceph RBD为Kubernetes集群提供存储卷。
此书由网易、酷家乐、网银互联、纵横新创、九言科技、沃趣科技、搜道网、个推以及美丽联合集团共9家科技公司十几位位技术人员共同撰写,以实践和应用为导向,清晰而有深度的讲解容器技术。
好书即将上线,尽请关注。
以上是关于容器技术:用NFS,成共享存储。的主要内容,如果未能解决你的问题,请参考以下文章
k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC