# k8s/celery-deployment.yaml - MonkeyCode生成 apiVersion: apps/v1 kind: Deployment metadata: name: myapp-celery-worker namespace: myapp-production labels: app: myapp component: celery-worker spec: replicas: 2 selector: matchLabels: app: myapp component: celery-worker template: metadata: labels: app: myapp component: celery-worker spec: containers: - name: celery-worker image: registry.example.com/myapp-api:latest command: ["celery", "-A", "app.celery_app", "worker", "--loglevel=info", "--concurrency=4"] envFrom: - configMapRef: name: myapp-config - secretRef: name: myapp-secrets resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "2000m" memory: "1Gi" --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-celery-beat namespace: myapp-production labels: app: myapp component: celery-beat spec: replicas: 1 # Beat只能运行1个副本 selector: matchLabels: app: myapp component: celery-beat template: metadata: labels: app: myapp component: celery-beat spec: containers: - name: celery-beat image: registry.example.com/myapp-api:latest command: ["celery", "-A", "app.celery_app", "beat", "--loglevel=info"] envFrom: - configMapRef: name: myapp-config - secretRef: name: myapp-secrets6. 数据库部署(StatefulSet)
# k8s/postgres-statefulset.yaml - MonkeyCode生成 apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres namespace: myapp-production spec: serviceName: postgres-service replicas: 1 # 生产环境建议用云RDS selector: matchLabels: app: myapp component: postgres template: metadata: labels: app: myapp component: postgres spec: containers: - name: postgres image: postgres:16-alpine ports: - containerPort: 5432 env: - name: POSTGRES_DB value: myapp - name: POSTGRES_USER value: appuser - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: myapp-secrets key: DB_PASSWORD - name: PGDATA value: /var/lib/postgresql/data/pgdata resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "2000m" memory: "4Gi" volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data livenessProbe: exec: command: ["pg_isready", "-U", "appuser", "-d", "myapp"] initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: ["pg_isready", "-U", "appuser", "-d", "myapp"] initialDelaySeconds: 5 periodSeconds: 5 volumeClaimTemplates: - metadata: name: postgres-data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 50Gi --- apiVersion: v1 kind: Service metadata: name: postgres-service namespace: myapp-production spec: selector: app: myapp component: postgres ports: - port: 5432 targetPort: 5432 clusterIP: None # Headless Service(StatefulSet用)7. CI/CD流水线(GitHub Actions → K8s)
# .github/workflows/deploy.yml - MonkeyCode生成 name: Build and Deploy on: push: branches: [main] env: REGISTRY: registry.example.com IMAGE_NAME: myapp-api jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.11' - run: pip install -r requirements.txt - run: pytest tests/ -v --cov=app --cov-report=xml - uses: codecov/codecov-action@v3 build: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login to Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - name: Build and Push uses: docker/build-push-action@v5 with: context: . push: true tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest cache-to: type=inline deploy: needs: build runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v4 - name: Deploy to K8s uses: steebchen/kubectl@v2.1.1 with: config: ${{ secrets.KUBE_CONFIG }} command: set image deployment/myapp-api api=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} -n myapp-production - name: Verify Deployment run: | kubectl rollout status deployment/myapp-api -n myapp-production --timeout=300s kubectl get pods -n myapp-production -l app=myapp,component=api8. 一键部署脚本
#!/bin/bash # scripts/deploy.sh - MonkeyCode生成 set -euo pipefail ENV=${1:-production} IMAGE_TAG=${2:-latest} echo "🚀 Deploying myapp to $ENV (tag: $IMAGE_TAG)" # 创建命名空间 kubectl apply -f k8s/namespace.yaml # 应用配置 kubectl apply -f k8s/configmap.yaml # 应用数据库 kubectl apply -f k8s/postgres-statefulset.yaml # 等待数据库就绪 echo "⏳ Waiting for PostgreSQL..." kubectl wait --for=condition=ready pod -l app=myapp,component=postgres -n myapp-$ENV --timeout=120s # 应用API kubectl set image deployment/myapp-api api=registry.example.com/myapp-api:$IMAGE_TAG -n myapp-$ENV kubectl rollout status deployment/myapp-api -n myapp-$ENV --timeout=300s # 应用Celery kubectl set image deployment/myapp-celery-worker celery-worker=registry.example.com/myapp-api:$IMAGE_TAG -n myapp-$ENV # 应用HPA kubectl apply -f k8s/hpa.yaml echo "✅ Deployment complete!" kubectl get all -n myapp-$ENV