GitOps落地指南
通过GitOps的设计与落地,来满足云原生环境下业务的持续交付,建立标准的开发、 测试、生产环境, 形成统一的规范,完善自动化,为业务快速交付赋能。
整体架构
![运维架构概览](/assets/%E8%BF%90%E7%BB%B4%E6%9E%B6%E6%9E%84%E6%A6%82%E8%A7%88-DH2D1kaB.jpg)
整理流程
![workflow](/assets/git-workflow-BJ5l3x4F.png)
基础环境
IDC机房
AMD服务器
ARM服务器 (资源采购&预算)
存储服务
域名
证书
Kubernetes
运行环境支持AMD和ARMv8
![kubernetes部署架构](/assets/kubernetes%E9%83%A8%E7%BD%B2%E6%9E%B6%E6%9E%84-CJn6paAF.jpg)
原则: 集群隔离。一个环境一个集群,互不干扰。
目前已有四套集群,提供给研发、测试、生产以及Hotfix、poc使用。
预估信创适配需3-4套ARM集群环境。
后续共需管理7-8个集群环境
运维管理
代码仓库
通过流程管理,进行仓库的开通或变更,以产品组进行划分和管理,建立起唯一授信源,为后续Pipeline设计做好基础建设
![代码仓库](/assets/%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93-DHwehiWF.png)
GitOps
原则: 采用一切皆代码的原则,进行基础服务和业务项目的维护管理。
流程设计
从代码提交到项目上线全流程
![研发Git 管理流程](/assets/git%E7%A0%94%E5%8F%91%E6%B5%81%E7%A8%8B-DNCTjuAf.png)
仓库规划
运维工程项目
![运维工程项目](/assets/%E8%BF%90%E7%BB%B4%E5%B7%A5%E7%A8%8B%E9%A1%B9%E7%9B%AE-BCGVGA_P.png)
cicd : 用来做产品的的打包和部署管理, 产线内gitlab-ci直接引用即可,做到研发和运维代码管理上的解耦
gitlab-ci.yaml文件
gitlab规定的固定命名文件,用来触发git pipeline,其内容编写遵循gitlab的编排语法,作用类似jenkinsfilegitops: 用来做运维管理,如基础设施、中间件等
misc:试验性的临时功能。未集成到标准编排中的尝试性功能,均在此处编排和管理
playbook:Ansible剧本编排服务,目前提供基于rke工具拉起Kubernetes集群功能 (未支持arm)
template: git pipeline 通用模板文件,现已弃用,迁移至cicd中
utils: 运维工具、程序管理,如mysql备份任务,kubernetes调试工具等
工程目录详解
![运维项目-目录结构](/assets/%E8%BF%90%E7%BB%B4%E9%A1%B9%E7%9B%AE-%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84-Cjm1atOU.png)
gitlab-ci: 项目的持续集成管理 (ARM环境的制品产出,主要是在这里作适配)
gitlab-runner:ci任务的执行者,负责 ci 编排文件的处理和脚本的执行
template: CI编排文件
job: 提供通用基础服务,如gradle、maven、golang 、artifacts等pipeline节点服务
projects: 按产线进行归类,按服务进行单独的编排管理,针对不同的服务,可在此进行模板的引用和特性的扩展
CI
制品构建的所有操作均在此处调整
如新增(XC_TONG_WEB_ENABLED)以区分东方通 jar依赖等,通过逻辑判断和处理,产出不同的制品。
![gradle](/assets/CI-gradle-atkD16Dq.png)
如何产出多环境下的制品?
- 使用不同环境的runner
CD
通过ArgoCD 实现多环境的管理与发布
- argocd是基于kubernetes的声明式的CD工具
![image](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/G1wvqrWM40xpOako/img/8f4c5f68-2a01-48cb-bdc5-5a34e38ca4f5.png)
通过argo应用的创建和声明,来监控编排文件的变化,从而实现产品的CD操作
![argo编排](/assets/b998489c-2ed2-4cd9-93a0-544469f2d041-DUF3p_1y.png)
Argo 下产品应用服务编排 (ARM的部署,在这里作适配)
命名的区分
运行环境指定
- 可区分不同的环境发布到不同的集群内,达到多环境的隔离
编排文件指定
可以指定应用的编排文件,后续在编排中通过申请的通配域名,即可实现多环境的访问切换,如
![argocd](/assets/98469e4b-3b70-4911-b156-9c4b2f83a4be-C93lDyDR.png)
编排文件对应的就是ArgoCD声明的仓库路径,从而实现了域名和环境的区分,产品的发布只需要修改这里即可,这样后续在pipeline中就可以实现自动化
![argocd](/assets/fd9cadd0-6413-4e3d-9a90-d5732d14d5b8-CTF0OKls.png)
运维仓库
![git repo](/assets/c5464b5a-f7f8-4637-9b79-dc857c10da7c-CThAJh5D.png)
common: 公共服务管理,比如SQL审计平台 bytebase,研发文档服务docs 等
infra: 基础设施服务,和kubernetes集群相关,如SLB (metallb),存储服务等
middleware: 中间件服务,产品依赖中间件的编排均在此维护
xxx-charts (项目外单独维护)
- 按产线归类,所有的产品运行编排服务均在此仓库进行维护和管理
- **xxx-apps (项目外单独维护)**
- 产品运行环境归类,基于业务编排模板,进行差异化修改和管理,之后可由Argo-cd发布到对应的集群环境中
charts和app介绍
![charts和app](/assets/5d5707b1-f6b9-4d09-955e-49abf00189b3-BRmxe6yn.png)
如图
apps中的服务按环境进行区分管理,通过差异化配置供ArgoCD使用,从而发布到不同环境。其核心编排均来自服务编排模板,优势在于
避免多环境操作同一个文件,管理混乱
避免多环境同时发布,同文件的冲突
工程文件和基础环境保持了一致
文件改动少,便于自动化
其他目录
和cicd关系不大,暂不详细介绍
镜像管理
通过harbor管理所有的编排文件和制品镜像 (Harbor需升级用来支持ARM制品的保存)
版本上报
![版本上报](/assets/ff0ff3f8-469b-4244-a9ab-3ce5f9d2588d-BITTWEAk.png)
制品上传
![image](/assets/33672f3e-85e7-4ece-8729-2bd296367e02-CbsFMsR6.png)
规则:
1. jkstack/<产品>/服务名:版本 (jkstack-charts也在此项目中)
2. middleware/[registry]/服务名:版本
3. infra/[分类]/服务名:版本
![制品上传](/assets/97297a65-9e17-46e9-8a8a-b4a07167b0a0-D9ELRu47.png)
![制品上传](/assets/d5c191a2-9a87-4a9f-9b5e-5aae0b4085f0-BMkdZxZr.png)
![制品上传](/assets/4d6dbe80-dcd9-425e-a1be-0610e99bed50-kN2CoNFc.png)
流水线
具备以上条件后后,通过git pipeline 即可将产品的CICD串联起来,实现了多环境的发版控制
![流水线](/assets/246a9de5-c431-4d2e-bf76-61c46d387888-DcTaRLgD.png)
![流水线](/assets/d0e81148-fc5f-43d7-9040-b8a28ab1351a-BBmVjSo2.png)
![流水线](/assets/720b2764-e541-4877-ac29-8190205747f0-Ffd_3gqj.png)
![流水线](/assets/a2810f85-b574-4fdb-9704-8f1c9d608ac8-CTTKTqGh.png)
自动化
版本管理平台
离线交付-部署客户端
Kubernetes集群部署