首页 > kubernetes(k8s) > kubernetes之pv与pvc
2019
10-11

kubernetes之pv与pvc

1.PersistentVolume (PV)

创建pv前,请先创建其使用的外部持久化存储设备,当前pv支持的外volume插件有

PV 访问模式

PersistentVolume 可以以资源提供者支持的任何方式挂载到主机上。如下表所示,供应商具有不同的功能,每个 PV 的访问模式都将被设置为该卷支持的特定模式。例如,NFS 可以支持多个读/写客户端,但特定的 NFS PV 可能 以只读方式导出到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式

  • ReadWriteOnce——该卷可以被单个节点以读/写模式挂载
  • ReadOnlyMany——该卷可以被多个节点以只读模式挂载
  • ReadWriteMany——该卷可以被多个节点以读/写模式挂载

在命令行中,访问模式缩写为:

  • RWO – ReadWriteOnce
  • ROX – ReadOnlyMany
  • RWX – ReadWriteMany

pv的回收策略

  • Retain(保留)——手动回收
  • Recycle(回收)——基本擦除( rm -rf /thevolume/* ) (已废弃)
  • Delete(删除) ——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除

当前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略

PV状态

  • Available(可用)——一块空闲资源还没有被任何声明绑定
  • Bound(已绑定)——卷已经被声明绑定
  • Released(已释放)——声明被删除,但是资源还未被集群重新声明
  • Failed(失败)——该卷的自动回收失败

命令行会显示绑定到 PV 的 PVC 的名称

持久化演示说明 – NFS

1.安装nfs(每个节点都要安装)

2.部署创建pv(创建多个)

创建成功

创建服务并使用 PVC(pvc简单来说就是,匹配pv的一些属性准则)

当前我们创建的PVC会去pv资源点里首先查找 命名空间 为 nfs 的 pv 集合,然后匹配访问模式为 ReadWriteOnce 的pv ,然后 匹配存储空间大小,大于或者等于1G的pv,来作为vloume对nginx进行挂载,我们有2个副本,所以也应当有2个对应的pv被绑定。

挂载目录为:将匹配的pv的目录挂载到nginx容器的/usr/share/nginx/html目录位置,用来作为nginx的web存储目录。

查看pvc 与 pv

查看pv绑定到了哪个目录

下来验证下是否挂载成功了

在nfs机器的pv1目录里新建个文件

登录web-0容器查看

说明挂载没问题

下来我们访问下web-0

刚才创建的index.html已经访问到了

关于 StatefulSet

关于statefulset深入理解,这里有个大佬写的很好,传送门

  • statefulset匹配 Pod name ( 网络标识 ) 的模式为:$(statefulset名称)-$(序号),比如上面:web-0 web-1
  • StatefulSet为每个 Pod 副本创建了一个 DNS 域名,这个域名的格式为: $(podname).(headless servername),也就意味着服务间是通过Pod域名来通信而非 Pod IP,因为当Pod所在Node发生故障时, Pod 会被飘移到其它 Node 上,Pod IP 会发生变化,但是 Pod 域名不会有变化 例如:ping web-0.nginx
  • StatefulSet 使用 Headless 服务来控制 Pod 的域名,这个域名的 FQDN 为:$(servicename).$(namespace).svc.cluster.local(无头符),其中,”cluster.local” 指的是集群的域名 例:dig -t A nginx.default. svc.cluster.local @coreDns ip
  • 根据 volumeClaimTemplates,为每个 Pod 创建一个 pvc,pvc 的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的 volumeMounts.name=www, Podname=web-[0-2],因此创建出来的 PVC 是 www-web-0、www-web-1、www-web-2

另外删除 Pod 不会删除其 pvc,手动删除 pvc 将自动释放 pv

删除pod

删除svc 和 pvc

查看pv

看到没,他已经开始回收数据了

手动帮他回收

删掉这段

注意:如果你没有手动帮他回收,他的状态一直是Released回收状态,这个时候你再重新应用yaml文件,pod一直会显示pending状态,因为你没有释放,当前pv一直被上一次的pod占用。新的pod接入不进来。就会卡着。提示错误是找不到挂载的pv类型只有当pv状态为可用Released,新的pod才会匹配成功

Statefulset的启停顺序:

  • 有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序地创建(从0到N-1)并且,在下一个 Pod运行之前所有之前的Pod必须都是Running和Ready状态。
  • 有序删除:当Pod被删除时,它们被终止的顺序是从N-1到0。
  • 有序扩展:当对Pod执行扩展操作时,与部署一样,它前面的Pod必须都处于Running和Ready状态。

StatefulSet使用场景:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现
  • 稳定的网络标识符,即 Pod 重新调度后其 PodName 和 HostName 不变。
  • 有序部署,有序扩展,基于 init containers 来实现。
  • 有序收缩。

回顾创建的整个流程(重要)

下面是个人根据理解,画出的pv和pvc的工作图(如有不正确之处,还请指正)

最后编辑:
作者:shooter
这个作者貌似有点懒,什么都没有留下。