zoukankan      html  css  js  c++  java
  • Kubernetes 第十一章 Volumes

    Volumes:

    Container中的磁盘文件是短暂的,这在容器中运行时会给非平凡的应用程序带来一些问题。首先,当容器崩溃时,kubelet将重新启动它,但文件将丢失 - Container以干净状态启动。其次,当在一起运行Container时,Pod通常需要在这些容器之间共享文件。Kubernetes Volume抽象解决了这两个问题。

    Background背景

    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 类型决定的容器中的一个进程看到文件系统由Docker镜像和磁盘构成,Docker镜像是文件系统的最底层,所有的磁盘都是挂在在这个镜像的特殊路径上。磁盘不能被挂在到被的磁盘或者创建硬链接。每个Pod中的容器必须是独立指定的取挂在这些磁盘
    

    Types of Volumes

    Kubernete 支持如下类型的volume:

    emptyDir
    
    hostPath
    
    gcePersistentDisk
    
    awsElasticBlockStore
    
    nfs
    
    iscsi
    
    glusterfs
    
    rbd
    
    gitRepo
    
    secret
    
    persistentVolumeClaim

      

    emptyDir

    一个emptyDir 第一次创建是在一个pod被指定到具体node的时候,并且会一直存在在pod的生命周期当中,正如它的名字一样,它初始化是一个空的目录,pod中的容器都可以读写这个目录,这个目录可以被挂在到各个容器相同或者不相同的的路径下。当一个pod因为任何原因被移除的时候,这些数据会被永久删除。注意:一个容器崩溃了不会导致数据的丢失,因为容器的崩溃并不移除pod.
    • 普通空间,基于磁盘的数据存储
    • 作为从崩溃中恢复的备份点
    • 存储那些那些需要长久保存的数据,例web服务中的数据

      默认的,emptyDir 磁盘会存储在主机所使用的媒介上,可能是SSD,或者网络硬盘,这主要取决于你的环境。当然,我们也可以将emptyDir.medium的值设置为Memory来告诉Kubernetes 来挂在一个基于内存的目录tmpfs,因  为tmpfs速度会比硬盘块度了,但是,当主机重启的时候所有的数据都会丢失

    [root@kube volumes]# cat volume_pod.yaml    //pods 中各个容器都能共享 
    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-pod-t1
    
    spec: 
      containers:
      - image: busybox:latest
        name: vol-1
        volumeMounts:
        - mountPath:  /root/k8s/volumes/test/
          name: volume-test    //name 为下面  volumes 字段定义的名称
        command: ["bin/sh"]
        args: ["-c", 'while true; do echo $(date) >> /root/k8s/volumes/test/imdex.html; sleep 2; done']
      volumes:
      - name: volume-test
        emptyDir: {}
    

      

    hostPath

    一个hostPath类型的磁盘就是挂在了主机的一个文件或者目录,这个功能可能不是那么常用,但是这个功能提供了一个很强大的突破口对于某些应用来说
    
    例如,如下情况我们旧可能需要用到hostPath
    
    某些应用需要用到docker的内部文件,这个时候只需要挂在本机的/var/lib/docker作为hostPath
    在容器中运行cAdvisor,这个时候挂在/dev/cgroups
    当我们使用hostPath的时候要注意如下内容
    
    从模版文件中创建的pod可能会因为主机上文件夹目录的不同而导致一些问题
    [root@kube volumes]# cat hostpath.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: nginx 
        name: t1111-container
        volumeMounts:
        - mountPath: /test-pd    //挂载路径
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
          path: /data      //本机路径
    [root@kube volumes]# 
    [root@kube volumes]# kubectl exec -it test-s2 -- /bin/bash    /进入容器,看到容器挂载了  test-pd 目录,在 host 主机的 /data 目录中创建的文件在容器中也能看到
    root@test
    -s2:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test-pd tmp usr var root@test-s2:/# cd test-pd/ root@test-s2:/test-pd# ls 11122 test123 root@test-s2:/test-pd#

    其他相关信息可以参考:

    http://docs.kubernetes.org.cn/429.html

  • 相关阅读:
    制作Windows Server 2008安装启动U盘
    wireshark教程(一)
    TCPdump抓包命令详解
    ATM交换机 和普通交换机区别
    胖ap和瘦ap区别
    酒店网络非常常见故障一例
    JQuery EasyUI DataGrid动态合并(标题)单元) 一
    字典表左右选择
    treegrid-dnd.js
    MySQL开发规范
  • 原文地址:https://www.cnblogs.com/zy09/p/11418166.html
Copyright © 2011-2022 走看看