K8S引入了一组叫作Persistent Volume Claim(PVC)和Persistent Volume(PV)的API对象,大大降低了用户声明和使用持久化Volume的门槛。
在Pod的Volumes中,只要声明类型是persistentVolumeClaim,指定PVC的名字,当创建这个PVC对象,k8s就自动为它绑定一个符合条件的Volume,这个Volume,从PV来

PVC和PV的设计,类似“接口”和“实现”的思想,开发者只知道使用“接口”PVC,运维人员负责给“接口”绑定具体的实现PV,说白了PVC就是一种特殊的Volume

PVC和PV的实现原理
PVC:描述 Pod想要使用的持久化属性,比如存储大小、读写权限等
PV:描述一个具体的Volume属性,比如Volume的类型、挂载目录、远程存储服务器地址等
StorageClass:充当PV的模板,自动为PVC创建PV

一、关于PV创建的流程

大多数情况,持久化Volume的实现,依赖于远程存储服务,如远程文件存储(NFS、GlusterFS)、远程块存储(公有云提供的远程磁盘)等。
K8s需要使用这些存储服务,来为容器准备一个持久化的宿主机目录,以供以后挂载使用,创建这个目录分为两阶段:

1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach

由Volume Controller负责维护,不断地检查 每个Pod对应的PV和所在的宿主机的挂载情况。可以理解为创建了一块NFS磁盘,相当于执行

gcloud compute instances attach-disk < 虚拟机名字 > --disk < 远程磁盘名字 >

为了使用这块磁盘,还需要挂载操作

2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount

将远程磁盘挂载到宿主机上,发生在Pod对应的宿主机上,是kubelet组件一部分,利用goroutine执行,不会阻塞主我看一下
相当于执行

mount -t nfs <NFS 服务器地址 >:/ /var/lib/kubelet/pods/<Pod 的 ID>/volumes/kubernetes.io~<Volume 类型 >/<Volume 名字 > 

通过这个挂载操作,Volume的宿主机目录就成为了一个远程NFS目录的挂载点,以后写入的所有文件,都会被保存在NFS服务器上
如果是已经有NFS磁盘,第一步可以省略.

同样,删除PV的时候,也需要Umount和Dettach两个阶段处理

二、PV、PVC使用示例

1.创建PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cqh
  labels:
    cqh: chenqionghe
spec:
  capacity:
    storage: 100Mi
  volumeMode: Filesystem
  accessModes: ["ReadWriteMany"]
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /data/pv
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: cqh
          operator: In
          values:
          - chenqionghe

创建后查看

root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM         STORAGECLASS    REASON    AGE
cqh       100Mi      RWX            Delete           Bound     default/cqh   local-storage             4m

2.创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cqh
spec:
  storageClassName: local-storage
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  selector:
    matchLabels:
      cqh: chenqionghe

AccessModes为ReadWriteMany,表示这个Volume是可读写的,并且能挂载在多个节点上(官方支持的AccessMode)

执行创建后查看

root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS    AGE
cqh       Bound     cqh       100Mi      RWX            local-storage   4m

3.创建Pod,使用PVC

apiVersion: v1
kind: Pod
metadata:
  name: cqh
spec:
  containers:
    - name: cqh-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-storage
  volumes:
    - name: pv-storage
      persistentVolumeClaim:
        claimName: cqh

创建后查看

NAME                    READY     STATUS    RESTARTS   AGE       IP            NODE            NOMINATED NODE
cqh                     1/1       Running   0          4m        10.244.0.46   vm-0-8-ubuntu   <none>
root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl describe po cqh
Name:               cqh
Namespace:          default
...
Volumes:
  pv-storage:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  cqh
    ReadOnly:   false
  default-token-gqfrx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-gqfrx
    Optional:    false
...
Events:
  Type    Reason     Age   From                    Message
  ----    ------     ----  ----                    -------
  Normal  Scheduled  4m    default-scheduler       Successfully assigned default/cqh to vm-0-8-ubuntu
  Normal  Pulling    4m    kubelet, vm-0-8-ubuntu  pulling image "nginx"
  Normal  Pulled     4m    kubelet, vm-0-8-ubuntu  Successfully pulled image "nginx"
  Normal  Created    4m    kubelet, vm-0-8-ubuntu  Created container
  Normal  Started    4m    kubelet, vm-0-8-ubuntu  Started container

Kubernetes中的PV和PVC的更多相关文章

  1. Kubernetes 中的pv和pvc

    原文地址:http://www.cnblogs.com/leidaxia/p/6485646.html 持久卷 PersistentVolumes 本文描述了 Kubernetes 中的 Persis ...

  2. Kubernetes中的PV和PVC是啥

    K8S引入了一组叫作Persistent Volume Claim(PVC)和Persistent Volume(PV)的API对象,大大降低了用户声明和使用持久化Volume的门槛. 在Pod的Vo ...

  3. kubernetes系列11—PV和PVC详解

    本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个A ...

  4. Kubernetes集群PV和PVC详解

    Kubernetes集群高级存储资源PV及PVC 文章目录 Kubernetes集群高级存储资源PV及PVC 1.高级存储PV和PVC概念部分 2.PV和PVC资源的生命周期 3.PV资源介绍与案例配 ...

  5. Kubernetes 系列(六):持久化存储 PV与PVC

    在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同 ...

  6. Kubernetes PV与PVC的关系

    Kubernetes PV与PVC的关系 PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理,分为有静态与动态.PersistentVolumeClaim ...

  7. 09 . Kubernetes之pv、pvc及使用nfs网络存储应用

    PV,PVC概述 PV的全称是: PersistentVolume (持久化卷),是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如Ceph.G ...

  8. kubernetes存储类与PV与PVC关系及实践

    StorageClass & PV & PVC关系图 Volumes是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们也可以编写自己的存储插件来支持特 ...

  9. kubernetes 使用 PV 和 PVC 管理数据存储

    文章链接 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的状态)重 ...

随机推荐

  1. UICollectionView中的cell 左对齐

    项目中使用UICollectionView做布局,会发现当某个section只有一个cell的时候cell会居中显示,而项目中都是居左显示,这就需要对UICollectionView的布局做些处理,首 ...

  2. Task底层实现原理探秘

    .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能, 在底层使用ThreadPool. 任务表示应完成的某个单元的工作. 这个单元的工作可以在单独的线 ...

  3. BZOJ1491 [NOI2007]社交网络[最短路计数]

    $n$非常的小,结合题目计算式可以想到$O(n^3)$暴枚$s,t,v$,看$v$在不在$s\to t$最短路上($dis_{s,v}+dis_{v,t}=dis_{s,v}$是$v$在两点最短路上的 ...

  4. React造轮子:拖拽排序组件「Dragact」

    先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...

  5. PHP下查询游戏《Minecraft》多人游戏 服务器的人数。

    废话不多说,直接上图: 作为一个优雅的Minecraft服务器,肯定需要官网的嗯. 很多服务器的官网都有显示当前服务器在线人数,延迟,每一个子服在线人数,甚至出了个流量图. 我们不搞花里胡哨的查询人数 ...

  6. 一秒钟解决mysql使用游标出现取值乱码问题

    drop procedure if exists pro_test; delimiter // create procedure pro_test() begin declare str varcha ...

  7. HTML 获取class里的多个值 和 dataset的使用

    属性:classList var x = event.target; console.log(x); console.log(x.classList); 可以发现 获取了全部的class里的值 获取单 ...

  8. 35. ClustrixDB 减少device1大小

    ClustrixDB中的device1文件用于所有数据库数据.撤消日志.临时表.binlog和ClustrixDB系统对象.ClustrixDB确保device1文件在集群的所有节点上大小相同.一旦得 ...

  9. ueditor编辑器+粘贴word

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...

  10. Ubuntu:笔记本计算机屏幕合盖后进入/不进入休眠设置

    造冰箱的大熊猫,本文在Ubuntu 18.04上验证通过@cnblogs 2019/5/12 1.问题描述 安装有Ubuntu的笔记本计算机与KVM控制器相连,同时一台台式机也与KVM相连.启动笔记本 ...