GitLab新手求教:如何用多集群Agent实现单Pipeline跨环境部署
GitLab Pipeline 多集群部署(基于Kubernetes Agent)
可以通过单个Pipeline完成所有集群的部署,核心是为每个环境定义专属的部署Job,并绑定对应的Kubernetes Agent即可。下面是具体的实现方法:
前提准备
确保你的三个Kubernetes Agent(对应dev/test/prod集群)已经完成GitLab项目/组的关联,并且每个Agent在GitLab中有唯一的名称(比如agent-dev、agent-test、agent-prod),同时Agent已在对应集群正常运行。
具体实现步骤
1. 编写.gitlab-ci.yml配置
在项目根目录创建.gitlab-ci.yml,通过定义多环境Job,并为每个Job指定对应的Agent,实现同一个Pipeline部署到不同集群。
示例配置:
stages: - build - deploy # 构建镜像Job(根据你的实际流程调整,若已有镜像源可省略) build-image: stage: build script: - docker build -t your-app-image:${CI_COMMIT_SHORT_SHA} . - docker push your-app-image:${CI_COMMIT_SHORT_SHA} only: - main # 部署到dev集群 deploy-dev: stage: deploy environment: name: dev url: https://dev.your-app.com script: - kubectl apply -f k8s/deployment.yaml -n dev - kubectl set image deployment/your-app your-app=your-app-image:${CI_COMMIT_SHORT_SHA} -n dev kubernetes: agent: name: agent-dev # 绑定dev集群的Agent only: - main # 部署到test集群(依赖dev部署完成) deploy-test: stage: deploy environment: name: test url: https://test.your-app.com script: - kubectl apply -f k8s/deployment.yaml -n test - kubectl set image deployment/your-app your-app=your-app-image:${CI_COMMIT_SHORT_SHA} -n test kubernetes: agent: name: agent-test # 绑定test集群的Agent only: - main needs: [deploy-dev] # 部署到production集群(手动触发,依赖test部署完成) deploy-prod: stage: deploy environment: name: production url: https://your-app.com script: - kubectl apply -f k8s/deployment.yaml -n prod - kubectl set image deployment/your-app your-app=your-app-image:${CI_COMMIT_SHORT_SHA} -n prod kubernetes: agent: name: agent-prod # 绑定prod集群的Agent only: - main when: manual # 手动触发,防止误部署 needs: [deploy-test]
2. 关键配置说明
- 指定Agent:每个部署Job通过
kubernetes.agent.name字段绑定对应的Agent,GitLab会自动通过该Agent连接到目标Kubernetes集群执行kubectl命令。 - 环境标识:
environment.name标记不同环境,GitLab会在界面上展示各环境的部署状态,还可配合环境保护规则(比如prod环境需审批)。 - 部署顺序:用
needs关键字控制部署流程,确保dev部署完成后再部署test,最后手动触发prod;若不需要顺序执行,可删除needs让多个部署Job并行。 - 镜像版本:使用
${CI_COMMIT_SHORT_SHA}作为镜像标签,保证每次部署用的是当前提交构建的镜像,避免版本混乱。
3. 优化建议
如果多个部署Job的脚本逻辑重复,可以用extends提取公共模板,减少冗余代码:
# 定义公共部署模板 .deploy-template: script: - kubectl apply -f k8s/deployment.yaml -n $ENV_NAME - kubectl set image deployment/your-app your-app=your-app-image:${CI_COMMIT_SHORT_SHA} -n $ENV_NAME deploy-dev: extends: .deploy-template stage: deploy environment: name: dev url: https://dev.your-app.com kubernetes: agent: name: agent-dev variables: ENV_NAME: dev only: - main
另外,建议把Kubernetes部署文件(deployment.yaml、service.yaml等)放在项目的k8s目录下,方便Pipeline调用;生产环境建议开启GitLab的环境保护功能,限制部署权限。
内容的提问来源于stack exchange,提问作者Andrea Maestroni
相关产品推荐
相关产品推荐

