1. 项目概述
在云原生应用开发领域,Azure Container Apps 作为微软推出的全托管容器服务,正逐渐成为轻量化微服务部署的首选方案。结合 GitHub Actions 的自动化能力,我们可以构建一套完整的 CI/CD 流水线,实现从代码提交到生产环境部署的端到端自动化。这套方案特别适合中小型团队快速搭建云原生应用的交付管道,无需管理底层 Kubernetes 集群即可享受容器化带来的便利。
我在实际项目中使用这套组合已有两年多时间,处理过从简单的静态网站到复杂的微服务架构等各种场景。本文将分享经过实战检验的完整部署流程,包含多个官方文档未提及的配置技巧和排错经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 Azure 资源创建
首先需要在 Azure 门户创建 Container Apps 环境。建议使用 Azure CLI 进行初始化配置:
bash复制# 登录 Azure 账户
az login
# 创建资源组
az group create --name my-container-apps --location eastus
# 创建 Container Apps 环境
az containerapp env create \
--name my-app-env \
--resource-group my-container-apps \
--location eastus
关键参数说明:
--location选择离用户最近的地域(如eastus为美国东部)- 环境创建约需 5-8 分钟,期间可以并行配置其他组件
注意:首次创建时会自动启用 Log Analytics 工作区,用于收集容器日志和监控数据。如果已有工作区,可通过
--logs-workspace-id参数指定。
2.2 GitHub 仓库设置
在项目仓库中需要配置以下 secrets:
AZURE_CREDENTIALS:包含 Azure 服务主体的认证信息REGISTRY_LOGIN_SERVER:容器注册表的登录地址(如myregistry.azurecr.io)REGISTRY_USERNAME:注册表用户名REGISTRY_PASSWORD:注册表密码
生成服务主体凭证的命令:
bash复制az ad sp create-for-rbac \
--name my-github-actions \
--role contributor \
--scopes /subscriptions/<subscription-id>/resourceGroups/my-container-apps \
--sdk-auth
3. CI/CD 流水线构建
3.1 GitHub Actions 工作流设计
在 .github/workflows 目录下创建 deploy.yml 文件:
yaml复制name: Build and Deploy to Azure Container Apps
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
env:
APP_NAME: my-container-app
RESOURCE_GROUP: my-container-apps
ENVIRONMENT_NAME: my-app-env
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Login to Azure Container Registry
uses: azure/docker-login@v1
with:
login-server: ${{ secrets.REGISTRY_LOGIN_SERVER }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push container image
run: |
docker build -t ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.APP_NAME }}:${{ github.sha }} .
docker push ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.APP_NAME }}:${{ github.sha }}
- name: Azure Login
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Container Apps
run: |
az containerapp update \
--name ${{ env.APP_NAME }} \
--resource-group ${{ env.RESOURCE_GROUP }} \
--image ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.APP_NAME }}:${{ github.sha }}
3.2 多环境部署策略
对于生产环境,建议采用蓝绿部署策略:
yaml复制- name: Deploy to Staging
run: |
az containerapp update \
--name ${{ env.APP_NAME }}-staging \
--resource-group ${{ env.RESOURCE_GROUP }} \
--image ${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ env.APP_NAME }}:${{ github.sha }}
- name: Swap Production
run: |
az containerapp revision copy \
--name ${{ env.APP_NAME }} \
--resource-group ${{ env.RESOURCE_GROUP }} \
--from-revision ${{ env.APP_NAME }}-staging
4. 高级配置与优化
4.1 自动扩缩容配置
在创建 Container App 时添加扩缩容规则:
bash复制az containerapp create \
--name my-app \
--resource-group my-container-apps \
--environment my-app-env \
--image myregistry.azurecr.io/my-container-app:latest \
--target-port 80 \
--ingress external \
--min-replicas 1 \
--max-replicas 10 \
--scale-rule-name http-scale-rule \
--scale-rule-type http \
--scale-rule-http-concurrency 100
关键参数说明:
--min-replicas:最小实例数(成本优化)--max-replicas:最大实例数(流量高峰保护)--scale-rule-http-concurrency:单个实例最大并发请求数
4.2 自定义域名与 TLS
为生产环境配置自定义域名:
bash复制az containerapp update \
--name my-app \
--resource-group my-container-apps \
--ingress external \
--target-port 80 \
--custom-domain myapp.example.com \
--certificate-name my-app-cert \
--certificate-value "$(cat my-cert.pem)"
5. 监控与日志收集
5.1 内置监控仪表板
Azure 门户提供开箱即用的监控视图,包含:
- 请求量/响应时间趋势
- 容器实例数量变化
- 内存/CPU 使用率
- 失败请求统计
5.2 自定义日志查询
使用 KQL 查询特定时间段的错误日志:
kusto复制ContainerAppConsoleLogs_CL
| where TimeGenerated > ago(24h)
| where Log_s contains "error"
| project TimeGenerated, Log_s, ContainerAppName_s
| order by TimeGenerated desc
6. 常见问题排查
6.1 部署失败诊断流程
- 检查 GitHub Actions 执行日志
- 验证 Azure 服务主体权限
- 确认容器注册表访问权限
- 查看 Container App 事件日志:
bash复制az containerapp logs show \
--name my-app \
--resource-group my-container-apps \
--tail 100
6.2 性能优化技巧
- 使用多阶段构建减小镜像体积
- 配置合理的健康检查端点
- 对于 CPU 密集型应用,调整 CPU 配额:
bash复制az containerapp update \
--name my-app \
--resource-group my-container-apps \
--cpu 2 \
--memory 4Gi
7. 成本控制建议
- 设置自动停止规则(非生产环境)
- 使用消费计划而非专用计划
- 监控并优化实例利用率
- 设置预算告警:
bash复制az consumption budget create \
--amount 100 \
--category cost \
--time-grain monthly \
--start-date 2023-01-01 \
--end-date 2023-12-31 \
--resource-group my-container-apps
在实际项目中,这套方案将部署时间从传统的手动操作缩短到 10 分钟内完成,部署频率提升 5-8 倍。最关键的是通过基础设施即代码的方式,确保了环境的一致性,减少了人为错误的发生。
