文章目录
1. Volumes配置管理
- 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个Pod中运行多个容器时,常常需要在这些容器之间共享文件。Kubernetes抽象出Volume对象来解决这两个问题
- Kubernetes卷具有明确的生命周期,与包裹它的Pod相同。因此,卷比Pod中运行的任何容器的存活周期都长,在容器重新启动时数据也会得到保留。当然,当一个Pod不再存在时,卷也将不再存在。也许更重要的是,Kubernetes可以支持许多类型的卷,Pod也能同时使用任意数量的卷
- 卷不能挂载到其他卷,也不能与其他卷有硬链接。Pod中的每个容器必须独立地指定每个卷的挂载位置。
2. 临时卷
2.1 emptyDir卷
- 当Pod指定到某个节点上时,首先创建一个emptyDir卷,并且只要Pod在该节点上运行,卷就一直存在。就像它的名称表示的那样,卷最初是空的。尽管Pod中的容器挂载emptyDIr卷的路径可能相同也可能不同,但是这些容器都可以读写emptyDir卷中相同的文件。当Pod因为某些原因被从节点上删除时,emptyDir卷中的数据也会永久删除。
- 适合作容器数据共享,不适合做数据永久化存储
使用场景:
- 缓存空间,例如基于磁盘的归并排序
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行
- 在Web服务器容器服务数据时,保存内容管理器容器获取的文件
默认情况下,emptyDir卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或ssd或网络存储,这取决于环境。也可以使用内存,速度虽然快,但是节点重启时就会被清楚,并且写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。
此处新建一个pod,包含两个容器,两个容器均挂载了相同的卷,只不过各自内部挂载目录不同。
vim emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol1
spec:
containers:
- image: busyboxplus
name: vm1
stdin: true
tty: true
volumeMounts:
- mountPath: /cache
name: cache-volume
- name: vm2
image: myapp:v1
volumeMounts:
- mountPath: /usr/share/nginx/html
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
medium: Memory
sizeLimit: 100Mi
启动后可看到两容器均成功挂载:
进入busybox容器内部:kubectl attach vol1 -c vm1 -it
可以看到Pod内部各容器共享Pod的IP地址
busybox本身不带任何其他功能,在共享目录中写入文件后,解析本地回环地址可看到内容:
这说明,共享目录挂载至vm2的mapp上的发布页时,自动的将首页内容通过80端口发布出去,所以能解析到,pod外部也可解析到:
文件大小超过限制后,不会立马被驱逐,过一段时即(1-2min)才会被kubelet evict掉。这是由于kubelet时定期检查,所以会有时间差。
emptydir缺点:
- 不能及时禁止用户使用内存,虽然kubelet evict会延迟1-2min,但是该延迟时间内,对node的风险较大
- 影响kubernetes调度,因为empty dir并不涉及node的resources,这样会造成Pod使用node内存,但是调度器并知道
- 用户不能及时感知内存不足
2.2 HostPath卷
hostpath卷能将主机节点文件系统上的文件或目录挂载到Pod中,虽然这不是大多数pod需要的,但是可以为一些应用程序提供强大的应急保障
hostPath的一些用法:
- 运行一个需要访问Dokcer引擎内部机制的容器,挂载/var/lib/docker路径(挂载的是主机路径)
- 在容器中运行cAdvisor(google的一个监控应用)时,以hostPath方式挂载/sys
- 允许Pod指定给定的hostPath在运行Pod之前是否应该存在,是否应该建立以及应该以什么方式存在
需要小心的地方:
- 具有相同配置(例如从Pod Templatate创建)的多个Pod会由于节点上文件的不同而在不同节点上有不同的行为
- 当kubernetes按照计划添加资源感知的调度时,这类调度机制将无法考虑由hostPath使用的资源
- 基础主机上创建的文件或目录只能由root用户写入。需要在特权容器中以root身份运行进程,或者修改主机上的文件权限以便容器能够写入hostPath卷
vim hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: myapp:v1
name: vm1
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-volume
volumes:
- name: test-volume
hostPath:
# 宿主上目录位置
path: /webdata
# 此字段为可选
type: DirectoryOrCreate
此时,解析该pod IP会403,
已知在node节点,也就是server3上挂载