zzzzy09

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

 

posted on 2019-08-27 14:33  zzzzy09  阅读(195)  评论(0编辑  收藏  举报