k8s动手任务6:使用“本地卷”的flask微服务

9 阅读2分钟

在 Kubernetes 里,“本地卷”通常指 hostPathlocal 这两种把宿主机目录直接挂进 Pod 的方案。
你的场景是:在 Pod 里跑 Flask,代码放在宿主机,改完文件希望容器里热重载——这正好用 hostPath 最直截了当,不需要分布式存储,也不依赖云厂商。

下面给你一份可复制-粘贴-运行的完整示例,带你完成:

  1. 宿主机准备目录 & 样本代码
  2. 写 Pod YAML(hostPath 挂载)
  3. 本地修改文件 → 容器内实时热重载验证

① 在宿主机准备目录

# 任意目录,/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"

④ 热重载实测(关键步骤)

  1. 不重启容器,直接在宿主机改代码:
    sed -i 's/Hello from hostPath/Hi, hostPath Hot-Reload/' /home/hw/flask/code/app.py
    
  2. 刷新浏览器 → 内容立即变化,Flask debug 模式已生效

如果你想验证“容器内也实时生效”,可执行:

kubectl exec flask-hostpath -- tail -n 1 /code/app.py

输出:Hi, hostPath Hot-Reload


⑤ 常见坑 & 注意事项(来自社区总结)

  • hostPath 只能单节点使用,多节点请换 local 卷+nodeAffinity
  • 节点重装或 Pod 漂移到其他节点时,代码目录会“消失”——本地开发无妨,生产请用 PVC+NFSGitRepo 卷;
  • 挂载点不要选系统目录(/, /var/run 等),否则可能把系统文件覆盖导致容器启动失败 ;
  • 若 SELinux 开启,需加 :Z 或关闭 SELinux,否则权限拒绝。

⑥ 一键清理

kubectl delete pod flask-hostpath
# 宿主机目录可保留,下次继续用

✅ 总结一句话

hostPath 就是“把宿主机目录原封不动塞进容器”,最适合本地开发、热重载、单节点调试
跟着上面 4 步做,你已实现 K8s 本地卷挂载 + Flask 热更新