643facf3a67f86c4dbdff0fb9b374a1d.gif

点击上方蓝字关注我们

643facf3a67f86c4dbdff0fb9b374a1d.gif

目录

前言

一、关于PV创建的流程

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

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

二、PV、PVC 使用示例

1.创建 PVC

2.创建 Pod,使用 PVC

3.创建 PV

前言 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

62fb9ee0a987a22580a2c5b0b6eadab8.png

一、关于 PV 创建的流程

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

由 Volume Controller 负责维护,不断地检查 每个 Pod 对应的 PV 和所在的宿主机的挂载情况。可以理解为创建了一块 NFS 磁盘,相当于执行
gcloud compute instances attach-disk < 虚拟机名字 > --disk < 远程磁盘名字 >
为了使用这块磁盘,还需要挂载操作2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount

将远程磁盘挂载到宿主机上,发生在 Pod 对应的宿主机上,是 kubelet 组件一部分,利用 goroutine 执行,不会阻塞,相当于执行
gcloud compute instances attach-disk < 虚拟机名字 > --disk < 远程磁盘名字 >
通过这个挂载操作,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

AccessModes 为 ReadWriteMany,表示这个 Volume 是可读写的,并且能挂载在多个节点上(官方支持的 AccessMode)
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cqh
spec:
  storageClassName: local-storage
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  selector:
    matchLabels:
      cqh: chenqionghe
执行创建后查看
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
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
总结
  1. PVC 和 PV 相当于面向对象的接口和实现
  2. 用户创建的 Pod 声明了 PVC,K8S会找一个 PV 配对,如果没有 PV,就去找对应的 StorageClass,帮它创建一个 PV,然后和 PVC 完成绑定
  3. 新创建的 PV,要经过 Master 节点 Attach 为宿主机创建远程磁盘,再经过每个节点 kubelet 组件把 Attach 的远程磁盘 Mount 到宿主机目录

出处:http://dwz.date/bvxj

4793dc3f063cba0c64b253202f5ee590.gif团购、优惠、课程详情扫码咨询>>> e58193a854fa86b46720f12d854935de.png 4793dc3f063cba0c64b253202f5ee590.gif 3b3cc1b3696827caf220bffd72f1798c.gif

●整理 kubernetes 各种问题汇总

●Docker 遇到的异常和注意点

●运维精华面试题

●安装 gin 出现的问题及解决和设置代理报错解决

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐