在 Kubernetes 里,“本地卷”通常指 hostPath 或 local 这两种把宿主机目录直接挂进 Pod 的方案。
你的场景是:在 Pod 里跑 Flask,代码放在宿主机,改完文件希望容器里热重载——这正好用 hostPath 最直截了当,不需要分布式存储,也不依赖云厂商。
下面给你一份可复制-粘贴-运行的完整示例,带你完成:
- 宿主机准备目录 & 样本代码
- 写 Pod YAML(hostPath 挂载)
- 本地修改文件 → 容器内实时热重载验证
① 在宿主机准备目录
# 任意目录,/home 下即可
sudo mkdir -p /home/hw/flask/code
cd /home/hw/flask/code
# 1. requirements
cat > requirements.txt <<EOF
flask==2.3.3
EOF
# 2. 简单 flask 应用(开启 debug= True 实现文件变动自动重载)
cat > app.py <<EOF
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello from hostPath! time: 2025-11-15 \n"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
EOF
# 3. 目录授权(避免容器非 root 无法写入 .pyc)
sudo chmod -R 777 /home/hw/flask/code
② Pod YAML:hostPath 挂进去
flask-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: flask-hostpath
spec:
restartPolicy: Always
initContainers:
- name: pip-install
image: docker.io/library/python:3.11-slim
imagePullPolicy: Never
command:
- /bin/sh
- -c
- |
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
--trusted-host pypi.tuna.tsinghua.edu.cn \
-t /site-packages flask==2.3.3
volumeMounts:
- name: site-pkg
mountPath: /site-packages
containers:
- name: flask
image: docker.io/library/python:3.11-slim
imagePullPolicy: Never
env:
- name: PYTHONPATH
value: /site-packages
command: ["python", "-u", "/code/app.py"]
workingDir: /code
ports:
- containerPort: 5000
volumeMounts:
- name: site-pkg
mountPath: /site-packages
- name: code
mountPath: /code
readOnly: false
volumes:
- name: site-pkg # <<< 缺失的这一行
emptyDir: {} # <<< 缺失的这一行
- name: code
hostPath:
path: /home/hw/flask/code
type: DirectoryOrCreate
③ 启动 & 验证
kubectl apply -f flask-hostpath.yaml
# 端口映射到本地浏览器
kubectl port-forward pod/flask-hostpath 5000:5000
# 浏览器访问 http://localhost:5000
# 应看到 "Hello from hostPath! time: 2025-11-15"
④ 热重载实测(关键步骤)
- 不重启容器,直接在宿主机改代码:
sed -i 's/Hello from hostPath/Hi, hostPath Hot-Reload/' /home/hw/flask/code/app.py - 刷新浏览器 → 内容立即变化,Flask debug 模式已生效。
如果你想验证“容器内也实时生效”,可执行:
kubectl exec flask-hostpath -- tail -n 1 /code/app.py输出:
Hi, hostPath Hot-Reload
⑤ 常见坑 & 注意事项(来自社区总结)
- hostPath 只能单节点使用,多节点请换 local 卷+nodeAffinity ;
- 节点重装或 Pod 漂移到其他节点时,代码目录会“消失”——本地开发无妨,生产请用 PVC+NFS 或 GitRepo 卷;
- 挂载点不要选系统目录(
/,/var/run等),否则可能把系统文件覆盖导致容器启动失败 ; - 若 SELinux 开启,需加
:Z或关闭 SELinux,否则权限拒绝。
⑥ 一键清理
kubectl delete pod flask-hostpath
# 宿主机目录可保留,下次继续用
✅ 总结一句话
hostPath 就是“把宿主机目录原封不动塞进容器”,最适合本地开发、热重载、单节点调试;
跟着上面 4 步做,你已实现 K8s 本地卷挂载 + Flask 热更新!