zoukankan      html  css  js  c++  java
  • Kubernetes 第十一章 PV/PVC/StorageClass

    PV/PVC/StorageClass

    管理存储是管理计算的一个明显问题。PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolumePersistentVolumeClaim

    PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置它是集群中的资源,就像节点是集群资源一样。PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。

    PersistentVolumeClaim(PVC)是由用户进行存储的请求。它类似于一个pods。Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。

    最终实现数据的持久化

     PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供网络存储资源,而 PVC 请求存储资源。这样,设置持久化的工作流包括配置底层文件系统或者云数据卷、创建持久性数据卷、最后创建 PVC 来将 Pod 跟数据卷关联起来。PV 和 PVC 可以将 pod 和数据卷解耦,pod 不需要知道确切的文件系统或者支持它的持久化引擎,pvc 定义PV 。通过声明方式让 pod 调用。

    Volume 生命周期

    Volume 生命周期
    Volume 的生命周期包括 5 个阶段
    Provisioning,即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
    Binding,将 PV 分配给 PVC
    Using,Pod 通过 PVC 使用该 Volume,并可以通过准入控制 StorageObjectInUseProtection(1.9 及以前版本为 PVCProtection)阻止删除正在使用的 PVC
    Releasing,Pod 释放 Volume 并删除 PVC
    Reclaiming,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除
    Deleting,删除 PV 并从云存储中删除后段存储
    根据这 5 个阶段,Volume 的状态有以下 4 种
    Available:可用
    Bound:已经分配给 PVC
    Released:PVC 解绑但还未执行回收策略
    Failed:发生错误

     

    使用NFS 测试

    [root@kube yum.repos.d]# yum install -y nfs-utils   //安装服务
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    .......
    
    [root@kube data]# cat /etc/exports   //编辑配置文件
    /nfs/data 10.2.61.0/24(rw,no_root_squash,sync)
    [root@kube data]# 
    #启动服务
    systemctl restart rpcbind && systemctl enable rpcbind
    systemctl restart nfs && systemctl enable nfs

    //安装客户端也是通过 yum install -y nfs-utils

    nfs 创建多个挂载点

    [root@kube data]# exportfs
    /nfs/data/v1      10.2.61.0/24
    /nfs/data/v2      10.2.61.0/24
    /nfs/data/v3      10.2.61.0/24
    /nfs/data/v4      10.2.61.0/24
    /nfs/data/v5      10.2.61.0/24
    /nfs/data/v6      10.2.61.0/24
    /nfs/data/v7      10.2.61.0/24
    /nfs/data/v8      10.2.61.0/24
    /nfs/data/v9      10.2.61.0/24
    [root@kube data]# 
    [root@kube data]# systemctl restart rpcbind && systemctl restart nfs
    [root@kube data]# 

    创建PV

    [root@kube pv-pvc]# cat p1.yaml 
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv0001
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: slow
      nfs:
        path: /nfs/data/v1
        server: 10.2.61.21
    [root@kube pv-pvc]# 
    [root@kube pv-pvc]# kubectl get pv
    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pv0001   5Gi        RWO            Recycle          Available           slow                    20s
    [root@kube pv-pvc]# 

    PV 的访问模式(accessModes)有三种:
    PV 的访问模式(accessModes)有三种:
    ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个节点挂载。
    ReadOnlyMany(ROX):可以以只读的方式被多个节点挂载。
    ReadWriteMany(RWX):这种存储可以以读写的方式被多个节点共享。不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在 PVC 绑定 PV 时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。
    PV 的回收策略
    PV 的回收策略(persistentVolumeReclaimPolicy,即 PVC 释放卷的时候 PV 该如何操作)也有三种
    Retain,不清理, 保留 Volume(需要手动清理)
    Recycle,删除数据,即 rm -rf /thevolume/*(只有 NFS 和 HostPath 支持)
    Delete,删除存储资源,比如删除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
    StorageClass

    上面通过手动的方式创建了一个 NFS Volume,这在管理很多 Volume 的时候不太方便。Kubernetes 还提供了 StorageClass 来动态创建 PV,不仅节省了管理员的时间,还可以封装不同类型的存储供 PVC 选用。

    StorageClass 包括四个部分

    • provisioner:指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/glusterfs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。

    • mountOptions:指定挂载选项,当 PV 不支持指定的选项时会直接失败。比如 NFS 支持 hardnfsvers=4.1 等选项。

    • parameters:指定 provisioner 的选项,比如 kubernetes.io/aws-ebs 支持 typezoneiopsPerGB 等参数。

    • reclaimPolicy:指定回收策略,同 PV 的回收策略。

    在使用 PVC 时,可以通过 DefaultStorageClass 准入控制设置默认 StorageClass, 即给未设置 storageClassName 的 PVC 自动添加默认的 StorageClass。而默认的 StorageClass 带有 annotation storageclass.kubernetes.io/is-default-class=true

    创建  PVC

    PV 是存储资源,而 PersistentVolumeClaim (PVC) 是对 PV 的请求。PVC 跟 Pod 类似:Pod 消费 Node 资源,而 PVC 消费 PV 资源;Pod 能够请求 CPU 和内存资源,而 PVC 请求特定大小和访问模式的数据卷。

    [root@kube pv-pvc]# cat pvc-demo.yaml 
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
      storageClassName: slow
    
    [root@kube pv-pvc]# 
    [root@kube pv-pvc]# vim pvc-demo.yaml 
    [root@kube pv-pvc]# kubectl apply -f pvc-demo.yaml 
    persistentvolumeclaim/my-pvc created
    [root@kube pv-pvc]# kubectl get pvc
    NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    my-pvc   Bound    pv0001   5Gi        RWO            slow           12s
    [root@kube pv-pvc]# kubectl get pv    //pv  已经被pvc 绑定
    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
    pv0001   5Gi        RWO            Recycle          Bound    default/my-pvc   slow                    22h
    [root@kube pv-pvc]# 

    pod 调用pvc

    [root@kube pv-pvc]# cat pod-vol-pvc-demo.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-vol-pvc
      
    spec:
      containers:
      - name: myapp
        image: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
      volumes:       //配置 volumes 调用 pvc
      - name: html     
        persistentVolumeClaim:
          claimName: my-pvc
    [root@kube pv-pvc]# ]
    [root@kube v1]# kubectl describe  pods pod-vol-pvc
    Name:         pod-vol-pvc
    Namespace:    default
    Priority:     0
    Node:         kube.node1/10.2.61.22
    Start Time:   Wed, 28 Aug 2019 16:32:50 +0800
    Labels:       <none>
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"pod-vol-pvc","namespace":"default"},"spec":{"containers":[{"image":"n...
    Status:       Running
    IP:           10.244.2.49
    Containers:
      myapp:
        Container ID:   docker://3af79a56926f85c076d35dcaba50af659aa362fa453b4e2b969d3150b44169eb
        Image:          nginx
        Image ID:       docker-pullable://nginx@sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Wed, 28 Aug 2019 16:33:12 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /usr/share/nginx/html/ from html (rw)
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-bsthb (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      html:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  my-pvc
        ReadOnly:   false
      default-token-bsthb:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-bsthb
        Optional:    false
    QoS Class:       BestEffort
  • 相关阅读:
    怎样评价聚类结果好坏?
    libsvm 用在 婚介数据集中 预测 用户配对
    mac 常用操作
    mac 安装 tomcat 配置
    mac 安装 maven 配置
    mac 安装 java 配置
    mac 安装 photoshop CS6
    mac 应用程序安装目录
    JavaScript、ES5和ES6的介绍和区别
    css 两列自适应布局的4种思路
  • 原文地址:https://www.cnblogs.com/zy09/p/11419779.html
Copyright © 2011-2022 走看看