1 如何实施GitOps
我们正真实施 GitOps 的具体流程如下:
- 遵循 GitOps 的标准流程,将代码仓库和配置仓库相分离
- 基于 OAM 框架模型,DevOps 团队需要将任何上线的变更都需要通过声明式 API 来实现
- 选择合理的工具集
- 从变更频率高或易于中断的应用程序开始
1.1 GitOps工具集
除了 Kubernetes 集群外,GitOps 的实施通常还要依赖于如下工具
- Git 和 Git Server:显然,这是实施 GitOps 的基础和中心;GitHub、GitLab 或任何形式的支持自动化 Pipeline 必要功能的 Git Server 均可;
-
CI Server:CI Pipeline 的基础设施,如 Jenkins 和 Tekton 等;
-
Agent Operator(Deploy Operator):CD Pipeline 的基础组件
- GitOps 中,可用的解决方案包括 ArgoCD、Flux、Jenkins X、WKSctl 和 Gitkube 等;
- Canary Deployer
- flux 提供的名为 Flagger 的 Kubernetes Operator 支持金丝雀发布
- 它能够结合 Istio、Linkerd、App Mesh、NGINX、Skipper、Contour、Gloo 或 Traefik 等自动实施流量路由和流量迁移,以及根据 Prometheus 实现Canary 分析
1.2 什么是 GitOps
什么是 GitOps?
- 一套使用 Git 来管理基础架构和应用配置的实践,一项事关部署流程的技术风格
-
在运行过程中以 Git 为声明性基础架构和应用的单一事实来源
-
使用 Git 拉取请求来自动管理基础架构的置备和部署
-
Git 存储库包含系统的全部状态,因此系统状态的修改痕迹既可查看也可审计
-
与 DevOps 相比,GitOps 更侧重于基于工具和框架的实践,其实可以将他更好的理解为建立在 CI/CD 上的一种抽象
-
简单来说:GitOps = IaC + MRs + CI/CD
- MRs:Merge Requests
如何开始使用 GitOps ?
- 存在支持声明式管理的基础架构
- 天然适配 Kubernetes 和云原生开发的运维模式
- 原生支持基于 Kubernetes 的持续部署
- 用于构建开发流程、对应用进行编码、管理配置、置备 Kubernetes 集群以及在 Kubernetes 或容器注册中心进行部署
2 GitOps 具体示例
在下面示例中分别是 FluxCD 和 Argo CD、Tekton and ArgoCD ,但是他们都遵循了 GitOps 的范式标准
2.1 GitOps示例一:FluxCD
2.1.1 Flagger
Flagger 是 Flux CD 中的一个组件其支持功能如下:
支持 Canary releases(金丝雀发布)、A/B testing(A/B 测试)、Blue/Green mirroring(蓝绿部署)等部署策略,它依赖于 Service Mesh
或 Ingress Controller
实现流量策略
支持基于 Prometheus、Datadog
等进行发布分析,以及基于 Slack
等进行告警
2.2 GitOps示例二:ArgoCD
ArgoCD:专用于Kubernetes的声明式GitOps CD工具
2.3 GitOps示例三:Tekton and ArgoCD
此类示例才是我们应该使用的:
适用于无服务器的现代 CI/CD 工作流使用
- Tektoon:CI 流水线(用于交付)
- Argo CD : CD 流水线(用于部署)
openshift 上是如何实现现代化的云原生 GitOps 构建
如上图:
- 首先 Tekton 定义 knative 流水线,然后步骤是:
- 开发人员推送代码至代码仓库
- 通过 webhook 提交事件然后被 Tekton 所接收并触发对应的流水线
- 然后执行 build 并做单元测试
- 执行镜像构建,并推送到镜像仓库
- 随后向我们的配置仓库进行一个 pull 操作,并取到对应的配置内容
- 然后更具获取到的配置内容来测试部署我们的应用程序(这一步并不是真正的部署,而是变更推送能适配到刚才提交的新镜像的配置信息而已)
- 然后将测试部署的配置再次推送到配置仓库中,并通知 Argo CD
- 接着 Argo CD 执行 CD 流水线
- Argo CD 通过事件看到了 Tekton 的变更,就会将提交的新的配置文件拉取至 argo CD 本地
- 然后再由 Argo CD 按照对应的分支,更具不同分支并判别这次的部署操作。(如果是来之 dev 分支,那么就会将应用部署至 dev 环境中。如果是来自其他分支那么就会部署到其他环境中)
- 如果再测试分支上部署并运行没有问题,就会合并代码并部署至生产环境中