云原生Tekton 结合 ArgoCD 实现 GitOps

Tekton 是什么
Tekton是一种适用于创建持续集成和持续部署/交付(CI/CD)系统的谷歌开源的Kubernetes原生框架,它支持多云/多集群下进行搭建、测试和部署,可实现滚动部署、蓝/绿部署、金丝雀部署或 GitOps 工作流等高级部署
为什么选择Tekton
  • 可定制:Tekton 是完全可定制的,具有高度的灵活性,我们可以定义非常详细的构建块目录,供开发人员在各种场景中使用。
  • 可重复使用:Tekton 是完全可移植的,任何人都可以使用给定的流水线并重用其构建块,可以使得开发人员无需"造轮子"就可以快速构建复杂的流水线。
  • 可扩展Tekton Catalog 是社区驱动的 Tekton 构建块存储库,我们可以使用 Tekton Catalog 中定义的组件快速创建新的流水线并扩展现有管道。
  • 标准化:Tekton 在你的 Kubernetes 集群上作为扩展安装和运行,并使用完善的 Kubernetes 资源模型,Tekton 工作负载在 Kubernetes Pod 内执行。
  • 伸缩性:要增加工作负载容量,只需添加新的节点到集群即可,Tekton 可随集群扩展,无需重新定义资源分配或对管道进行任何其他修改
Tekton 组件
  • Tekton Pipelines 是 Tekton 的基础,它定义了一组 Kubernetes CRD 作为构建块,我们可以使用这些对象来组装 CI/CD 流水线

  • Tekton Triggers 允许我们根据事件来实例化流水线,例如,可以我们在每次将 PR 合并到 GitHub 仓库的时候触发流水线实例和构建工作

  • Tekton DashboardTekton Pipelines 的基于 Web 的一个图形界面,可以线上有关流水线执行的相关信息

  • Tekton Operator 是一个 Kubernetes Operator,可以让我们在 Kubernetes 集群上安装、更新、删除 Tekton 项目

Tekton 概念

Tekton 为 Kubernetes 提供了多种 CRD 资源对象,可用于定义我们的流水线。

tekton 对象

运行

主要有以下几个资源对象:

Task:表示执行命令的一系列有序的步骤,task 里可以定义一系列的 steps,例如编译代码、构建镜像、推送镜像等,每个 task 实际由一个 Pod 执行。

Pipeline:一组有序的 Task,Pipeline 中的 Task 可以使用之前执行过的 Task 的输出作为它的输入。表示一个或多个 Task、PipelineResource 以及各种定义参数的集合。

TaskRun:Task 只是定义了一个模版,TaskRun 才真正代表了一次实际的运行,当然你也可以自己手动创建一个 TaskRun,TaskRun 创建出来之后,就会自动触发 Task 描述的构建任务。

PipelineRun:类似 Task 和 TaskRun 的关系,PipelineRun 也表示某一次实际运行的 pipeline,下发一个 PipelineRun CRD 实例到 Kubernetes 后,同样也会触发一次 pipeline 的构建。

ClusterTask:覆盖整个集群的任务,而不是单一的某一个命名空间,这是和 Task 最大的区别,其他基本上一致的。

PipelineResource:表示 pipeline 输入资源,比如 github 上的源码,或者 pipeline 输出资源,例如一个容器镜像或者构建生成的 jar 包等

Argo CD 是什么
ArgoCD架构

Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署工具。Argo CD 可在 Git 存储库更改时自动同步和部署应用程序

Argo CD 是通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 OutOfSync 状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去

Argo CD 功能
  • 自动部署应用程序到指定的目标环境

  • 支持多种配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)

  • 能够管理和部署到多个集群

  • 回滚/随时回滚到 Git 存储库中提交的任何应用配置

  • 应用资源的健康状况分析

  • 自动配置检测和可视化自动或手动将应用程序同步到所需状态

  • 提供应用程序活动实时视图的 Web UI

开发人员如何使用GitOps
  1. 编写 Dockerfile
  2. 编写 资源配置清单 GitOps.yaml
  3. 提交代码
### 前端项目 dockerfile 
FROM harbor.xxxx.com/library/node:14.19.0-alpine as build  # 基础镜像 as 为第一阶段构建镜像取别名
WORKDIR /opt/front # 工作目录
COPY  . /opt/front # 将项目目录下所有文件拷贝到工作目录中
RUN npm config set registry https://mirrors.huaweicloud.com/repository/npm/
RUN npm install
RUN npm run build
FROM harbor.xxxx.com/library/nginx:banan # 项目启动依赖镜像
COPY --from=build /opt/front/default.conf /etc/nginx/conf.d #将上阶段文件拷贝到当前镜像中
COPY --from=build /opt/front/build /usr/share/nginx/html
EXPOSE 80   # 声明容器使用的端口
CMD ["nginx", "-g", "daemon off;"]  # 容器启动命令

### 后端项目  dockerfile
FROM harbor.xxxx.com/library/maven:3.6.5-java as build
WORKDIR /opt/backend
COPY  . /opt/backend
RUN mvn -U clean package -Dmaven.test.skip=true
FROM harbor.xxxx.com/library/openjdk:jdk-8
WORKDIR /opt/backend
COPY --from=build /opt/backend/fuling-covi-19-vaccination-web/target/fuling-covi-19-vaccination-web.jar  /opt/backend
EXPOSE 7120
CMD java -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -Xloggc:./log/gclogs  -jar fuling-covi-19-vaccination-web.jar --server.port=7120
###  资源配置清单 GitOps.yaml
###  所有变更都是基于键值形式 
appname: fuling-covi-19-vaccination  # k8s 启动 pod的名称
namespace: tekton-test   # 所部署到的名称空间
service:
  type: ClusterIP        # svc 类型
  port: 7120             # 服务启动的端口
labels:
  app:  fuling-covi-19-vaccination        # deployment service 等资源的标签  定义时需注意 同一名称空间下每个pod应该有独立的标签
ingress:
  hosts: fuling.k8s.cn   # 访问服务所使用的域名

最后用一张图来总结下我们使用 Tekton 结合 Argo CD 来实现 GitOps 的工作流:

tekton+argocd