智能摘要 AI
本文介绍了Kubernetes中的卷(Volumes)概念及其在解决容器生命周期管理中的重要性。文中重点讲解了`hostPath`类型的卷,其作用是将宿主机上的文件或目录挂载到Pod中。通过示例展示了如何配置`hostPath`卷,包括`volumes`和`volumeMounts`的相关参数,如`path`、`type`、`mountPath`等,并详细解释了各参数的功能和限制条件。此外,还讨论了`mountPropagation`的不同模式及其应用场景。文中通过实际操作演示了如何正确配置和验证`hostPath`卷的使用,确保数据持久性和多容器间的数据共享。最终通过实验验证了配置的有效性。
前言
容器中的磁盘文件随着容器的生而生,随着容器的死而灭,这给运行在容器中的重要应用来说存在一些问题:
于是,K8S便创造了卷——Volumes
kubeSphere磁盘挂载设置界面,此处使用了kubesphere 自带磁盘挂载设置(采用hostPath),配置完成查看yaml 并未生效,运行容器时也报出未找到对应存储卷的错误。
卷类型之hostPath
hostPath类型的卷可以把宿主机节点上的文件或文件夹挂载到pod中
先来看看hostPath类型的卷如何配置:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- name: test-volume
mountPath: /test-pd
mountPropagation: None
readOnly: true
subPath: test.txt
subPathExpr:
这里针对每一个配置项逐一解释:
- sepc.volumes: 配置宿主机节点上的挂载目录
| 配置项名称 | 是否必须 | 说明 |
|---|---|---|
| name | 必须 | 卷的名称,在pod内必须唯一 |
| hostPath.path | 必须 | 宿主机上的目录路径,如果是符号链接,它将根据符号链接追踪到实际路径 |
| hostPath.type | 可选 | hostPath卷的类型,默认为“” |
hostPath.type的枚举值有:
| 取值 | 说明 |
|---|---|
| DirectoryOrCreate | 如果给定路径不存在,将根据需要在那里创建一个空目录,权限设置为755,与Kubelet具有相同的组和所有权。 |
| Directory | 给定的目录路径必须存在 |
| FileOrCreate | 如果给定路径不存在,将根据需要在那里创建一个空文件,权限设置为644,与Kubelet具有相同的组和所有权。 |
| File | 给定路径上必须存在对应文件 |
| Socket | 给定路径上必须存在一个UNIX socket |
| CharDevice | 给定路径上必须存在字符设备 |
| BlockDevice | 给定路径上必须存在块设备 |
使用type字段时需要注意:
- 由于节点上的文件不同,具有相同配置(如从podTemplate创建的)的Pods在不同节点上的行为可能不同
- 当Kubernetes按照计划添加资源感知调度(?)时,它将不会使用hostPath声明的资源
- 在主机上创建的文件或目录只能由根用户写。你需要在一个有特权的容器中以root身份运行进程,或者修改主机上的文件权限,以便能够写入hostPath卷
- containers.volumeMounts: 配置挂载到pod里的路径
| 配置项名称 | 是否必须 | 说明 |
|---|---|---|
| name | 必须 | 此处卷的名称必须和spec.volumes下的某个卷的名称一致 |
| mountPath | 必须 | 挂载到容器里的路径,不能包含英文冒号‘:’ |
| mountPropagation | 可选 | 该参数决定如何将挂载从主机传播到容器,反之亦然。默认为None |
| readOnly | 可选 | 是否只读,默认为可读写 |
| subPath | 可选 | 将spec.volumes中的子目录挂载到容器中不同的位置,默认为“”,也就是挂载到spec.volumes定义的根目录 |
| subPathExpr | 可选 | 与subPath类似,但是路径中可以支持从环境变量取值:${VAR_NAME},默认为“”,也就是spec.volumes定义的根目录。和subPath只能有一个出现 |
mountPropagation的取值有:
- None:默认值,卷在容器中以及宿主机上的后续挂载相互隔离
- HostToContainer:任何在宿主机上创建的卷挂载在容器中都是可见的
- Bidirectional:任何在容器中创建的卷挂载都会传播到宿主机,然后传播到所有使用此挂载的pod中的容器里
了解了yaml 对应配置项,我们进行手动配置对应的挂载磁盘
修改后,创建容器成功
验证:宿主机创建一个文件
查看pod内文件情况
至此验证成功。



评论 (0)