Kubernetes Pv & Pvc

作者: YichenWong | 来源:发表于2017-03-28 17:53 被阅读10303次

Kubernetes PV & pvc


介绍

PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节。管理员关注于如何通过pv提供存储功能而无需
关注用户如何使用,同样的用户只需要挂载pvc到容器中而不需要关注存储卷采用何种技术实现。
pvc和pv的关系与pod和node关系类似,前者消耗后者的资源。pvc可以向pv申请指定大小的存储资源并设置访问模式,这就可以通过Provision -> Claim 的方式,来对存储资源进行控制。

生命周期

pv和pvc遵循以下生命周期:

  • 供应准备。通过集群外的存储系统或者云平台来提供存储持久化支持。
    - 静态提供:管理员手动创建多个PV,供PVC使用。
    - 动态提供:动态创建PVC特定的PV,并绑定。

  • 绑定。用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。

  • 使用。用户可在pod中像volume一样使用pvc。

  • 释放。用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。

  • 回收(Reclaiming)。pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
    - 保留策略:允许人工处理保留的数据。
    - 删除策略:将删除pv和外部关联的存储资源,需要插件支持。
    - 回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支持。

      目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。
    

Provisioning

两种方式提供的PV资源供给:

  • static

      通过集群管理者创建多个PV,为集群“使用者”提供存储能力而隐藏真实存储的细节。并且存在于kubenretes api中,可被直接使用。
    
  • dynamic

      动态卷供给是kubernetes独有的功能,这一功能允许按需创建存储建。在此之前,集群管理员需要事先在集群外由存储提供者或者云提供商创建
    

存储卷,成功之后再创建PersistentVolume对象,才能够在kubernetes中使用。动态卷供给能让集群管理员不必进行预先创建存储卷,而是随着用户需求
进行创建。在1.5版本提高了动态卷的弹性和可用性。

    在此前1.4版本中加入了一个 新的 API 对象 StorageClass,可以定义多个 StorageClass 对象,并可以分别指定存储插件、设置参数,用于提

供不同的存储卷。这样的设计让集群管理员能够在同一个集群内,定义和提供不同类型的、不同参数的卷(相同或者不同的存储系统)。这样的设计还确
保了最终用户在无需了解太多的情况下,有能力选择不同的存储选项。

PV类型

pv支持以下类型:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • Glusterfs
  • AzureFile
  • AzureDisk
  • CephFS
  • cinder
  • FC
  • FlexVolume
  • Flocker
  • PhotonPersistentDisk
  • Quobyte
  • VsphereVolume
  • HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)

PV属性:

  • 访问模式,与pv的语义相同。在请求资源时使用特定模式。
  • 资源,申请的存储资源数额。

PV卷阶段状态:

  • Available – 资源尚未被claim使用
  • Bound – 卷已经被绑定到claim了
  • Released – claim被删除,卷处于释放状态,但未被集群回收。
  • Failed – 卷自动回收失败

AwsElasticBlockServer 静态PV示例

需要满足以下条件方可使用EBS:

  • Pod运行的节点必须为AWS EC2实例
  • 这些示例需要和EBS在同一个区域和可用区域
  • EBS只支持一个EC2挂载一个卷
  • RC或者Deployment 副本集只能为1。

1. 创建PV(Persistent Volume)

$ vim ebs-pv.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: ebs-pv
      labels:
        type: amazonEBS
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteOnce
      awsElasticBlockStore:
        volumeID: vol-079c492115a7be6e1
        fsType: ext4

$ kubectl create -f ebs-pv.yaml

    persistentvolume "ebs-pv" created

2. 创建PVC(Persistent Volume Claim)

$ vim nginx-pvc.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nginx-pvc
      labels:
        type: amazonEBS
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi

$ kubectl create -f nginx-pvc.yaml

    persistentvolumeclaim "nginx-pvc" created

3.创建deployment服务使用pvc资源

$ vim nginx-with-pvc.yaml

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx-with-pvc
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            service: nginx
            app: test
        spec:
          containers:
          - image: nginx
            name: nginx-with-pvc
            volumeMounts:
            - mountPath: /test-ebs
              name: my-pvc
          volumes:
          - name: my-pvc
            persistentVolumeClaim:
              claimName: nginx-pvc

kubectl create -f nginx-with-pvc.yaml

    Deployment "nfs-web" created

注意事项

    - 由于aws ebs限制一个ebs只能同时挂载一个ec2,在使用基于pvc的pod时,建议使用replicas=1来创建一个部署集。StatefulSet可解决数据库集群问题。
    - pod迁移,pvc迁移(卸载旧实例/挂载新实例)默认35秒。
    - 通过deployemnt部署,删除deployment之后,可重新挂载原有pvc到新的pod里面。
    - 当pod被删除,同时删除依赖的pvc,pv状态变更为release。此时不能被其他pvc使用,aws ebs需要delete pv重建。目前不支持通过手动回收


- 已经被pvc绑定的pv可以被删除,删除后对应的pvc仍为Bound状态。如有pod正在使用此pvc则仍可使用。如无pod使用,则创建pod挂载此pvc时
会出现失败。
- pv可以在绑定后被编辑(如访问模式,容量),导致信息与对应的pvc不一致。

相关文章

网友评论

  • 4df44bc85b2a:amazonEBS,就不能写个能用的。百度搜索出来的都是垃圾
    YichenWong:建议用storageClass
  • e2ce1d2918c9:你好,我按照您上面提供的实例创建pod时总是报以下错误:
    MountVolume.SetUp failed for volume "ebs-pv" : mount failed: exit status 32 Mounting command: systemd-run Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/f4ceb5ec-5d8d-11e8-b439-02469269c1e0/volumes/kubernetes.io~aws-ebs/ebs-pv --scope -- mount -o bind /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-079c492115a7be6e1 /var/lib/kubelet/pods/f4ceb5ec-5d8d-11e8-b439-02469269c1e0/volumes/kubernetes.io~aws-ebs/ebs-pv Output: Running scope as unit run-7846.scope. mount: special device /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-079c492115a7be6e1 does not exist
    请问在挂载EBS卷之前需要做什么配置吗?
    YichenWong:@甲子_6cdb 1.6-1.10都没问题。

    你应该清楚aws access key这个是为某个API 用户授权访问AWS资源。但是作为AWS平台的EC2可以使用IAM role形式访问AWS平台资源。
    https://github.com/kubernetes/community/blob/e8f6a0f8b4ba8fc3afb6733cc9301b74d35090a1/contributors/design-proposals/aws/aws_under_the_hood.md这篇文章有将kubernetes如何基于AWS正确运行,包括一些列Tag设置、IAM权限认证等等。

    如下是IAM描述文件,kubernetes文档真的算不上好,找这些要花一些精力:
    https://gitlab.com/kubernetes/kubernetes/tree/ba4dba8be267068ecb4f42ed0bd181bd227149a1/cluster/aws/templates/iam

    注意如果是国内AWS,需要修改里面resource下面的arn:aws:s3:::kubernetes-*"-->arn:aws-cn:s3:::kubernetes-*"
    e2ce1d2918c9:@YichenWong 您用的是哪个版本的k8s呢?我用的是1.9的版本,在EC2的宿主机上通过aws 命令行是可以挂载的(当然要事先通过 aws configure命令 将Access Key 和Secret access key进行配置),但是在k8s官方文档中没有找到针对awsElasticBlockStore配置这两个key的具体参数,不知道是不是需要配置?
    YichenWong:@甲子_6cdb 从你提示的日志来看并不是AWS IAM权限不足导致,不好意思,没遇到过这个问题,你可以参考下官方文档。
  • YichenWong:静态PV,pvc绑定pv的时候并未见有pv 关键字field。多个pv存在的情况下,pvc如何绑定指定的PV?
    似水流年灬:请问这个问题,你解决了吗?
  • 53adc7c17c71:文章不错,排版乱了

本文标题:Kubernetes Pv & Pvc

本文链接:https://www.haomeiwen.com/subject/hmxsottx.html