deployment-automation 部署自动化
概述 建立自动化部署管道,安全、可靠地将应用程序跨开发、测试和生产环境移动,最小化手动干预和风险。
何时使用
- 持续部署到Kubernetes
- 基础设施即代码部署
- 多环境推广
- 蓝绿部署策略
- 金丝雀发布管理
- 基础设施供应
- 自动化回滚程序
实施示例
- Helm部署图表
# helm/Chart.yaml
apiVersion: v2
name: myapp
description: 我的应用
type: application
version: 1.0.0
# helm/values.yaml
replicaCount: 3
image:
repository: ghcr.io/myorg/myapp
pullPolicy: IfNotPresent
tag: "1.0.0"
service:
type: ClusterIP
port: 80
targetPort: 3000
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
- GitHub Actions部署工作流
# .github/workflows/deploy.yml
name: 部署
on:
push:
branches: [main]
workflow_dispatch:
inputs:
environment:
description: '部署到的环境'
required: true
default: '测试'
type: choice
options:
- 测试
- 生产
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: ${{ github.event.inputs.environment || '测试' }}
permissions:
contents: read
packages: read
steps:
- uses: actions/checkout@v3
- name: 确定目标环境
id: env
run: |
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
echo "environment=测试" >> $GITHUB_OUTPUT
else
echo "environment=测试" >> $GITHUB_OUTPUT
fi
- name: 设置kubectl
uses: azure/setup-kubectl@v3
with:
version: 'latest'
- name: 配置kubectl
run: |
mkdir -p $HOME/.kube
echo "${{ secrets.KUBE_CONFIG }}" | base64 -d > $HOME/.kube/config
chmod 600 $HOME/.kube/config
- name: 使用Helm部署
run: |
helm repo add myrepo ${{ secrets.HELM_REPO_URL }}
helm repo update
helm upgrade --install myapp myrepo/myapp \
--namespace ${{ steps.env.outputs.environment }} \
--create-namespace \
--values helm/values-${{ steps.env.outputs.environment }}.yaml \
--set image.tag=${{ github.sha }} \
--wait \
--timeout 5m
- name: 验证部署
run: |
kubectl rollout status deployment/myapp \
-n ${{ steps.env.outputs.environment }} \
--timeout=5m
- ArgoCD部署
# argocd/myapp-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/helm-charts
targetRevision: HEAD
path: myapp
helm:
releaseName: myapp
values: |
image:
tag: v1.0.0
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
- 蓝绿部署
#!/bin/bash
# 部署绿色版本,运行测试,切换流量
helm upgrade --install myapp-green ./chart --set version=v2.0.0 --wait
kubectl run smoke-test --image=postman/newman --rm -- run tests/smoke.json
if [ $? -eq 0 ]; then
kubectl patch service myapp -p '{"spec":{"selector":{"version":"v2.0.0"}}}'
echo "✅ 流量切换到绿色版本"
else
helm uninstall myapp-green
exit 1
fi
最佳实践
✅ DO
- 使用基础设施即代码(Terraform, Helm)
- 实施GitOps工作流
- 使用蓝绿部署
- 实施金丝雀发布
- 自动化回滚程序
- 在测试环境中首先测试部署
- 使用功能标志进行逐步推出
- 监控部署健康
- 文档化部署程序
- 实施生产批准门
- 版本基础设施代码
- 使用环境一致性
❌ DON’T
- 直接部署到生产
- 跳过测试环境中的测试
- 使用手动部署脚本
- 部署没有回滚计划
- 忽略健康检查
- 使用硬编码配置
- 在关键小时部署
- 跳过部署前验证
- 忘记在部署前备份
- 从本地机器部署
部署清单
# 部署前验证
- [ ] 在测试中运行测试
- [ ] 验证数据库迁移
- [ ] 检查基础设施容量
- [ ] 查看变更日志
- [ ] 验证回滚计划
- [ ] 通知利益相关者
- [ ] 监控错误率
- [ ] 准备回滚脚本
资源