我一直相信画出图来再去了解比较直观,下面是我总结的k8s存储的分类,供参考
k8s的存储常用的就是上面几种模式,分为临时存储,半持久化存储,与持久化存储这三类,本章我们着重讲解emptydir与hostpath与pvc跟pv等
1 emptydir是什么
当pod的存储方案设定为emptydir的时候,pod启动时,就会在pod所在节点的磁盘空间开辟出一块空卷,最开始里面是什么都没有的,pod启动后容器产生的数据会存放到那个空卷中。空卷变成了一个临时卷
供pod内的容器读取和写入数据,一旦pod容器消失,节点上开辟出的这个临时卷就会随着pod的销毁而销毁
2 emptydir的用途
一般来说emptydir的用途都是用来充当临时存储空间,例如一些不需要数据持久化的微服务,我们都可以用emptydir来当做微服务pod的存储方案
3 emptydir例子
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: test-pd 5 spec: 6 containers: 7 - image: k8s.gcr.io/test-webserver 8 name: test-container 9 volumeMounts: 10 - mountPath: /cache #挂载到容器中的路径 11 name: cache-volume 12 volumes: 13 - name: cache-volume 14 emptyDir: {} #指定存储方式为emptydir
1 hospath 是什么
hostPath类型则是映射node文件系统中的文件或者目录到pod里。在使用hostPath类型的存储卷时,也可以设置type字段,支持的类型有文件、目录、File、Socket、CharDevice和BlockDevice(我只映射过文件与目录)。
其实这个功能就相当于docker中的-v 目录映射,只不过在k8s中的时候,pod会漂移,当pod漂移到其他node节点的时候,pod不会跨节点的去读取目录。所以说hostpath只能算一种半持久化的存储方式
2 hostpath用途
3 hostpath 例子
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: test-pd 5 spec: 6 containers: 7 - image: k8s.gcr.io/test-webserver 8 name: test-container 9 volumeMounts: 10 - mountPath: /test-pd 11 name: test-volume 12 volumes: 13 - name: test-volume 14 hostPath: 15 # directory location on host 16 path: /data #node节点上的路径 17 # this field is optional 18 type: Directory #path的属性,下面会介绍可选属性的值
上面介绍了俩种临时存储于半持久化存储的方案。在k8s实际生产环境中,一般会选用私有云持久化存储方案还有公有云持久化存储方案,私有云存储方案包括nfs,ceph,glusterfs等方案。公有云存储会用到AWS等方案
存储方案各有各的优缺点,可参考https://www.cnblogs.com/yswenli/p/7234579.html这篇文章。今天我们主要讲解pvc,pv,nfs之间的关系。
简单来说,要使用持久化存储,就需要使用pvc去跟pv去申请,然后pv查看自己有没有合适的存储空间卷,有合适的就与pvc进行绑定。pv与pvc是一一对应绑定的。现在我们用一幅图来说明pvc,pv,nfs的关系
针对上面的图做一下说明
1 pod的yaml中先指明存储选择pvc申请方式
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: pvnginx 5 labels: 6 app: pvnginx 7 spec: 8 containers: 9 - name: my-pvnginx 10 image: nginx 11 ports: 12 - name: http 13 containerPort: 80 14 - name: https 15 containerPort: 443 16 volumeMounts: 17 - name: html 18 mountPath: /data/html 19 volumes: 20 - name: html 21 persistentVolumeClaim: #指明使用pvc模式 22 claimname: mypvc #指明使用的pvc名称,下面我们需要建一个叫做mypvc的yaml资源
2 创建一个叫做mypvc的pvc yaml资源
1 apiVersion: v1 2 kind: persisitentVolumeClaim 3 metadata: 4 name: mypvc 5 namespace: default 6 spec: 7 accessmodes: ["ReadWriteMany"] #一共有三种模式,下面会一一说明 8 resources: #指定资源说明 9 requests: #指定请求 10 storage: 4Gi #指定请求存储空间的大小
* ReadWriteOnce – PV以 read-write 挂载到一个节点
* ReadOnlyMany – PV以read-only方式挂载到多个节点
* ReadWriteMany – PV以read-write方式挂载到多个节点
3 设置符合条件的pv
1 apiVersion: v1 2 kind: PersistentVolume 3 metadata: 4 name: pv01 5 labels: 6 name: pv01 7 spec: 8 accessModes: ["ReadWriteMany"] 9 capacity: 10 storage: 5Gi 11 12 nfs: 13 server: 192.168.115.6 14 path: /home
4 nfs创建存储卷
NFS 是Network File System的缩写,即网络文件系统。Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。
1 # yum -y install nfs-util* 2 # cat /etc/exports 3 /home 192.168.115.0/24(rw,sync,no_root_squash) 4 # systemctl start rpcbind 5 # systemctl start nfs 6 # showmount -e 127.0.0.1 7 Export list for 127.0.0.1: 8 /home 192.168.115.0/24
上面就是创建私有云存储方案的一个例子。当我们要使用持久化存储的时候,大体步骤是这样的
原文:https://www.cnblogs.com/mhy-blog/p/10831311.html