美文网首页
八、持久卷使用

八、持久卷使用

作者: jan29 | 来源:发表于2021-12-02 23:34 被阅读0次

    1、emptyDir

    EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
    EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-emptydir
      namespace: default
    spec:
      containers:
      - name: web
        image: nginx:1.14
        volumeMounts:
        - name: web-volume
          mountPath: /usr/share/nginx/html
          readOnly: true
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/sh"
        args:
        - "-c"
        - "while true;do echo $(date) >> /data/index.html;sleep 1;done"
        volumeMounts:
        - name: web-volume
          mountPath: /data
      volumes:
      - name: web-volume
        emptyDir:
          medium: Memory
          sizeLimit: 10Mi
    

    验证

    [root@master volume]# kubectl get po pod-emptydir -o wide
    NAME           READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
    pod-emptydir   2/2     Running   0          29s   10.244.1.132   node2   <none>           <none>
    [root@master volume]# curl 10.244.1.132
    Thu Dec 2 14:01:16 UTC 2021
    Thu Dec 2 14:01:17 UTC 2021
    Thu Dec 2 14:01:18 UTC 2021
    ......
    

    2、hostPath

    HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-hostpath
      namespace: default
    spec:
      containers:
      - name: web
        image: nginx:1.14
        volumeMounts:
        - name: web-hostpath
          mountPath: /usr/share/nginx/html
          readOnly: true
      volumes:
      - name: web-hostpath
        hostPath:
          path: /data/web
          type: DirectoryOrCreate
    

    验证

    [root@master volume]# kubectl get po pod-hostpath -o wide
    NAME           READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
    pod-hostpath   1/1     Running   0          58s   10.244.1.134   node2   <none>           <none>
    [root@node2 ~]# echo myWeb_hostPath > /data/web/index.html
    [root@master volume]# curl 10.244.1.134
    myWeb_hostPath
    

    关于type字段的说明:
    DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
    Directory 目录必须存在
    FileOrCreate 文件存在就使用,不存在就先创建后使用
    File 文件必须存在
    Socket unix套接字必须存在
    CharDevice 字符设备必须存在
    BlockDevice 块设备必须存在

    3、第三方存储卷配置

    emptyDir和hostPath的数据并不能真正意义上保存,如果真正意义上保存还需要使用第三方存储。k8s支持的第三方后端存储有awsElasticBlockStore、azureDisk、cephfs、glusterfs、cinder、fc、iscsi、nfs、rbd、scaleIO等
    具体支持的第三方设备及其配置参数可查看官方文档https://kubernetes.io/docs/concepts/storage/volumes/

    以nfs为例

    [root@master volume]# vim /etc/exports
    /data/volume1 192.168.1.0/24(rw,root_squash,sync)
    
    kind: Pod
    metadata:
      name: pod-nfs
      namespace: default
    spec:
      containers:
      - name: web
        image: nginx:1.14
        volumeMounts:
        - name: web-nfs
          mountPath: /usr/share/nginx/html
          readOnly: true
      volumes:
      - name: web-nfs
        nfs:
          path: /data/volume1
          server: 192.168.1.51
    

    验证

    [root@master volume]# kubectl get po pod-nfs -o wide
    NAME      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
    pod-nfs   1/1     Running   0          18s   10.244.2.124   node1   <none>           <none>
    [root@master volume]# echo test-nfs-volume > /data/volume1/index.html
    [root@master volume]# curl 10.244.2.124
    test-nfs-volume
    

    4、PV,PVC

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

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

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

    4.1PV创建

    [root@master volume]# vim /etc/exports
    /data/volume1 192.168.1.0/24(rw,root_squash,sync)
    /data/volume2 192.168.1.0/24(rw,root_squash,sync)
    /data/volume3 192.168.1.0/24(rw,root_squash,sync)
    

    以nfs为例

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv-volume1
    spec:
      capacity:
        storage: 10Gi
      accessModes:
      - ReadWriteOnce
      nfs:
        path: /data/volume1
        server: 192.168.1.51
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv-volume2
    spec:
      accessModes:
      - ReadOnlyMany
      capacity:
        storage: 5Gi
      nfs:
        path: /data/volume2
        server: 192.168.1.51
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv-volume3
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 3Gi
      nfs:
        path: /data/volume3
        server: 192.168.1.51
    

    验证

    NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    test-pv-volume1   10Gi       RWO            Retain           Available                                   28s
    test-pv-volume2   5Gi        ROX            Retain           Available                                   55s
    test-pv-volume3   3Gi        RWX            Retain           Available                                   7s
    
    • 存储类型
      底层实际存储的类型,kubernetes支持多种存储类型,每种存储类型的配置都有所差异
    • 存储能力(capacity)
      用于存储空间的设置
    • 访问模式(accessModes)
      用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
    • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
    • ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
    • ReadWriteMany(RWX):读写权限,可以被多个节点挂载
      需要注意的是,底层不同的存储类型可能支持的访问模式不同
    • 回收策略(persistentVolumeReclaimPolicy)
      当PV不再被使用了之后,对其的处理方式。目前支持三种策略:
    • Retain (保留) 保留数据,需要管理员手工清理数据
    • Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
    • Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
      需要注意的是,底层不同的存储类型可能支持的回收策略不同
    • 存储类别
      PV可以通过storageClassName参数指定一个存储类别
    • 具有特定类别的PV只能与请求了该类别的PVC进行绑定
    • 未设定类别的PV则只能与不请求任何类别的PVC进行绑定
    • 状态(status)
      一个 PV 的生命周期中,可能会处于4中不同的阶段:
    • Available(可用): 表示可用状态,还未被任何 PVC 绑定
    • Bound(已绑定): 表示 PV 已经被 PVC 绑定
    • Released(已释放): 表示 PVC 被删除,但是资源还未被集群重新声明
    • Failed(失败): 表示该 PV 的自动回收失败

    4.2PVC创建

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test1-volume
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
    

    验证

    [root@master volume]# kubectl get pv
    NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                  STORAGECLASS   REASON   AGE
    test-pv-volume1   10Gi       RWO            Retain           Available                                                  14m
    test-pv-volume2   5Gi        ROX            Retain           Available                                                  14m
    test-pv-volume3   3Gi        RWX            Retain           Bound       default/test1-volume                           13m
    [root@master volume]# kubectl get pvc
    NAME           STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    test1-volume   Bound    test-pv-volume3   3Gi        RWX                           23s
    

    4.3pod使用

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-pvc
      namespace: default
    spec:
      containers:
      - name: web
        image: nginx:1.14
        volumeMounts:
        - name: test1-volume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: test1-volume
        persistentVolumeClaim:
          claimName: test1-volume
          readOnly: false
    

    验证

    [root@master volume]# echo test1-pvc > /data/volume3/index.html 
    [root@master volume]# kubectl get po pod-pvc -o wide
    NAME      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
    pod-pvc   1/1     Running   0          94s   10.244.2.126   node1   <none>           <none>
    [root@master volume]# curl 10.244.2.126
    test1-pvc
    

    5、configMap

    ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。

    [root@master volume]# kubectl create cm wordpress --from-literal=wordpress-db-host=wordpress-mysql 
    configmap/wordpress created
    [root@master volume]# kubectl get cm wordpress
    NAME        DATA   AGE
    wordpress   1      4m15s
    

    6、secret

    在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。

    [root@master volume]# kubectl create secret generic wordpress --from-literal=wordpress-db-password=wordpresspwd --from-literal=mysql-root-password=wordpresspwd
    [root@master volume]# kubectl get secret wordpress
    NAME        TYPE     DATA   AGE
    wordpress   Opaque   2      69s
    

    相关文章

      网友评论

          本文标题:八、持久卷使用

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