基于Kubernetes与Gitlab实现Staging与Production分支差异化部署
GitLab CI 实现 Staging 与 Production 分支的独立部署
你完全可以通过在.gitlab-ci.yml中为生产环境的部署任务设置only: [master]来实现独立部署,这是核心的配置方式,但为了确保两个环境完全隔离、部署流程稳定,还有几个关键细节需要确认:
1. 核心配置:拆分独立的部署任务
首先,你需要在CI配置文件中创建两个独立的部署Job,分别绑定staging和master分支,示例如下:
# 部署到Staging环境 deploy_staging: stage: deploy script: # 替换为你实际的Staging部署命令,比如应用K8s的Staging配置文件 - kubectl apply -f k8s/staging/ --namespace staging only: - staging environment: name: staging url: https://staging.your-app.com # 可选,配置后GitLab会显示环境访问链接 # 部署到Production环境 deploy_production: stage: deploy script: # 替换为Production的部署命令,注意使用独立的K8s配置和命名空间 - kubectl apply -f k8s/production/ --namespace production only: - master when: manual # 强烈建议添加!生产环境手动触发,避免误提交直接部署 environment: name: production url: https://your-app.com
这样,当staging分支有提交时,只会触发deploy_staging;master分支的提交则会触发deploy_production(如果开启手动触发,需要在GitLab界面确认后执行)。
2. 必要的环境隔离配置
除了CI文件的分支绑定,你还需要确保Kubernetes和GitLab层面的环境隔离:
- Kubernetes命名空间隔离:必须为Staging和Production创建独立的K8s命名空间(比如
staging和production),避免两个环境的资源(Pod、Service等)互相干扰。 - GitLab CI变量区分:如果两个环境需要不同的配置参数(比如数据库地址、API密钥),在GitLab项目的
Settings > CI/CD > Variables中,为每个环境设置专属变量(比如STAGING_DB_URL和PROD_DB_URL),或者利用GitLab的环境变量功能,为每个Job的environment字段关联对应的变量组。 - Runner权限验证:确保GitLab Runner使用的Kubernetes服务账号,对
staging和production两个命名空间都拥有足够的权限(比如deploy、edit等权限),避免部署时出现权限不足的错误。
3. 可选的最佳实践
为了提升生产环境的部署安全性和可追溯性,建议添加以下配置:
- 为生产环境部署Job添加手动触发(
when: manual),避免代码提交后自动部署到生产。 - 在部署前添加前置检查Job(比如代码静态扫描、单元测试、集成测试),只有通过所有检查的提交才能进入部署阶段。
- 使用GitLab的Environments功能,在GitLab界面可以直观查看每个环境的部署历史、状态,甚至一键回滚到之前的版本。
总结来说,仅设置only: master是实现生产环境部署的基础,但配合环境隔离和最佳实践配置,才能保证两个环境的独立、稳定运行——不需要在GitLab中做额外的复杂全局配置,只需要完善CI文件和必要的环境设置即可。
内容的提问来源于stack exchange,提问作者Anshul Tripathi




