zoukankan      html  css  js  c++  java
  • Kubernetes ---- 存储卷(PV、PVC)


      在创建需要持久化数据的Pod之前,要先创建一个PVC,这个PVC要在系统上找一个符合规则的PV,进行申请并占用,他们是一一对应关系的,一旦一个PV被某个PVC占用了,那么状态会变为Bound,不能被别的PVC绑定了,
    如果PVC找不到匹配规则的PV的话,那么状态就会变为pending状态,直到与符合规则的PV关联上;一个pvc创建后,相当于是一个存储卷,可以被多个Pod访问,可以自己制定规则(accessMode)


    pods.spec.volumes.persistentVolumeClaim(pvc) 持久存储卷申请
      pvc要与pv建立关联关系
      pv要与存储系统建立关联关系
      pv: 存储系统之上的存储空间


    # 查看pvc相关语法
    $ kubectl explain pvc

    pv.spec.accessModes <[]string>

    Access Modes
    ReadWriteOnce -- 单个节点可以将卷挂载为读写状态
    ReadOnlyMany -- 该卷可以由多个节点以只读方式挂载
    ReadWriteMany -- 多个节点可以将卷挂载为读写状态

    RWO - ReadWriteOnce
    ROX - ReadOnlyMany
    RWX - ReadWriteMany


    pv.spec.capacity <map[string]string>  定义PV的大小

    基于https://www.cnblogs.com/k-free-bolg/p/13155970.html里的NFS,我们创建几个PV,然后才能创建PVC供客户绑定,使用;
    1. 创建目录以供pv使用
    nfs node:

    # mkdir /data/volumes/v{1,2,3,4,5}
    # vim /etc/exports
    /data/volumes/v1 192.168.222.0/24(rw,no_root_squash)
    /data/volumes/v2 192.168.222.0/24(rw,no_root_squash)
    /data/volumes/v3 192.168.222.0/24(rw,no_root_squash)
    /data/volumes/v4 192.168.222.0/24(rw,no_root_squash)
    /data/volumes/v5 192.168.222.0/24(rw,no_root_squash)
    # exportfs -arv
    # showmount -e 
    Export list for node-nfs:
    /data/volumes/v5 192.168.222.0/24
    /data/volumes/v4 192.168.222.0/24
    /data/volumes/v3 192.168.222.0/24
    /data/volumes/v2 192.168.222.0/24
    /data/volumes/v1 192.168.222.0/24

    2. 创建NFS格式的pv
    node2:

    # 查看定义语法
    $ kubectl explain pv
    $ vim pv-nfs.yaml
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv001
        labels:
          name: pv0001
      spec:
        accessModes: ["ReadWriteMany","ReadWriteOnce"]
         capacity:
          storage: 2Gi
            nfs:
              path: /data/volumes/v1
              server: 192.168.222.103
      ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv002
        labels:
          name: pv0002
      spec:
        accessModes: ["ReadWriteOnce"]
        capacity:
          storage: 5Gi
        nfs:
          path: /data/volumes/v2
          server: 192.168.222.103
      ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv003
        labels:
          name: pv0003
      spec:
        accessModes: ["ReadWriteOnce","ReadWriteMany"]
       capacity: 
         storge: 20Gi
         nfs:
           path: /data/volumes/v3
           server: 192.168.222.103
      ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv004
        labels:
          name: pv0004
      spec:
        accessModes: ["ReadWriteOnce","ReadWriteMany"]
        capacity:
          storage: 10Gi
        nfs:
          path: /data/volumes/v4
          server: 192.168.222.103
      ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv005
        labels:
          name: pv0005
      spec:
        accessModes: ["ReadWriteOnce","ReadWriteMany"]
        capacity:
          storage: 10Gi
       nfs:
          path: /data/volumes/v5
          server: 192.168.222.103
    
    $ kubectl apply -f pv-nfs.yaml
    $ kubectl get pv
    NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM     STORAGECLASS   REASON   AGE
    pv001   2Gi      RWO,RWX      Retain       Available                          13m
    pv002   5Gi      RWO          Retain       Available                          13m
    pv003   20Gi     RWO,RWX      Retain       Available                          13m
    pv004   10Gi     RWO,RWX      Retain        Available                         13m
    pv005   10Gi     RWO,RWX        Retain       Available                         13m

    # RECLAIM POLICY(回收策略):

      Retain: 当PVC释放了,取消了与PV的绑定,那么数据将会继续保留;
      Recycle: 保留PV,但清空其上数据,已废弃
      delete: 删除被PVC释放的PV及其后端存储volume

    创建pvc

    $ vim pod-vol-pvc.yaml
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: mypvc
        namespace: default
      spec:
        accessModes: ["ReadWriteMany"]
        resources:
        requests:
          storage: 6Gi
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: pvc-pod
        namespace: default
      spec:
        containers:
        - name: pvc-container
          image: ikubernetes/myapp:v1
          imagePullPolicy: IfNotPresent
         ports:
          - name: http
            containerPort: 80
          volumeMounts:
          - name: disk-pvc
            mountPath: /usr/share/nginx/html/
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh","-c","echo $(hostname) > /usr/share/nginx/html/index.html"]
      volumes:
      - name: disk-pvc
        persistentVolumeClaim:
        claimName: mypvc

    StorageClass(存储类): 动态创建PV
    当PVC想与PV进行绑定的时候,如果没有找到符合PVC定义的条件的PV,那么PVC就会是pending状态,直到找到符合条件的PV才会绑定,这就出现了一个问题,如果我们不知道Pod会申请的PVC需要多大,那么就
    没办法提前创建PV,也就是没办法进行PVC与PV的绑定.

    针对这种情况,k8s拥有"存储类"这个功能,可以根据自己定义的各种组来进行存储分类,比如把本地存储分为一类,云端存储分为一类,NFS的分为一类等等,分完类后要定义出存出来,此时PVC再去申请PV的时候
    PVC不会再单独针对某个PV进行,而是针对存储类来进行绑定,比如有A存储类和B存储类两个存储类,PVC像A存储类请求空间,那么A存储类会动态创建一块供PVC使用的PV.(要求允许支持Restful风格的接口)

  • 相关阅读:
    spring事务详解(一)初探讨
    spring事务详解(二)实例
    mysql删除重复数据只保留一条
    jdk1.8源码Synchronized及其实现原理
    jdk1.8源码Thread与Runnable区别
    动态创建类并添加属性赋值
    c# 当代热门技术
    c# 开源框架
    极限并发带来的思考(12306 抢票)
    ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (Challenge)
  • 原文地址:https://www.cnblogs.com/k-free-bolg/p/13156243.html
Copyright © 2011-2022 走看看