高级5-6 小时·全栈部署

Python 应用 → Docker → K8s 全流程

端到端部署:构建 Python 应用、容器化、推送到镜像仓库、部署到 K8s 集群

PythonDockerK8sfullstackkubernetesdeploymentend-to-end

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

最佳实践

  1. 镜像标签:使用版本号,不要用 latest
  2. 资源限制:设置合理的 CPU 和内存限制
  3. 健康检查:配置 liveness 和 readiness 探针
  4. 滚动更新:默认支持零停机部署
  5. 配置分离:使用 ConfigMap 管理配置

常见问题

Q: 如何查看部署状态? A: kubectl get pods -w 实时监控。

Q: 如何回滚部署? A: kubectl rollout undo deployment/myapp

Q: 如何扩缩容? A: kubectl scale deployment myapp --replicas=5

扩展挑战

  1. 实现自动化部署流水线
  2. 添加多环境支持
  3. 实现金丝雀发布

相关课程

课程相关章节
PythonWeb开发入门:Flask 框架简介
DockerDockerfile 基础
Docker镜像仓库
K8sDeployment