随着云原生持续升温,CI/CD成为了人们讨论的焦点,GitOps就是云原生的一种持续交付模式,它将应用系统的声明性基础架构和应用程序存放在Git的版本控制库中。
实现GitOps的工具有很多,Tekton和Argo CD就是后起之秀的代表。
一、Tekton
Tekton是一个强大而灵活的开源框架,用于创建CI/CD系统,通过Operator的方式集成到k8s集群中,并以容器作为驱动,完成流水线模版定义的任务,社区也提供了很多任务模版来方便使用。
Tekton 为 CI/CD 系统提供了诸多好处(主要用于CI):
- 可定制:Tekton 是完全可定制的,具有高度的灵活性,我们可以定义非常详细的构建块目录,供开发人员在各种场景中使用。
- 可重复使用:Tekton 是完全可移植的,任何人都可以使用给定的流水线并重用其构建块,可以使得开发人员无需"造轮子"就可以快速构建复杂的流水线。
- 可扩展:Tekton Catalog 是社区驱动的 Tekton 构建块存储库,我们可以使用 Tekton Catalog 中定义的组件快速创建新的流水线并扩展现有管道。
- 标准化:Tekton 在你的 Kubernetes 集群上作为扩展安装和运行,并使用完善的 Kubernetes 资源模型,Tekton 工作负载在 Kubernetes Pod 内执行。
- 伸缩性:要增加工作负载容量,只需添加新的节点到集群即可,Tekton 可随集群扩展,无需重新定义资源分配或对管道进行任何其他修改。
Tekton为Kubernetes提供了多种CRD资源对象,可用于定义我们的流水线,主要有以下几个:Task、TaksRun、Pipeline、PipelineRun和PipelineResource。
- Task:Task 为构建任务,是 Tekton 中不可分割的最小单位,正如同 Pod 在 Kubernetes 中的概念一样。在 Task 中,可以有多个 Step,每个 Step 由一个 Container 来执行。
- TaskRun:PipelineRun 被创建出来后,会对应 Pipeline 里面的 Task 创建各自的 TaskRun。一个 TaskRun 控制一个 Pod,Task 中的 Step 对应 Pod 中的 Container。当然,TaskRun 也可以单独被创建。
- Pipeline:Pipeline 由一个或多个 Task 组成。在 Pipeline 中,用户可以定义这些 Task 的执行顺序以及依赖关系来组成 DAG(有向无环图)。
- PipelineRun:PipelineRun 是 Pipeline 的实际执行产物,当用户定义好 Pipeline 后,可以通过创建 PipelineRun 的方式来执行流水线,并生成一条流水线记录。
- PipelineResource:表示Pipeline输入资源,比如GitHub上的源码,或者Pipeline速输出资源,例如一个容器镜像或者构建生成的jar包等。
二、Argo CD
Argo CD 从名字就能看出(有个 CD),它侧重于持续部署这一块儿,因而CD部分使用Argo CD来完成。
Argo CD是用于Kubernetes的声明性GitOps持续交付工具,可以在指定的目标环境中自动部署所需的应用程序状态,应用程序部署可以在Git提交时跟踪对分支,标签的更新或固定到清单的特定版本。
Argo CD的主要功能
- 可搭配使用各种配置管理工具(如 ksonnet/jsonnet、Helm 和 kustomize)使应用程序与 Git 中定义的保持一致;
- 将应用程序自动部署到指定的目标环境;
- 持续监控已部署的应用程序;
- 基于 Web 和 CLI 的操作,以及应用程序可视化;
- 部署或回滚到 Git 仓库中提交的应用程序的任何状态(这也是使用 Git 进行版本管理的一大好处);
- PreSync、Sync、PostSync hooks 以支持复杂的应用程序部署策略(例如:blue/green 、canary upgrades);
- SSO 集成(OIDC、LDAP、SAML 2.0、GitLab、Microsoft、LinkedIn),这些是企业比较需要的功能;
- Webhook 集成(GitHub、BitBucket、GitLab)。
- 可以独立使用,也可以作为现有 Pipeline 的一部分使用,例如与 Argo Workflow、Jenkins 以及 GitLab CI 等配合使用;
Aego CD中的几个主要组件:
- API服务:API服务是一个gRPC/REST服务,它暴露了Web暴露了 Web UI、CLI 和 CI/CD 系统使用的接口。
- 仓库服务:存储仓库服务是一个内部服务,负责维护保存应用程序清单Git仓库的本地缓存。
- 应用控制器:应用控制器是一个Kuberntes控制器,他持续watch正在运行的应用程序并将当前的实时状态与所期望的目标状态进行比较。
三、总结
目前,很多敏捷和DevOps实践已经被广泛应用,一条条CI/CD流水线已经被建立起来,我们已经也有很好的工具来实现CI/CD,那么下一步就是基于这些工具,我们是否能很好地实践应用。