如何在Kubernetes中用Gunicorn和Nginx部署Dash/Flask应用
在Kubernetes中用Gunicorn+Nginx部署Flask/Dash应用
一、改造Flask/Dash应用的Docker镜像
1. 更新依赖文件
在requirements.txt中添加Gunicorn依赖:
flask==2.3.3 dash==2.14.2 gunicorn==21.2.0 # 保留原有其他依赖
2. 替换启动命令(替代Flask开发服务器)
Flask后端:
将原flask run --host=0.0.0.0替换为Gunicorn启动命令,--workers建议设置为2*容器CPU核心数+1,可根据资源调整:gunicorn --workers=4 --bind=0.0.0.0:5000 app:app其中
app:app对应你的Flask应用文件(如app.py)中的Flask实例名。Dash前端:
Dash基于Flask构建,启动逻辑类似,需先在Dash代码中暴露Flask实例:# app_dash.py from dash import Dash app = Dash(__name__) server = app.server # 暴露Flask实例供Gunicorn调用 # 其他Dash逻辑...启动命令:
gunicorn --workers=4 --bind=0.0.0.0:8050 app_dash:server
3. 编写Dockerfile
以Flask后端为例,Dash前端只需修改启动命令和对应应用文件:
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 用Gunicorn替代Flask开发服务器启动 CMD ["gunicorn", "--workers=4", "--bind=0.0.0.0:5000", "app:app"]
二、添加Nginx反向代理层
建议Nginx与应用分离部署,负责请求转发、静态资源缓存、负载均衡。
1. 编写Nginx配置文件(nginx.conf)
以代理Flask后端为例,代理Dash只需修改proxy_pass地址:
server { listen 80; server_name _; # 转发请求到Flask的Kubernetes Service location / { proxy_pass http://flask-service:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 静态资源缓存配置(如果有) location /static { alias /app/static; expires 30d; } }
2. 构建Nginx镜像的Dockerfile
FROM nginx:alpine COPY nginx.conf /etc/nginx/conf.d/default.conf
三、调整Kubernetes清单
1. Flask后端的Deployment与Service
Deployment(flask-deployment.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: flask-app spec: replicas: 3 # 根据流量调整副本数 selector: matchLabels: app: flask-app template: metadata: labels: app: flask-app spec: containers: - name: flask-app image: 你的镜像仓库/flask-gunicorn:v1 # 替换为实际镜像地址 ports: - containerPort: 5000 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi" # 添加健康检查(建议在Flask中实现/health接口) livenessProbe: httpGet: path: /health port: 5000 initialDelaySeconds: 10 periodSeconds: 5 readinessProbe: httpGet: path: /health port: 5000 initialDelaySeconds: 5 periodSeconds: 3
Service(flask-service.yaml)
apiVersion: v1 kind: Service metadata: name: flask-service spec: selector: app: flask-app ports: - port: 5000 targetPort: 5000
2. Nginx代理的Deployment与Service(Flask为例)
Deployment(nginx-flask-deployment.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-flask spec: replicas: 2 selector: matchLabels: app: nginx-flask template: metadata: labels: app: nginx-flask spec: containers: - name: nginx-flask image: 你的镜像仓库/nginx-flask:v1 # 替换为实际Nginx镜像地址 ports: - containerPort: 80 resources: requests: cpu: "50m" memory: "64Mi" limits: cpu: "200m" memory: "128Mi"
Service(nginx-flask-service.yaml)
apiVersion: v1 kind: Service metadata: name: nginx-flask-service spec: type: NodePort # 按需选择LoadBalancer/ClusterIP selector: app: nginx-flask ports: - port: 80 targetPort: 80
3. Dash前端配置
Dash的Deployment、Service调整逻辑与Flask完全一致:
- 使用Gunicorn启动Dash应用
- 部署对应Nginx代理
- 替换镜像、端口(如容器端口8050)和Service名称即可
四、关键注意事项
- 资源适配:根据实际流量调整Gunicorn worker数、Kubernetes副本数及资源限制,避免资源浪费或不足。
- 镜像推送:确保所有构建好的镜像(Flask/Gunicorn、Dash/Gunicorn、Nginx)推送到Kubernetes集群可访问的镜像仓库。
- 负载均衡:若需更高可用性,可在Nginx层配置多上游节点,或使用Kubernetes的Service自带负载均衡能力。
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

