必须使用HostPath卷实现Pod与宿主机目录映射;需提前创建目录并设属主65534,SELinux启用时须配置上下文;YAML中type推荐DirectoryOrCreate,mountPath须为容器内绝对路径且name严格匹配;跨节点调度时需确保各Node路径与权限一致。

要在Kubernetes中让Pod直接读写宿主机上的某个目录(比如日志归集、本地数据库存储或配置文件热更新),必须通过HostPath卷实现节点级路径映射,否则容器内无法触达Node真实文件系统。
确认宿主机目标路径已存在且权限可控
登录将要调度该Pod的Node节点,手动创建目标目录并设置属主:mkdir -p /data/app-logs && chown -R 65534:65534 /data/app-logs。这里65534是大多数非特权容器默认使用的runAsUser ID(即nobody用户),【若不匹配会导致容器启动后无写入权限】。
检查SELinux状态:sestatus。如果为enforcing,需额外执行 semanage fcontext -a -t container_file_t "/data/app-logs(/.*)?" && restorecon -Rv /data/app-logs,否则挂载后容器会因策略拒绝访问。
编写Pod YAML声明HostPath卷和挂载点
在spec.volumes下定义hostPath类型卷,指定path与type:
type必须显式设置,常见取值有DirectoryOrCreate、Directory、FileOrCreate、File。生产环境推荐用DirectoryOrCreate——它会在宿主机路径不存在时自动创建目录,避免Pod因路径缺失卡在ContainerCreating状态。
volumeMounts中mountPath必须是容器内绝对路径,且不能与容器镜像原有内容冲突(例如不要覆盖/etc或/usr);name字段必须与volumes中对应卷的name严格一致。
部署并验证挂载是否生效
第一步:kubectl apply -f pod-hostpath.yaml
第二步:kubectl exec -it
第三步:kubectl exec -it
第四步:在宿主机上执行ls -l /data/app-logs/,确认test.log已出现且属主为65534。
这一步操作起来很简单,直接把文件拖进去就行。但要注意:若Pod被驱逐后重新调度到其他Node,而该Node上没有提前创建对应路径或权限不一致,新Pod将无法启动或挂载失败。











