K8S 之 存储卷 hostPath

摘要

存储卷 hostPath 介绍

  • hostPath 是一种直接把 Node 节点本地文件或目录 挂载到 Pod 容器里的存储卷。

  • 容易破坏节点环境,不建议生产使用

  • 同一个 Deployment 的多个 Pod 被调度到同一个节点,并且它们的 hostPath 配置指向相同的宿主机路径,这些 Pod 之间是可以共享该目录中文件的。

  • 典型使用场景

场景 示例
日志收集 挂载 /var/log 到 Pod 内部
挂载宿主机配置文件 如挂载 /etc/hosts/etc/localtime
使用宿主机 docker.sock 挂载 /var/run/docker.sock 运行 Docker-in-Docker
存储调试临时文件 Pod 调试时访问宿主机特定目录

示例

  • Pod 内部 /mnt/hostdata 映射到宿主机 /data 目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: hostpath-example
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "sleep 3600"]
volumeMounts: # 存储卷挂载点
- mountPath: /mnt/hostdata # 挂载点路径,挂载到容器的 /mnt/hostdata 目录
name: myvolume # 存储卷名称 ,与 volumes 中定义的 volume 配置名称一致
volumes: # 存储卷声明
- name: myvolume # 存储卷名称
hostPath: # 存储卷类型,这里是 hostPath
path: /data # 主机目录
type: Directory # 可选字段,主要用于挂载前验证
  • hostPath.type 可以配置的值如下,默认为 空。

type 含义
DirectoryOrCreate 如果 /data 不存在则自动创建 ,权限为 0755
Directory 必须存在且为目录
File 必须存在且为文件
Socket 必须是 socket
CharDevice 字符设备
BlockDevice 块设备
FileOrCreate 不存在则自动创建空文件,权限设置为 0644
不设置 默认值是空,主机上的路径无论是文件、目录、甚至不存在,都会直接挂载 ,容易引起预期之外的挂载问题
  • Kubernetes 在删除 Pod 时,不会删除 hostPath 所挂载的宿主机目录或文件

存储卷类型 删除 Pod 后目录会被删除吗? 说明
emptyDir 会被删除 临时目录,Pod 生命周期结束自动清理
hostPath 不会删除 宿主机路径独立于 Pod 生命周期,不会清理