K8S之存储Volume概述与说明,并详解常用Volume示例
主机配置规划
服务器名称(hostname) | 系统版本 | 配置 | 内网IP | 外网IP(模拟) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
Volume概述
在容器中的文件在磁盘上是临时存放的,当容器关闭时这些临时文件也会被一并清除。这给容器中运行的特殊应用程序带来一些问题。
首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建。
其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。
Kubernetes 抽象出 Volume 对象来解决这两个问题。
Kubernetes Volume卷具有明确的生命周期——与包裹它的 Pod 相同。 因此,Volume比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,Volume也将不再存在。更重要的是,Kubernetes 可以支持许多类型的Volume卷,Pod 也能同时使用任意数量的Volume卷。
使用卷时,Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).
Volume类型
Kubernetes 支持下列类型的卷:
1 | awsElasticBlockStore |
这里我们只介绍常用的存储,包括:Secret、ConfigMap、emptyDir、hostPath。
其中Secret参考文章:「Kubernetes K8S之存储Secret详解」
ConfigMap参考文章:「Kubernetes K8S之存储ConfigMap详解」
本文只说emptyDir和hostPath存储。
emptyDir卷
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。就像它的名称表示的那样,卷最初是空的。
尽管 Pod 中每个容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。
如果Pod中有多个容器,其中某个容器重启,不会影响emptyDir 卷中的数据。当 Pod 因为某些原因被删除时,emptyDir 卷中的数据也会永久删除。
注意:容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
emptyDir的一些用途:
- 缓存空间,例如基于磁盘的归并排序
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件
emptyDir示例
yaml文件
1 | [root@k8s-master emptydir]# pwd |
启动pod,并查看状态
1 | [root@k8s-master emptydir]# kubectl apply -f pod_emptydir.yaml |
emptyDir验证
在pod中的myapp-pod容器内操作
1 | [root@k8s-master emptydir]# kubectl exec -it pod-emptydir -c myapp-pod -- sh |
在pod中的busybox-pod容器内操作
1 | [root@k8s-master emptydir]# kubectl exec -it pod-emptydir -c busybox-pod -- sh |
由上可见,一个Pod中多个容器可共享同一个emptyDir卷。
hostPath卷
hostPath 卷能将主机node节点文件系统上的文件或目录挂载到你的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。
hostPath 的一些用法有
- 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
- 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
- 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
支持类型
除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。支持的 type 值如下:
取值 | 行为 |
---|---|
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查 | |
DirectoryOrCreate | 如果指定的路径不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权 |
Directory | 给定的路径必须存在 |
FileOrCreate | 如果给定路径的文件不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权【前提:文件所在目录必须存在;目录不存在则不能创建文件】 |
File | 给定路径上的文件必须存在 |
Socket | 在给定路径上必须存在的 UNIX 套接字 |
CharDevice | 在给定路径上必须存在的字符设备 |
BlockDevice | 在给定路径上必须存在的块设备 |
注意事项
当使用这种类型的卷时要小心,因为:
- 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
- 当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 卷使用的资源。
- 基础主机上创建的文件或目录只能由 root 用户写入。需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。
hostPath示例
yaml文件
1 | [root@k8s-master hostpath]# pwd |
启动pod,并查看状态
1 | [root@k8s-master hostpath]# kubectl apply -f pod_hostpath.yaml |
hostPath验证
根据pod,在k8s-node01节点宿主机操作【因为Pod分配到了该节点】
1 | # 对挂载的目录操作 |
1 | # 进入pod 中的指定容器【如果只有一个容器,那么可以不指定容器】 |
相关阅读
2、Kubernetes K8S之存储ConfigMap详解