zoukankan      html  css  js  c++  java
  • K8s的存储卷使用总结

    K8s的存储卷:
      它有四种存储卷:
      1. emptyDir: 空目录,这种存储卷会随着Pod的删除而被清空,它一般作为缓存目录使用,或临时目录,
       当做缓存目录时,通常会将一块内存空间映射到该目录上,让Pod做为缓存目录使用。
      2. hostPath


    SAN(存储区域网络): iSCSI,FB
    NAS(网络附加存储): nfs,cifs
    分布式存储: Glusterfs, ceph(rbd), cephfs
    云存储: EBS(弹性块存储),Azure Disk

    #emptyDir存储卷的示例:
    vim  pod-volume.yaml
    apiVersion:v1
    kind: Pod
    metadata:
     name: pod-demo
     namespace: default
     labels:
         app: myapp
         tier: frontend
     annotations:
         magedu.com/created-by: “cluster admin”
    spec:
      containers:
      -  name: httpd
         image: busybox:latest
         imagePullPolicy: IfNotPresent   #设定镜像策略为即便本地没有镜像也不去下载.
         command: ["/bin/httpd","-f","-h", " /data/web/html"]
         ports:
         - name: http
           containerPort: 80
         volumeMounts:          #存储卷可被一个Pod中的多个容器挂载.谁需要就定义挂载即可.
         - name: html
           mountPath: /data/web/html/
      - name: busybox
        image: busybox: latest
        imagePullPolicy: IfNotPresent
        volumeMounts:
        -  name: html
           mountPath: /data/
        command:
        - “/bin/sh”
        - “-c”
        - "while true; do echo $(date) >> /data/index.html; sleep 2; done”
    volumes:
    -  name: html
       emptyDir: {}

      #开始创建Pod
      kubectl apply -f pod-volume.yaml
      kubectl get pods
      kubectl exec -it pod-demo -c busybox -- /bin/sh    #联入pod-demo这个Pod中叫busybox的容器中.

    #注意:
     当一个Pod中有多个容器时,当Pod启动出现错误,可通过
      kubectl describe pods pod-demo      #查看其中每个容器的Status,来确认每个容器的运行状态。

    gitRepo类型的存储卷:
     gitRepo:这种类型的存储卷是在容器启动时,将远程git仓库中的数据(如: 网站代码)给克隆一份到本地,然后启动容器使用该克隆的数据来提供服务,这份克隆的数据在容器运行过程中不会将更新的数据同步到git仓库中,同时git仓库中的更新也不会同步到该容器中,若要实现当git仓库发生改变时,能同步到容器的存储卷中,还要借助于辅助容器,每隔一段时间就去克隆一份git仓库中的数据, 当本地数据改变时,再同步到git仓库中。

    hostPath类型的存储卷:
     它有一下几种类型:
      1. DirectoryOrCreate: 它可以是宿主机上的一个已存在的目录,也可不存在,若不存在则自动创建.
      2. Directory: 它必须是宿主机上一个已经存在的目录。
      3. FileOrCreate: 它可以是宿主机上的一个文件,若此文件不存在则创建一个空文件来挂载。
      4. File:宿主机上的一个已经存在的文件,若不存在则报错。
      5. Socket:宿主机上一个已经存在的Unix Socket文件.
      6. CharDevice: 宿主机上一个已存在的字符类型的设备文件.
      7. BlockDevice: 宿主机上一个已存在的块类型的设备文件。

    #创建一个hostPath类型的存储卷示例:
    vim  pod-hostpath-vol.yaml
    apiVersion: v1
    kind: Pod
    metadata:
       name: pod-hostpath-vol
       namespace: default
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        volumeMounts:
          - name: html
            mountPath: /usr/share/nginx/html/
        volumes:
        - name: html
          hostPath:
              #这是定义宿主机上那个目录作为容器myapp的存储卷的.
            path: /data/pod/volume1         
            type: DirectoryOrCreate

      创建Pod前的准备:
      1. 因为不确定Pod会被调度到那个节点上,因此再两个节点上都创建/data/pod/volume1
          并再该目录中都创建一个网页文件,并有意让两个节点上的目录中的网页文件内容不同
          以便查看效果。

    创建Pod
      kubectl apply -f pod-hostpath-vol.yaml
      kubectl get pods -o wide
      curl   http://Pod_IP

      #删除看它若调度到第二个节点上,继续访问Pod_IP,会发现依然可访问.
      #但这仅实现了节点级别数据持久,若节点挂了,数据依然不保!
      kubectl delete -f pod-hostpath-vol.yaml 
          

    NFS类型的网络共享存储卷:
      1. 配置前的准备工作
      node10:
        在集群外的一台主机上启动NFS服务,让它来提供网络共享存储.
        yum install -y nfs nfs-utils
        vim /etc/exports
         /data/volumes 192.168.111.0/24(rw,no_root_squash) 

        mkdir -pv /data/volumes
        systemctl start nfs

      2. 在集群内运行Pod的两个宿主机上测试挂载nfs共享,若能挂载,则Pod一定是能使用NFS共享存储的。
        yum install -y nfs-utils
        mount -t nfs node10:/data/volumes /mnt    #若能成功挂载,就可以卸载了.

    3. 创建NFS 共享存储卷的配置清单:
    vim  pod-nfs-vol.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-nfs-vol
      namespace: default
    spec:
      containers:
      - name: myapp
          image: ikubernetes/myapp:v1
          volumeMounts:
        -  name: html
           mountPath: /usr/share/nginx/html/
     volumes:
     -  name: html
        nfs:
         path: /data/volumes
         server: node10.test.com    #先测试直接让Pod挂载NFS共享

     #应用上面的清单文件,创建Pod来测试

       kubectl apply -f pod-nfs-vol.yaml
       kubectl get pods

     node10: #在NFS共享目录中创建index.html
      echo “<h1> NFS share stroage server </h1>” >> /data/volumes/index.html

    回到pod所在节点:
      curl   http://Pod_IP    #可以看到正常返回NFS Share ....的信息.

    PVC 使用示例:
      PV的访问模型:
       accessModes:
       ReadWriteOnce【简写:RWO】: 单路读写,即仅能有一个节点挂载读写
       ReadOnlyMany【ROX】: 多路只读
         ReadWriteMany【RWX】:多路读写

    1. 准备后端存储环境:
     node10:
      mkdir /data/volumes/{v1,v2,v3,v4,v5}

      vim /etc/exports
        /data/volumes/v1         192.168.111.0/24(rw,no_root_squash)
        /data/volumes/v2    192.168.111.0/24(rw,no_root_squash)
        /data/volumes/v3    192.168.111.0/24(rw,no_root_squash)

      exportfs   -arv
      showmount   -e

    2.  将这几个共享存储卷在K8s上定义为PV
    vim  pv-demo.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv01   #PV是集群级别的资源,因此它不能定义在名称空间中,它可以被任何名称空间使用.
                     名称空间也不能嵌套,因为它也是集群级别的资源.
      labels:
           name: pv01
           rate: high    #添加一个速度标签,用于标明其存储效率更高,以便后期标签选择器选择.
    spec:
      nfs:
        path: /data/volumes/v1
        server: node10.test.com
      #对于访问模型,可定义为底层共享存储的子集,但不能是超集
      #即: NFS支持RWO,ROX,RWX,但我创建PV时,可只提供其中一个或多个.
      accessModes: ["ReadWriteMany", “ReadWriteOnce”]
     capacity:
          #对于存储能力,它的单位有:T,P,G,M,K或 Ti,Pi,Gi,Mi,Ki 区别:加i的是以1024为换算单位的。
          storage: 2Gi 
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv02     
      labels:
       name: pv02
       rate: high       
    spec:
     nfs:
        path: /data/volumes/v2
        server: node10.test.com
     accessModes: ["ReadWriteMany","ReadOnlyMany"]
     capacity:
        storage: 5Gi
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv03    
      labels:
        name: pv03
        rate: high       
    spec:
     nfs:
       path: /data/volumes/v3
       server: node10.test.com
     accessModes: ["ReadWriteMany","ReadOnlyMany"]
     capacity:
        storage: 10Gi

      创建PV
      kubectl apply -f pv-demo.yaml
      kubectl get pv
       RECLAIM POLICY:回收策略
        Retain: 保留,即若Pod绑定了一个PVC,PVC绑定了一个PV,后来Pod删除了,那么PV中的数据要怎么处理?
            Retain是默认回收策略,即这些数据保留着,以便Pod再次创建时还能使用。
        Released: 这种回收策略是, 不保留数据, 即Pod删除,则PV自动回收,清空里面的数据,并允许其他Pod绑定使用.
        Delete: 删除,即PVC和PV解除绑定后,PV自动删除.数据也就被清空了。

    创建PVC:
    vim   pod-pvc-vol.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
         name: mypvc
         namespace: default
    spec:
       #它必须是PV的子集,即PV必须能符合它的要求.
       accessModes: ["ReadWriteMany"]
       resources:
          requests:
            storage: 6Gi
    ---
    apiVersion: v1
    kind: Pod
    metadata:
       name: pod-vol-pvc
       namespace: default
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        volumeMounts:
         - name: html
           mountPath: /usr/share/nginx/html/
        volumes:
        -  name: html
           persistentVolumeClaim:
             claimName: mypvc
    # kubectl  apply  -f  pod-pvc-vol.yaml
        #验证:
        # kubectl get pv
            NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
            pv01   1Gi        RWO,RWX        Retain           Available                                           7m3s
            pv02   2Gi        ROX,RWX        Retain           Available                                           7m3s
            pv03   5Gi        ROX,RWX        Retain           Available                                           6m3s
            pv04   10Gi       ROX,RWX        Retain           Bound       default/mypvc                           6m3s
            pv05   20Gi       ROX,RWX        Retain           Available                                           6m3s
            
    # kubectl describe pod pod-vol-pvc 
            Name:         pod-vol-pvc
            Namespace:    default
            .....
                Mounts:
                  /var/lib/nginx/html from html (rw)
                  /var/run/secrets/kubernetes.io/serviceaccount from default-token-6xlcj (ro)
            .......
            Volumes:
              html:
                Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
                ClaimName:  mypvc
                ReadOnly:   false
    
    # kubectl get pvc
            NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
            mypvc   Bound    pv04     10Gi       ROX,RWX                       100s
    
    # kubectl describe pvc mypvc
            Name:          mypvc
            Namespace:     default
            StorageClass:  
            Status:        Bound
            Volume:        pv04
            .......
            Capacity:      10Gi
            Access Modes:  ROX,RWX
            VolumeMode:    Filesystem
            Events:        <none>
            Mounted By:    pod-vol-pvc  #这里可查看此PVC当前挂载到那个容器里了,本例中是挂载到 pod-vol-pvc这个容器中了。
    
    注意:
     PVC 它是K8s中的标准资源,它存储在API Server的etcd(集群状态存储)存储数据库中,即便Pod因为故障被删除了,依然不影响PVC的存在,下次Pod启动后,依然可以使用PVC.
  • 相关阅读:
    py-day2-4 python 集合
    LR_问题_控制器不能使用定义的负载生成器
    LR_问题_无法使用LR的Controller,提示缺少license
    LR_问题_在导入wsdl时出现parsing error
    class, extends和super es6语法
    格式化日期
    CLR
    【sqlserver】批量插入10万数据
    php正则表达式匹配函数
    css overflow
  • 原文地址:https://www.cnblogs.com/wn1m/p/11288671.html
Copyright © 2011-2022 走看看