Docker
当我们使用 Docker 时,设置数据卷(Volume)还是比较简单的,只需要在容器映射指定卷的路径,然后在容器中使用该路径即可。
比如这种:
# tomcat
tomcat01:
hostname: tomcat01
restart: always
image: jdk-tomcat:v8
container_name: tomcat8-1
links:
- mysql:mysql
volumes:
- /home/soft/docker/tomcat/webapps:/usr/local/apache-tomcat-8.5.39/webapps
- /home/soft/docker/tomcat/logs:/usr/local/apache-tomcat-8.5.39/logs
- /etc/localtime:/etc/localtime
environment:
JAVA_OPTS: -Dspring.profiles.active=prod
TZ: Asia/Shanghai
LANG: C.UTF-8
LC_ALL: zh_CN.UTF-8
env_file:
- /home/soft/docker/env/tomcat.env
为什么要设置 Volume? 当然是因为我们要持久化数据,要把数据存储到硬盘上。
k8s
到了 k8s 这儿,你会发现事情没那么简单了,涌现出了一堆概念:
- Pv
- Pvc
- StorageClass
- Provisioner
- …
先不管这些复杂的概念,我只想存个文件,有没有简单的方式?
有,我们先回顾下基本概念。
我们知道,Container 中的文件在磁盘上是临时存放的,当容器崩溃时文件丢失。kubelet 会重新启动容器, 但容器会以干净的状态重启。所以我们要使用 Volume 来持久化数据。
Docker 也有 卷(Volume) 的概念,但对它只有少量且松散的管理。 Docker 卷是磁盘上或者另外一个容器内的一个目录 Docker 提供卷驱动程序,但是其功能非常有限。
Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。
临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁 持久卷。对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。
卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放 的内容。
使用卷时,在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。 各个卷则挂载在镜像内的指定路径上。 卷不能挂载到其他卷之上,也不能与其他卷有硬链接。Pod 配置中的每个容器必须独立指定各个卷的挂载位置。
通过上面的概念我们知道 Volume 有不同的类型,有临时的,也有持久的,那么我们先说说简单的,即解决“我只想存个文件,有没有简单的方式”的需求。
hostPath
hostPath 卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中。看个示例:
apiVersion: v1
kind: Pod
metadata:
name: test-webserver
spec:
containers:
- name: test-webserver
image: k8s.gcr.io/test-webserver:latest
volumeMounts:
- mountPath: /var/local/aaa
name: mydir
- mountPath: /var/local/aaa/1.txt
name: myfile