Python 应用 → Docker → K8s 全流程
端到端部署:构建 Python 应用、容器化、推送到镜像仓库、部署到 K8s 集群
你将学到
- 完整的端到端部署流程
- 从代码到生产的完整链路
- 多环境部署策略
- 生产级配置最佳实践
前置知识
架构设计
代码提交 → 构建镜像 → 推送仓库 → K8s 部署 → 服务暴露
│ │ │ │ │
└──────────┴──────────┴──────────┴──────────┘
完整部署链路
实现步骤
第一步:Python 应用
# app/app.py
from flask import Flask, jsonify
import os
app = Flask(__name__)
@app.route("/")
def index():
env = os.getenv("APP_ENV", "development")
return jsonify({
"message": "Hello from K8s!",
"environment": env,
"version": "1.0.0"
})
@app.route("/health")
def health():
return jsonify({"status": "healthy"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
第二步:Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
HEALTHCHECK CMD curl -f http://localhost:8000/health || exit 1
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "app:app"]
第三步:构建和推送镜像
# 构建镜像
docker build -t myapp:1.0 .
# 打标签
docker tag myapp:1.0 username/myapp:1.0
docker tag myapp:1.0 username/myapp:latest
# 推送到 Docker Hub
docker push username/myapp:1.0
docker push username/myapp:latest
第四步:K8s 部署文件
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: username/myapp:1.0
ports:
- containerPort: 8000
env:
- name: APP_ENV
value: "production"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: ClusterIP
# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
第五步:部署到 K8s
# 部署
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/ingress.yaml
# 查看状态
kubectl get pods
kubectl get services
kubectl get ingress
# 查看日志
kubectl logs -f deployment/myapp
# 更新镜像
kubectl set image deployment/myapp myapp=username/myapp:2.0
# 回滚
kubectl rollout undo deployment/myapp
完整项目结构
myapp/
├── app/
│ └── app.py
├── k8s/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
├── Dockerfile
└── requirements.txt
最佳实践
- 镜像标签:使用版本号,不要用 latest
- 资源限制:设置合理的 CPU 和内存限制
- 健康检查:配置 liveness 和 readiness 探针
- 滚动更新:默认支持零停机部署
- 配置分离:使用 ConfigMap 管理配置
常见问题
Q: 如何查看部署状态?
A: kubectl get pods -w 实时监控。
Q: 如何回滚部署?
A: kubectl rollout undo deployment/myapp
Q: 如何扩缩容?
A: kubectl scale deployment myapp --replicas=5
扩展挑战
- 实现自动化部署流水线
- 添加多环境支持
- 实现金丝雀发布
相关课程
| 课程 | 相关章节 |
|---|---|
| Python | Web开发入门:Flask 框架简介 |
| Docker | Dockerfile 基础 |
| Docker | 镜像仓库 |
| K8s | Deployment |