每天5分钟玩转Kubernetes | Volume
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天5分钟玩转Kubernetes | Volume相关的知识,希望对你有一定的参考价值。
书籍来源:cloudman《每天5分钟玩转Kubernetes》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
本节我们讨论Kubernetes的存储模型Volume,学习如何将各种持久化存储映射到容器。
我们经常会说:容器和Pod是短暂的。其含义是它们的生命周期可能很短,会被频繁地销毁和创建。容器销毁时,保存在容器内部文件系统中的数据都会被清除。
为了持久化保存容器的数据,可以使用Kubernetes Volume。
Volume的生命周期独立于容器,Pod中的容器可能被销毁和重建,但Volume会被保留。
本质上,Kubernetes Volume是一个目录,这一点与Docker Volume类似。当Volume被mount到Pod,Pod中的所有容器都可以访问这个Volume。Kubernetes Volume也支持多种backend类型,包括emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph等,完整列表可参考
https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes。
Volume提供了对各种backend的抽象,容器在使用Volume读写数据的时候不需要关心数据到底是存放在本地节点的文件系统中还是云硬盘上。对它来说,所有类型的Volume都只是一个目录。
我们将从最简单的emptyDir开始学习Kubernetes Volume。
9.1.1 emptyDir
emptyDir是最基础的Volume类型。正如其名字所示,一个emptyDir Volume是Host上的一个空目录。
emptyDir Volume对于容器来说是持久的,对于Pod则不是。当 Pod从节点删除时,Volume的内容也会被删除。但如果只是容器被销毁而Pod还在,则Volume不受影响。
也就是说:emptyDir Volume的生命周期与Pod一致。
Pod中的所有容器都可以共享Volume,它们可以指定各自的 mount路径。下面通过例子来实践emptyDir,配置文件如下所示。
[root@k8s-master ~]# cat emptyDir.yml
apiVersion: v1
kind: Pod
metadata:
name: producer-consumer
spec:
containers:
- image: busybox
name: producer
volumeMounts:
- mountPath: /producer_dir
name: shared-volume
args:
- /bin/sh
- -c
- echo "hello world" > /producer_dir/hello; sleep 30000
- image: busybox
name: consumer
volumeMounts:
- mountPath: /consumer_dir
name: shared-volume
args:
- /bin/sh
- -c
- cat /consumer_dir/hello; sleep 30000
volumes:
- name: shared-volume
emptyDir:
[root@k8s-master ~]#
这里我们模拟了一个producer-consumer场景。Pod有两个容器producer和consumer,它们共享一个Volume。producer负责往Volume中写数据,consumer则是从Volume读取数据。
① 文件最底部volumes定义了一个emptyDir类型的Volume shared-volume。
② producer容器将shared-volume mount到/producer_dir目录。
③ producer通过echo将数据写到文件hello里。
④ consumer容器将shared-volume mount到/consumer_dir目录。
⑤ consumer通过cat从文件hello读数据。
执行命令创建Pod,如图所示。
kubectl logs显示容器consumer成功读到了producer写入的数据,验证了两个容器共享emptyDir Volume。
因为emptyDir是Docker Host文件系统里的目录,其效果相当于执行了docker run -v/producer_dir和docker run -v /consumer_dir。通过 docker inspect查看容器的详细配置信息,我们发现两个容器都mount 了同一个目录,如图所示。
这里
/var/lib/kubelet/pods/3eb96f19-7689-44c4-8e41-fdd04fec65f2/volumes/kubernetes.io~empty-dir/shared-volume就是emptyDir在Host上的真正路径。
emptyDir是Host上创建的临时目录,其优点是能够方便地为Pod中的容器提供共享存储,不需要额外的配置。它不具备持久性,如果 Pod不存在了,emptyDir也就没有了。根据这个特性,emptyDir特别适合Pod中的容器需要临时共享存储空间的场景,比如前面的生产者消费者用例。
9.1.2 hostPath
hostPath Volume的作用是将Docker Host文件系统中已经存在的目录mount给Pod的容器。大部分应用都不会使用hostPath Volume,因为这实际上增加了Pod与节点的耦合,限制了Pod的使用。不过那些需 要访问Kubernetes或Docker内部数据(配置文件和二进制库)的应用则需要使用hostPath。
比如kube-apiserver和kube-controller-manager就是这样的应用,通过kubectl edit --namespace=kube-system pod kube-apiserver-k8s-master查看kube-apiserver Pod的配置,Volume的相关部分如图所示。
这里定义了三个hostPath:volume k8s-certs、ca-certs和etc-pki,分别对应Host目录/etc/kubernetes/pki、/etc/ssl/certs和/etc/pki。
如果Pod被销毁了,hostPath对应的目录还是会被保留,从这一点来看,hostPath的持久性比emptyDir强。不过一旦Host崩溃,hostPath 也就无法访问了。
接下来我们将学习具备真正持久性的Volume。
9.1.3 外部Storage Provider
如果Kubernetes部署在诸如AWS、GCE、Azure等公有云上,可以直接使用云硬盘作为Volume。下面给出一个AWS Elastic Block Store的例子,如下所示(未验证,因无aws资源)。
[root@k8s-master ~]# cat storage.yml
apiVersion: v1
kind: Pod
metadata:
name: using-ebs
spec:
containers:
- image: busybox
name: using-ebs
volumeMounts:
- mountPath: /test-ebs
name: ebs-volume
volumes:
- name: ebs-volume
# This AWS EBS volume must already exist.
awsElasticBlockStore:
volumeId: <volume-id>
fsType: ext4
[root@k8s-master ~]#
要在Pod中使用ESB volume,必须先在AWS中创建,然后通过volume-id引用。其他云硬盘的使用方法可参考各公有云厂商的官方文档。
Kubernetes Volume也可以使用主流的分布式存储,比如Ceph、GlusterFS等。下面给出一个Ceph的例子,如下所示。(未验证,因无ceph存储)
[root@k8s-master ~]# cat ceph.yml
apiVersion: v1
kind: Pod
metadata:
name: using-ceph
spec:
containers:
- image: busybox
name: using-ceph
volumeMounts:
- name: ceph-volume
mountPath: /test-ceph
volumes:
- name: ceph-volume
cephfs:
path: /some/path/in/side/cephfs
monitors: "10.16.154.78:6789"
[root@k8s-master ~]#
Ceph文件系统的/some/path/in/side/cephfs目录被mount到容器路径/test-ceph。
相对于emptyDir和hostPath,这些Volume类型的最大特点就是不依赖Kubernetes。Volume的底层基础设施由独立的存储系统管理,与Kubernetes集群是分离的。数据被持久化后,即使整个Kubernetes崩 溃也不会受损。
当然,运维这样的存储系统通常不是一项简单的工作,特别是对可靠性、可用性和扩展性有较高要求的时候。
以上是关于每天5分钟玩转Kubernetes | Volume的主要内容,如果未能解决你的问题,请参考以下文章
每天5分钟玩转Kubernetes | Kubernetes Dashboard安装
每天5分钟玩转Kubernetes | Deployment
每天5分钟玩转Kubernetes | Deployment