zoukankan      html  css  js  c++  java
  • k8s资源存储pv pvc 动态持久化存储StorageClass

    目录
     
    所有的中间层都是为了解耦
    中间件(英语:Middleware),又译中间件、中介层,是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。在现代信息技术应用框架如 Web 服务、面向服务的体系结构等项目中应用比较广泛。如数据库、Apache 的 Tomcat ,IBM 公司的 WebSphere ,BEA 公司的 WebLogic 应用服务器,东方通公司的 Tong 系列中间件,以及 Kingdee 公司的等都属于中间件。
     
    PV,PVC简介
    1.1 介绍
      管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim
      PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
      PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。
      虽然PersistentVolumeClaims允许用户使用抽象存储资源,但是PersistentVolumes对于不同的问题,用户通常需要具有不同属性(例如性能)。群集管理员需要能够提供各种PersistentVolumes不同的方式,而不仅仅是大小和访问模式,而不会让用户了解这些卷的实现方式。对于这些需求,有StorageClass 资源。
      StorageClass为管理员提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。 Kubernetes本身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”。
      PVC和PV是一一对应的。
     
    1.2 生命周期
      PV是群集中的资源。PVC是对这些资源的请求,并且还充当对资源的检查。PV和PVC之间的相互作用遵循以下生命周期:
    Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling
    • 供应准备Provisioning---通过集群外的存储系统或者云平台来提供存储持久化支持。
      • - 静态提供Static:集群管理员创建多个PV。 它们携带可供集群用户使用的真实存储的详细信息。 它们存在于Kubernetes API中,可用于消费
      • - 动态提供Dynamic:当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,集群可能会尝试为PVC动态配置卷。 此配置基于StorageClasses:PVC必须请求一个类,并且管理员必须已创建并配置该类才能进行动态配置。 要求该类的声明有效地为自己禁用动态配置。
    • 绑定Binding---用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
    • 使用Using---用户可在pod中像volume一样使用pvc。
    • 释放Releasing---用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
    • 回收Recycling---pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
      • - 保留策略:允许人工处理保留的数据。
      • - 删除策略:将删除pv和外部关联的存储资源,需要插件支持。
      • - 回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支持。
    注:目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。
     
    挂载磁盘分两步:
    Attach,为虚拟机挂载远程磁盘的操作。kubelet 为 Volume 创建目录,并绑定远程存储。
    Mount,磁盘设备格式化并挂载到 Volume 宿主机目录的操作
    如果你的 Volume 类型是远程文件存储(比如 NFS)的话,kubelet跳过“第一阶段”(Attach)的操作
     
     
    1.4 PV卷阶段状态
    • Available – 资源尚未被claim使用
    • Bound – 卷已经被绑定到claim了
    • Released – claim被删除,卷处于释放状态,但未被集群回收。
    • Failed – 卷自动回收失败
     
     
     
     
    静态PV,PVC创建和使用
    1. 创建pv存储,实际的存储资源
    [root@m3 test]# vim pv-nfs.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs
    spec:
      storageClassName: nfs1
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      nfs:
        server: 192.168.70.94
        path: "/data/nfs/v1"
    [root@m3 test]# kubectl apply -f pv-nfs.yaml  
    persistentvolume/pv-nfs created
    [root@m3 test]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pv-nfs   1Gi        RWX            Retain           Available           nfs1                    41s
     
    2. PVC 描述的,则是 Pod 所希望使用的持久化存储的属性。
    [root@m3 test]# vim pvc-nfs.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-nfs
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 100M
      storageClassName: nfs1
    [root@m3 test]# kubectl apply -f pvc-nfs.yaml 
    persistentvolumeclaim/pvc-nfs created
     
    Volume Controller:专门处理持久化存储的控制器
    PersistentVolumeController :处理pv和pvc
    PersistentVolumeController 会不断地查看当前每一个 PVC,是不是已经处于 Bound(已绑定)状态。如果不是,那它就会遍历所有的、可用的 PV,并尝试将其与这个“单身”的 PVC 进行绑定。这样,Kubernetes 就可以保证用户提交的每一个 PVC,只要有合适的 PV 出现,它就能够很快进入绑定状态
    PVC和PV绑定条件:
      1. storageClassName 字段一致
      2. PV 满足 PVC 的 spec 字段
    [root@m3 test]# kubectl get pvc
    NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-nfs   Bound    pvc-nfs   1Gi        RWX            nfs1           2m34s
    [root@m3 test]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
    pv-nfs   1Gi        RWX            Retain           Bound    default/pvc-nfs   nfs1                    6m26s
     
    3.pvc资源的使用
    [root@m3 test]# vim pvc-nfs-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pvc-nfs-pod
    spec:
      containers:
      - name: web
        image: nginx:1.7.9
       volumeMounts:
            storageClassName- name: nfs
              mountPath: "/usr/share/nginx/html"
      volumes:
      - name: nfs
        persistentVolumeClaim:
          claimName: nfs1
    [root@m3 test]# kubectl apply -f pvc-nfs-pod.yaml
    pod/pvc-nfs-pod created
     
    访问nginx进行验证
    [root@m3 test]# kubectl get pod -o wide | grep pvc-nfs-pod
    pvc-nfs-pod                         1/1     Running   0          3m13s   10.100.130.101   s3     <none>           <none>
    [root@m3 test]# curl http://10.100.130.101
    hello nfs
     
     
     
    动态持久化存储StorageClass
    我们学习了 PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上并不能满足我们的需求,比如我们有一个应用需要对存储的并发度要求比较高,而另外一个应用对读写速度又要求比较高,特别是对于 StatefulSet 类型的应用简单的来使用静态的 PV 就很不合适了,这种情况下我们就需要用到动态 PV,也就是我们今天要讲解的 StorageClass。
     
    而 StorageClass 对象的作用,其实就是创建 PV 的模板。具体地说,StorageClass 对象会定义如下两个部分内容:
    第一,PV 的属性。比如,存储类型、Volume 的大小等等。
    第二,创建这种 PV 需要用到的存储插件。比如,Ceph 等等。
     
    nfs创建pv并自动绑定pvc
    1.创建ServiceAccount账号
    创建账号,nfs-client-provisioner服务启动时需要以此账号的权限启动和运行
    [root@m3 nfs]# cat nfs-client-provisioner.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: eip-nfs-client-provisioner
      namespace: kube-system
     
    [root@m3 nfs]# kubectl apply -f nfs-client-provisioner.yaml 
    serviceaccount/nfs-client-provisioner created  
    
    
     
    2.创建集群role角色
    [root@m3 nfs]# cat nfs-client-provisioner-runner.yaml    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: nfs-client-provisioner-runner
      namespace: kube-system
    rules:
      - apiGroups:
          - ''
        resources:
          - persistentvolumes
        verbs: 
          - get
          - list
          - watch
          - create
          - delete
      - apiGroups:
          - ''
        resources:
          - persistentvolumeclaims
        verbs: [ get, list, watch, update ]
      - apiGroups:
          - storage.k8s.io
        resources:
          - storageclasses
        verbs: [ get, list, watch ]
      - apiGroups:
          - ''
        resources:
          - events
        verbs: [ create, update, patch ]
     
    [root@m3 nfs]# kubectl apply -f nfs-client-provisioner-runner.yaml 
    clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
     
     
    3.使role角色和ServiceAccount账号绑定
    [root@m3 nfs]# cat run-nfs-client-provisioner.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: run-nfs-client-provisioner
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: nfs-client-provisioner-runner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: kube-system
     
    [root@m3 nfs]# kubectl apply -f run-nfs-client-provisioner.yaml
    clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
     
    4.创建role角色,赋予权限
    [root@m3 ~]# cat leader-locking-nfs-client-provisioner.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: leader-locking-nfs-client-provisioner
      namespace: kube-system
    rules:
      - apiGroups:
          - ''
        resources:
          - endpoints
        verbs:
          - get
          - list
          - watch
          - create
          - update
          - patch
     
    [root@m3 ~]# kubectl apply -f leader-locking-nfs-client-provisioner.yaml
    role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created      
     
    5. 将role角色和ServiceAccount绑定
    [root@m3 ~]# cat leader-locking-nfs-client-provisioner-bind.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: leader-locking-nfs-client-provisioner
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: leader-locking-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: kube-system
    [root@m3 ~]# kubectl apply -f leader-locking-nfs-client-provisioner-bind.yaml 
    rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created     
     
    6.创建nfs 工作端
    [root@m3 ~]# vim nfs-nfs3.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nfs-nfs3
      name: nfs-nfs3
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nfs-nfs3
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-nfs3
        spec:
          containers:
            - env:
                - name: PROVISIONER_NAME
                  value: nfs-nfs3
                - name: NFS_SERVER
                  value: 192.168.70.120
                - name: NFS_PATH
                  value: /data/nfs/v3
              image: 'quay.io/external_storage/nfs-client-provisioner:v3.1.0-k8s1.11'
              name: nfs-client-provisioner
              volumeMounts:
                - mountPath: /persistentvolumes
                  name: nfs-client-root
          serviceAccountName: eip-nfs-client-provisioner
          volumes:
            - name: nfs-client-root
              nfs:
                path: /data/nfs/v3
                server: 192.168.70.120
     
    [root@m3 ~]# kubectl apply -f nfs-nfs3.yaml 
    deployment.apps/nfs-nfs3 created
     
    7. 创建nfs StorageClass
    [root@m3 nfs]# vim nfs-StorageClass.yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      annotations:
        k8s.eip.work/storageType: nfs_client_provisioner
      name: nfs3
    parameters:
      archiveOnDelete: 'false'
    provisioner: nfs-nfs3
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
     
    [root@m3 nfs]# kubectl apply -f nfs-StorageClass.yaml 
    storageclass.storage.k8s.io/nfs3 created
    [root@m3 nfs]# kubectl get pod -n kube-system | grep nfs3
    nfs-nfs3-66f4c9bcd5-5fd2x                 1/1     Running   0          3m21s
     
    reclaimPolicy回收策略: Delete立刻删除 Retain pvc删除后保留磁盘
    volumeBindingMode绑定策略: Immediate立即绑定,WaitForFirstConsumer第一次使用时绑定
     
    8.进行nfs测试
    [root@m3 nfs]# cat nfs-pvc.yaml 
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-nfs
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 2M
      storageClassName: nfs3
    [root@m3 nfs]# kubectl apply -f nfs-pvc.yaml 
    persistentvolumeclaim/pvc-nfs created
     
    [root@m3 ~]# kubectl get pvc | grep pvc-nfs
    pvc-nfs              Bound    pvc-4773b235-aa7c-4c8e-bf81-85c97e0e28f6   2M         RWX            nfs3           78s
    [root@m3 ~]# kubectl get pv | grep pvc-nfs
    pvc-4773b235-aa7c-4c8e-bf81-85c97e0e28f6   2M         RWX            Delete           Bound    default/pvc-nfs              nfs3                    88s
     
     
     
  • 相关阅读:
    Oracle中TO_DATE格式
    实现带查询功能的Combox控件
    Combox和DropDownList控件的区别
    C# 获取字符串中的数字
    C# try catch finally 执行
    树形DP codevs 1814 最长链
    codevs 2822 爱在心中
    匈牙利算法 cojs.tk 搭配飞行员
    匈牙利算法 codevs 2776 寻找代表元
    2016-6-19 动态规划,贪心算法练习
  • 原文地址:https://www.cnblogs.com/wangzhangtao/p/12171630.html
Copyright © 2011-2022 走看看