• kubernetes系列10—存储卷详解


    本文收录在容器技术学习系列文章总目录

    1、认识存储卷

    1.1 背景

      默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubelet 会重启这个容器,但是文件会丢失-这个容器会是一个全新的状态;第二,当很多容器在同一Pod中运行的时候,很多时候需要数据文件的共享。Kubernete Volume解决了这个问题。

    1.2 介绍

      Docker有一个Volumes的概念,虽然这个Volume有点宽松和管理性比较小。在Docker中,一个 Volume 是一个简单的所在主机的一个目录或者其它容器中的。生命周期是没有办法管理,直到最近才有 local-disk-backed 磁盘。Docker现在提供了磁盘驱动,但是功能非常有限(例如Docker1.7只能挂在一个磁盘每个容器,并且无法传递参数)

      从另外一个方面讲,Kubernetes volume,拥有明确的生命周期,与所在的Pod的生命周期相同。因此,Kubernetes volume独立与任何容器,与Pod相关,所以数据在重启的过程中还会保留,当然,如果这个Pod被删除了,那么这些数据也会被删除。更重要的是,Kubernetes volume 支持多种类型,任何容器都可以使用多个Kubernetes volume

      它的核心,一个 volume 就是一个目录,可能包含一些数据,这些数据对pod中的所有容器都是可用的,这个目录怎么使用,什么类型,由什么组成都是由特殊的volume 类型决定的。

      要使用Volumepod需要指定Volume的类型和内容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。

      容器中的进程可以看成由Docker镜像和卷组成的文件系统视图。Docker镜像位于文件系统层次结构的根目录下,任何卷都安装在图像中的指定路径上。卷无法装入其他卷或具有到其他卷的硬链接。Pod中的每个容器必须独立指定每个卷的安装位置。

    1.3 存储卷常用类型

    •  非持久性存储
      •  emptyDir
      •  hostPath
    •  网络连接性存储
      •  SANiSCSI
      •  NFSnfscfs
    •  分布式存储
      •  glusterfsrbdcephfs
    •  云端存储
      •  EBSAzure Disk、阿里云、gitRepo
    $ kubectl explain pod.spec.volumes 查询k8s支持的所有类型存储卷

    2、emptyDir存储卷

    2.1 emptyDir介绍

      使用emptyDir,当Pod分配到Node上时,将会创建emptyDir,并且只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。

      常用于作为临时目录、或缓存使用。

    2.2 演示:创建emptyDir存储卷

    1)编写yaml文件,并创建

    先创建一个名为html的存储卷;再由2pod都挂载此存储卷;

    pod1基于此存储卷作为nginx的主目录;pod2向此存储卷目录写入东西;

    [root@master volumes]# vim vol-emptyDir-demo.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-vol-demo
      namespace: default
      labels:
        app: myapp
        tier: frontend
      annotations:
        along.com/created-by: "cluster admin"
    spec:
      volumes:
      - name: html
        emptyDir: {}
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/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"
    [root@master volumes]# kubectl apply -f vol-emptyDir-demo.yaml
    pod/pod-vol-demo created
    

      

    2)验证

    ---pod创建成功
    [root@master ~]# kubectl get pods -o wide
    NAME           READY     STATUS    RESTARTS   AGE       IP             NODE
    pod-vol-demo   2/2       Running   0          13s       10.244.1.106   node1
    ---访问业务,输出是pod2的输入
    [root@master ~]# curl 10.244.1.106
    Tue Jan 29 07:19:13 UTC 2019
    Tue Jan 29 07:19:15 UTC 2019
    Tue Jan 29 07:19:17 UTC 2019
    Tue Jan 29 07:19:19 UTC 2019
    Tue Jan 29 07:19:21 UTC 2019
    Tue Jan 29 07:19:23 UTC 2019
    Tue Jan 29 07:19:25 UTC 2019
    Tue Jan 29 07:19:27 UTC 2019
    Tue Jan 29 07:19:29 UTC 2019
    

      

    3、hostPath存储卷

    3.1 emptyDir介绍

      hostPath允许挂载Node(宿主机)上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath

    3.2 hostPath类型

    行为
    空字符串(默认)用于向后兼容,这意味着在安装hostPath卷之前不会执行任何检查。
    DirectoryOrCreate 如果给定路径中不存在任何内容,则将根据需要创建一个空目录,权限设置为0755,与Kubelet具有相同的组和所有权。
    Directory 目录必须存在于给定路径中
    FileOrCreate 如果给定路径中不存在任何内容,则会根据需要创建一个空文件,权限设置为0644,与Kubelet具有相同的组和所有权。
    File 文件必须存在于给定路径中
    Socket UNIX套接字必须存在于给定路径中
    CharDevice 字符设备必须存在于给定路径中
    BlockDevice 块设备必须存在于给定路径中

    3.2 演示:创建hostPath存储卷

    1)编写yaml文件,并创建

    创建存储卷,使用DirectoryOrCreate类型,node节点不存在会自动创建

    [root@master volumes]# vim vol-hostpath-demo.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: vol-hostpath
      namespace: default
    spec:
      volumes:
      - name: html
        hostPath:
          path: /data/pod/volume1/
          type: DirectoryOrCreate
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
    [root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml
    pod/vol-hostpath created
    

      

    2)查询验证

    [root@master volumes]# kubectl get pods -o wide
    NAME           READY     STATUS    RESTARTS   AGE       IP             NODE
    vol-hostpath   1/1       Running   0          3s        10.244.1.111   node1
    ---在node1上查询是否生产目录
    [root@node1 ~]# ll -d /data/pod/volume1/index.html 
    -rw-r--r-- 1 root root 17 Sep 21 14:44 /data/pod/volume1/index.html
    

      

    3)验证存储卷功能

    ---在node1上生成文件
    [root@node1 ~]# echo "node01.along.com" > /data/pod/volume1/index.html
    ---访问pod内服务,显示成功
    [root@master volumes]# curl 10.244.1.111
    node01.along.com
    

      

    4)就算pod被删除再重建,只要node还在,存储卷就还在

    [root@master volumes]# kubectl delete -f vol-hostpath-demo.yaml
    pod "vol-hostpath" deleted
    [root@master volumes]# kubectl apply -f vol-hostpath-demo.yaml
    pod/vol-hostpath created
    [root@master volumes]# kubectl get pods -o wide
    NAME           READY     STATUS    RESTARTS   AGE       IP             NODE
    vol-hostpath   1/1       Running   0          3s        10.244.1.112   node1
    [root@master volumes]# curl 10.244.1.112
    node01.along.com
    

      

    4、共享存储NFS存储卷

    4.1 NFS存储卷介绍

      NFS Network File System的缩写,即网络文件系统。Kubernetes中通过简单地配置就可以挂载NFSPod中,NFS中的数据是可以永久保存的,同时NFS支持同时写操作。Pod被删除时,Volume被卸载,内容被保留。这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递。

    4.2 演示:创建NFS存储卷

    4.2.1 在一台服务器搭建NFS

    1)事前准备

    修改k8s集群服务的hosts文件,使之能解析nfs服务器

    [root@master volumes]# vim /etc/hosts
    192.168.130.103 master
    192.168.130.104 node1
    192.168.130.105 node2
    192.168.130.106 nfs

    k8s集群服务器,安装nfs-utils 工具

    $ yum -y install nfs-utils
    

      

    2)在106服务器上提供nfs服务

    [root@nfs ~]# yum -y install nfs-utils
    [root@nfs ~]# mkdir /data/volumes -p
    [root@nfs ~]# vim /data/volumes/index.html
    <h1>NFS stor</h1>
    [root@nfs ~]# vim /etc/exports
    /data/volumes	192.168.130.0/24(rw,no_root_squash)
    [root@nfs ~]# systemctl start nfs
    

      

    4.2.1 创建NFS存储卷

    1)编写yaml文件,并创建

    [root@master volumes]# vim vol-nfs-demo.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: vol-nfs
      namespace: default
    spec:
      volumes:
      - name: html
        nfs:
          path: /data/volumes
          server: nfs
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
    [root@master volumes]# kubectl apply -f vol-nfs-demo.yaml
    pod/vol-nfs created
    

      

    2)验证,访问服务成功

    [root@master ~]# kubectl get pods -o wide
    NAME      READY     STATUS    RESTARTS   AGE       IP             NODE
    vol-nfs   1/1       Running   0          9s        10.244.1.115   node1
    [root@master ~]# curl 10.244.1.115
    <h1>NFS stor</h1>

    删除pod,再创建,也还存在数据。

    5、一些不常用的存储卷

    5.1 gitRepo

    1)介绍

    gitRepo volumegit代码下拉到指定的容器路径中

    2)示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: server
    spec:
      volumes:
      - name: git-volume
        gitRepo:
          repository: "git@github.com:alonghub/my-git-repository.git"
         revision: "22f1d8406d464b0c0874075539c1f2e96c253775"
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
        - name: git-volume
          mountPath: /usr/share/nginx/html/
    

      

    5.2 glusterfs

      glusterfs,允许将Glusterfs(一个开源网络文件系统)Volume安装到pod中。不同于emptyDirPod被删除时,Volume只是被卸载,内容被保留。味着glusterfs能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间切换

      注意::必须先运行自己的GlusterFS安装,然后才能使用它。

      有关更多详细信息,请参阅GlusterFS示例

    5.3 RBD

      RBD允许Rados Block Device格式的磁盘挂载到Pod中,同样的,当pod被删除的时候,rbd也仅仅是被卸载,内容保留,rbd能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间切换

      有关更多详细信息,请参阅RBD示例

    5.4 cephfs

      cephfs Volume可以将已经存在的CephFS Volume挂载到pod中,与emptyDir特点不同,pod被删除的时,cephfs仅被被卸载,内容保留。cephfs能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间切换

      提示:可以使用自己的Ceph服务器运行导出,然后在使用cephfs

      有关更多详细信息,请参阅CephFS示例

  • 相关阅读:
    pom.xml报错web.xml is missing and <failOnMissingWebXml> is set to true
    JDK编译环境和运行环境版本不一致:unsupported major.minor version 52.0
    jdk与eclipse版本不一致导致:java was started but returned exit code=13
    Maven工程配置文件存放路径与读取配置文件路径配置
    maven官网下载bin.tar.gz和bin.zip以及src.tar.gz和src.zip的区别
    SpringBoot如何配置静态地址与访问路径
    好用免费的PPT网站
    executor可实现线程任务的提交与执行解耦的原因
    Maven配置阿里镜像库和本地库的方法
    SpringBoot热加载
  • 原文地址:https://www.cnblogs.com/along21/p/10338242.html
Copyright © 2020-2023  润新知