ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Azure Container Apps与GitHub Actions实现云原生CI/CD

Azure Container Apps与GitHub Actions实现云原生CI/CD 1. 为什么选择Azure Container Apps GitHub Actions在云原生时代容器化部署已经成为现代应用交付的标准方式。Azure Container AppsACA作为微软推出的全托管容器服务相比传统Kubernetes方案它隐藏了集群管理的复杂性同时保留了容器编排的核心优势。结合GitHub Actions的自动化能力我们可以构建从代码提交到生产部署的完整流水线。我最近在客户项目中实际采用了这套方案发现几个显著优势零基础设施管理ACA自动处理节点扩缩容、负载均衡和健康检查开发者只需关注容器镜像成本优化基于实际请求量自动缩放包括缩到零特别适合流量波动大的场景与GitHub生态深度集成GitHub Actions可以直接调用Azure CLI完成部署无需额外配置凭据中转多环境支持通过GitHub Environments功能可以轻松实现开发/测试/生产环境的隔离部署2. 环境准备与工具链配置2.1 本地开发环境搭建在开始之前需要确保本地具备以下工具Docker Desktop建议安装最新稳定版当前为4.26.x。如果遇到virtualisation support not detected错误需要进入BIOS启用Intel VT-x/AMD-V虚拟化支持在Windows功能中开启Hyper-V和Windows Subsystem for Linux执行bcdedit /set hypervisorlaunchtype auto后重启Azure CLI通过winget install -e --id Microsoft.AzureCLI安装后执行az login完成认证GitHub CLI方便后续创建仓库和workflow文件实测中发现Windows 10家庭版用户可能无法启用Hyper-V。替代方案是使用WSL 2后端通过wsl --install -d Ubuntu安装Linux子系统后在Docker设置中切换为WSL 2引擎。2.2 Azure资源预配在Azure Portal中创建必要资源# 创建资源组 az group create --name aca-cicd-demo --location eastus # 创建Container Apps环境 az containerapp env create \ --name my-aca-env \ --resource-group aca-cicd-demo \ --location eastus \ --logs-workspace-id LOG_ANALYTICS_WORKSPACE_ID \ --logs-workspace-key LOG_ANALYTICS_KEY获取Log Analytics工作区信息的命令az monitor log-analytics workspace show \ --resource-group RG_NAME \ --workspace-name WORKSPACE_NAME \ --query customerId -o tsv az monitor log-analytics workspace get-shared-keys \ --resource-group RG_NAME \ --workspace-name WORKSPACE_NAME \ --query primarySharedKey -o tsv3. 容器化应用开发要点3.1 编写高效的Dockerfile以Python Flask应用为例推荐使用多阶段构建优化镜像# 构建阶段 FROM python:3.11-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt # 运行时阶段 FROM python:3.11-slim WORKDIR /app # 从builder阶段复制已安装的包 COPY --frombuilder /root/.local /root/.local COPY . . # 确保脚本可执行 RUN chmod x boot.sh ENV PATH/root/.local/bin:$PATH EXPOSE 5000 ENTRYPOINT [./boot.sh]关键优化点使用slim基础镜像减少体积分离构建和运行时阶段避免将构建工具打包到最终镜像通过--user安装Python包避免root权限问题显式设置PATH确保用户安装的包可被找到3.2 本地测试验证开发阶段建议使用docker-compose.yml模拟生产环境version: 3.8 services: web: build: . ports: - 5000:5000 environment: - FLASK_ENVdevelopment volumes: - .:/app redis: image: redis:alpine ports: - 6379:6379启动命令docker-compose up --build4. GitHub Actions流水线设计4.1 基础CI/CD流程在项目根目录创建.github/workflows/deploy.ymlname: Build and Deploy to ACA on: push: branches: [ main ] pull_request: branches: [ main ] env: AZURE_CONTAINER_APP_NAME: my-app RESOURCE_GROUP: aca-cicd-demo CONTAINER_APP_ENV: my-aca-env jobs: build-and-deploy: runs-on: ubuntu-latest environment: production permissions: contents: read id-token: write steps: - uses: actions/checkoutv3 - name: Log in to Azure uses: azure/loginv1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Build and push container image uses: azure/docker-loginv1 with: login-server: ${{ secrets.REGISTRY_LOGIN_SERVER }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - run: | docker build -t ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.AZURE_CONTAINER_APP_NAME }}:${GITHUB_SHA} . docker push ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.AZURE_CONTAINER_APP_NAME }}:${GITHUB_SHA} - name: Deploy to Azure Container Apps run: | az containerapp update \ --name ${{ env.AZURE_CONTAINER_APP_NAME }} \ --resource-group ${{ env.RESOURCE_GROUP }} \ --image ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.AZURE_CONTAINER_APP_NAME }}:${GITHUB_SHA}4.2 关键安全配置在GitHub仓库设置中配置以下secretsAZURE_CLIENT_ID服务主体的Application IDAZURE_TENANT_IDAzure AD租户IDAZURE_SUBSCRIPTION_IDAzure订阅IDREGISTRY_LOGIN_SERVERACR登录服务器如myregistry.azurecr.ioREGISTRY_USERNAMEACR用户名REGISTRY_PASSWORDACR密码创建Azure服务主体az ad sp create-for-rbac \ --name github-actions-aca \ --role contributor \ --scopes /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP_NAME \ --sdk-auth安全提示建议为服务主体分配最小权限如仅限特定资源组并在GitHub中使用环境级别的secrets而非仓库级secrets。5. 高级部署策略与优化5.1 蓝绿部署配置修改Container Apps的ingress配置实现流量分割az containerapp ingress traffic set \ --name my-app \ --resource-group aca-cicd-demo \ --revision-weight latest0 stable100在GitHub Actions中添加分段发布步骤- name: Staged Deployment run: | # 先部署新版本但不接收流量 az containerapp update \ --name ${{ env.AZURE_CONTAINER_APP_NAME }} \ --resource-group ${{ env.RESOURCE_GROUP }} \ --image ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.AZURE_CONTAINER_APP_NAME }}:${GITHUB_SHA} # 测试新版本 az containerapp revision activate \ --revision my-app--NEW_REVISION_SUFFIX \ --resource-group ${{ env.RESOURCE_GROUP }} # 逐步切换流量 for percent in 10 25 50 75 100; do az containerapp ingress traffic set \ --name ${{ env.AZURE_CONTAINER_APP_NAME }} \ --resource-group ${{ env.RESOURCE_GROUP }} \ --revision-weight latest$percent stable$((100 - percent)) sleep 300 # 等待5分钟观察指标 done5.2 自动缩放配置根据CPU/内存用量或HTTP请求量自动扩缩容az containerapp update \ --name my-app \ --resource-group aca-cicd-demo \ --min-replicas 1 \ --max-replicas 10 \ --scale-rule-name http-scaling \ --scale-rule-type http \ --scale-rule-http-concurrency 100 \ --scale-rule-metadata concurrentRequests1006. 监控与日志收集实践6.1 内置监控仪表板Azure Container Apps原生集成以下监控能力应用仪表板显示请求率、响应时间、副本数等关键指标日志流实时查看容器标准输出修订版本对比比较不同版本的CPU/内存使用情况通过CLI快速访问日志az containerapp logs show \ --name my-app \ --resource-group aca-cicd-demo \ --follow6.2 自定义指标报警创建基于Prometheus指标的报警规则az monitor metrics alert create \ --name HighCPUAlert \ --resource-group aca-cicd-demo \ --scopes /subscriptions/SUBSCRIPTION_ID/resourceGroups/aca-cicd-demo/providers/Microsoft.App/containerapps/my-app \ --condition avg CPUUsage 80 \ --description Alert when CPU exceeds 80% \ --evaluation-frequency 5m \ --window-size 15m \ --severity 27. 常见问题排查手册7.1 镜像拉取失败典型错误Failed to pull image myregistry.azurecr.io/my-app:sha123: rpc error: code Unknown desc failed to pull and unpack image...排查步骤确认ACR与ACA位于同一区域检查ACR防火墙规则是否允许Azure服务访问验证使用的镜像tag确实存在az acr repository show-tags \ --name myregistry \ --repository my-app \ --output tsv7.2 启动超时问题如果容器启动时间超过ACA的默认30秒限制az containerapp update \ --name my-app \ --resource-group aca-cicd-demo \ --container-startup-timeout 120同时建议在Dockerfile中添加健康检查HEALTHCHECK --interval5s --timeout3s \ CMD curl -f http://localhost:5000/health || exit 17.3 环境变量注入通过GitHub Actions动态注入环境变量- name: Deploy with Environment Variables run: | az containerapp update \ --name ${{ env.AZURE_CONTAINER_APP_NAME }} \ --resource-group ${{ env.RESOURCE_GROUP }} \ --image ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.AZURE_CONTAINER_APP_NAME }}:${GITHUB_SHA} \ --set-env-vars \ DEPLOYMENT_ENVproduction \ COMMIT_SHA${GITHUB_SHA} \ BUILD_TIMESTAMP$(date -u %Y-%m-%dT%H:%M:%SZ)
返回列表