volume

作者: 麟之趾a | 来源:发表于2020-09-09 15:17 被阅读0次

    volume

    Pod的存储卷,不应该在某台Node上,而是在共享存储中(NFS,MFS)
    在Pod上有一个基础容器pause,所有加入到这个Pod的容器,都共享pause容器的Net,UTS,IPC。
    Pause也可以接入volume,pause接入时,必须要识别此volume从哪种操作系统上过来,例是NFS还是MFS,节点做了桥接
    k8s内置了许多标准的存储接口,也提供给用户CSI(container stroage interface)用户自定义接口
    kubectl explain pods.spec.volumes
    k8s提供的存储类型
    云存储: awsElasticBlockstorage、azureDisk、azureFile
    分布式存储:cephfs,glusterfs,rbd
    网络存储:nfs,iscsi,fc
    临时存储:emptyDir,gitRepo (Pod生命周期结束,此存储也会消失)
    本地存储:hostPath,local (跟随Node的生命周期结束)
    特殊存储:configMap,secret,downwardAPI
    自定义存储:csi
    持久存储:persistentVolumeClain,pvc


    image.png

    存储卷使用示例

    https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
     kubectl explain pods.spec.volumes.hostPath
    [root@k8s-master basic]# cat vol-daemon.yaml 
    apiVersion: v1
    kind: Namespace
    metadata:
      name: vol
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: myapp
      namespace: vol
      labels: 
        app: myapp
    spec:
      nodeName: k8s-node-01
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        volumeMounts:
          - name: webstor
            mountPath: /usr/share/nginx/html
            readOnly: true
      volumes:
      - name: webstor
        hostPath:
          path: /volumes/myapp
          type: DirectoryOrCreate
    
    kubectl apply -f pod-daemon.yaml
    kubectl describe pods myapp -n vol 
    kubectl get pods -n vol -o wide
    kubectl explain pods.spec.nodeName  绑定Pod在某个节点上
    

    临时存储

    emptyDir,Pod一终止,此目录就会删除
    kubectl explain pods.spec.volumes.emptyDir
    medium 空值或Memory
    sizeLimit 当medium 为Memory 时,必须设定此值,如果emptyDir不使用任何值,即medium是空值,sizeLimit不限制,yml 中应使应用emptyDir:{}
    

    网络存储

    nfs服务器
    mkdir /vols/v{1,2,3,4,5} -p
    vim /etc/exports
    /vols/v1 10.0.0.0/24(rw,no_root_squash)    //no_root_squash 加上,否则Pod可能会挂载失败
    systemctl start nfs
    systemctl enable nfs
    
    k8s节点 测试挂载
    mount -t nfs 10.0.0.104:/vols/v1  /mnt
    mount   查看挂载情况
    umount /mnt  卸载
     kubectl explain pods.spec.volumes.nfs
        path:  nfs服务器上的目录
        server:  nfs服务器上的地址和端口,端口可以不给
      
    存储卷示例
    volumes:
      - name: redisdata
        nfs:
          server: 172.18.0.69
           path: /vols/v1
    
     # Pod 存储卷
    1. 定义存储卷
    kubectl explain pods.spec.volumes
    2.在容器中挂载存储卷
    kubectl explain pods.spec.containers.volumeMounts
    
    image.png

    PV为一个中间件,是k8s上的一个资源。与后台存储系统提供的存储逻辑单元--对应,我们只需要把存储单元映射成一个个PV,提供给k8s使用
    pv是集群级别的资源
    Pod要使用pv,而Pod是名称空间级别资源。我们要把pv映射成名称空间,且一个pv对应一个名称空间。(一对一进行绑定)


    image.png

    要让名称空间与PV绑定,需要名称空间的pvc与pv1绑定,此时pv1是binding状态,其余pv是available状态
    因此使用Pod pvc类型做存储卷时,应直接使用
    kubectl explain pods.spec.volumes.persistentVolumeClaim
    在Pod的容器中要挂载PVC,如果一段时间内Pod被删除了,这个PVC应该会在名称空间,另一个Pod挂载这个PVC,会应该共享此PVC的数据
    如果有两个Pod来同时挂载这个PVC,PVC是否支持,取决于底层存储是否支持。
    如果底层存储设备,是块读写,则不支持。如果一个名称空间,所有Pod都回收了,PVC也删了,但对应的PV不会删,其上面还有数据。PV一旦删了,其数据也没有了。因为PV对应的存储设备的存储单元,pv 处于 reclaim(可回收状态)
    PV如何来的
    1、静态,由管理员手动创建
    2、动态
    1.在名称空间创建PVC,此时存储设备上有多个逻辑单元。PVC发送请求,创建PV。在存储空间没有逻辑单元,创建PVC发送请求,调用存储设备的管理界面的API接口,创建存储设备的存储逻辑单元,再创建PV
    PV的生命周期(lifecycle)
    provisioning 创建
    Binding
    Using
    Reclaiming 回收
    pv的回收策略
    Delete(删除这个pv)
    Recycle(删除pv上的数据)
    Retain(保留这个PV和PV上的数据)

    PV 如何动态创建

    image.png

    PVC向sc发送请求,sc定义了向存储设备的API,即创建逻辑单元,并且在sc中创建了pv。
    pvc和pv只属于sc。pvc不能跨sc创建pv,即pvc和pv要么属于一个sc,要不都不属于一个sc

    存储逻辑

    image.png
    注意:PV不属于名称空间,不能定义namespace

    1.先定义存储空间
    NFS
    vim /etc/exports
    /vols/v1 172.18.0.0/16(rw,no_root_squash)
    /vols/v2 172.18.0.0/16(rw,no_root_squash)
    /vols/v3 172.18.0.0/16(rw,no_root_squash)
    /vols/v4 172.18.0.0/16(rw,no_root_squash)
    /vols/v5 172.18.0.0/16(rw,no_root_squash)
    exports -rav
    kubectl explain pv
    kubectl explain pv.spec
    access-mode:访问模型,单路读写,多路只读,多路读写
    RWO(单路读写) Readwriteonce
    ROX(多路只读)ReadOnlyMany
    RWX(多路读写)ReadWriteMany

    [root@k8s-master basic]# cat pv-demo.yaml 
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs-v1
      labels:
        storages: nfs
    spec:
      accessModes: ["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"]   //这里的accessModes 的特性一定不能超过底层存储系统支持的特性
      capacity:
        storage: 5Gi   //定义存储空间
      volumeMode: Filesystem    //有两种存储类型,一种是块存储,一种是文件系统存储
      persistentVolumeReclaimPolicy: Retain  //PVC删除后,PV的回收策略
      nfs:
       server: 10.0.0.104
       path: /vols/v2
    
    kubectl apply -f pv-daemon.yaml
    [root@k8s-master basic]# cat pvc.yaml 
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: redis-data
      namespace: develop
    spec:
      accessModes:
       - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 3Gi      //此处pv一定要有3G以上的空间
    kubectl get pvc -n develop
    # Pod使用pvc
    [root@k8s-master basic]# cat pod-pvc.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
     name: pod-pvc
     namespace: develop
    spec:
     containers:
       - name: myapp
         image: ikubernetes/myapp:v1
         imagePullPolicy: IfNotPresent
     volumes:
       - name: data
         persistentVolumeClaim:
           claimName: redis-data
    kubectl apply -f pod-pvc.yaml
    kubectl describe pods pod-pvc -n develop
    查看 volumes
    

    pv和pvc的存储保护
    如果Pod在使用PVC,如果删了PVC。此请求可以正常发出,但pvc不会被真正删除。直到使用此pvc的Pod被删除,这个PV才会被删除。当PVC删除后,绑定的pv为Released状态,不能再被pvc绑定(pv为avaiable时,才可以被绑定)
    kubectl delete pv ... 切换到pv所在的存储逻辑单元,删除数据

    sc存储类

    假设一个公司有多种存储类型设备,可以把相同的类型设备归为一类


    image.png

    当pvc申请pv时,也要向存储类进行申请,在存储类中应有pv
    kubectl explain sc (了解)

    相关文章

      网友评论

          本文标题:volume

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