教你本地k8s集群搭建云原生 Tekton CICD 流水线

Tekton CICD Demo这是一个演示 Tekton CICD 的 demo 。下面我们将从搭建本地 k8s 集群开始,同步镜像至国内并部署 Tekton,一步一步实现一个 CICD 流水线 。实现更新代码自动触发流水线,构建镜像推送到目标仓库,并更新 deployment 镜像滚动更新应用,最后钉钉机器人通知到群聊 。
源码:https://github.com/win5do/tekton-cicd-demo
[TOC]
前言我心目中理想的CICD工具应该包含以下特性:

  • 声明式配置,新增配置不需要在UI上操作,便于迁移,可使用git版本控制
  • 配置与项目代码解耦,统一集中管理
  • 灵活易扩展
Gitlab 和 Github 的 CICD 都是在当前 repo 中存放配置,对于开源项目一般就一个 repo 倒也没什么,但是在公司内部往往有很多服务很多 repo,配置散落在各个 repo 中,不方便统筹管理 。
Jenkins 虽然可以将 Jenkinsfile 脚本集中管理,但针对每个项目还需要在 UI 上配置 。Jenkins 也有相关插件 configuration-as-code-plugin,没用过就不评价了 。
而 Tekton 所有配置都是以 k8s 诗 Yaml 文件形式存在,即使换了一个集群,只需要应用 Yaml 配置即可无缝迁移 。
执行步骤阅读须知
  • 完成以下步骤需要 k8s 基础使用能力
  • k8s server version >= v1.15
  • 以下命令中 alias kc=kubectl
  • Tekton 的一些概念和资源在此不再赘述,请查阅官方文档:https://tekton.dev/docs/pipelines/
  • 以下步骤在 macOS 10.15 上测试通过,一些命令在 windows 上可能没有 。
  • registry.cn-huhehaote.aliyuncs.com/feng-566/ 旗下镜像均可公开访问,但是推送镜像需要认证 。所以需要一个镜像仓库用于推送制品镜像,推荐阿里云镜像仓库注册账号即可免费使用 。
  • 接收 github webhook 需要一个拥有公网 IP 的服务器 。如果没有,可使用 pull 模式替代 。
  • 出现问题请先查看 问题排查
创建 kind 本地集群使用 kind 创建测试集群 。如果你已有 k8s 集群可跳过此步 。
cat <<EOF >kind-config.yamlkind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:- role: control-plane- role: workerEOFkind create cluster --config ./kind-config.yaml复制代码安装 Tekton同步镜像由于 Tekton 镜像都是在 gcr.io 上,需要 VPN 才能拉取,所以第一步需要将镜像同步至国内 。这里我写了脚本(./script/sync.go)将镜像都同步至阿里云镜像仓库,并设为公开访问,如无必要可跳过此步 。
make sync复制代码部署 Tekton部署 pipeline、trigger、dashboard 三个组件 。
kc Apply -f ./src/sync/dst复制代码check:
kc get po复制代码部署 demo app测试 demo,用于后面流水线滚动更新 。
kc apply -f ./demo/go-echo/deploy/deploy.yaml复制代码配置 pipeline创建 Task 和 Pipeline 资源,每个 Task 为一个独立任务,Pipeline 则是将多个 Task 串成流水线 。
更多 Task 例子可以在官方仓库找到:https://github.com/tektoncd/catalog
配置 github 和 镜像仓库 access token./manifests/pipeline/sercret.yaml 配置 github 和 Docker registry 。
将其中url,username,password 修改为你自己的 access token 。
配置目标集群 kubeconfig./manifests/resource/cluster-kind.yaml 配置部署时 kubectl 使用的配置* 。
将其修改为你本地 kind 集群的 kubeconfig 。
配置机器人通知./manifests/pipeline/notify.yaml 配置执行成功后聊天机器人通知地址,可接入钉钉或企业微信 。
钉钉机器人文档:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
大家可自行创建团队测试机器人,不需要真实企业认证 。
成功后钉钉会收到机器人通知:
教你本地k8s集群搭建云原生 Tekton CICD 流水线

文章插图
 
应用 pipeline 配置kc apply -f ./manifests/pipelinekc apply -f ./manifests/resource复制代码test pipeline run手动执行 PipelineRun,测试 pipeline 流程 。
kc apply -f ./manifests/test/pipeline-run-demo.yaml复制代码check:
kc get pr复制代码Tekton dashboard通过 dashboard 我们可以查看流水线执行状态 。由于 kind 网络隔离的原因,此处我们使用 kc port-forward 将端口暴露出来 。
【教你本地k8s集群搭建云原生 Tekton CICD 流水线】kc port-forward svc/tekton-dashboard 9097# new terminal session# 打开浏览器open http://localhost:9097/#/namespaces/tekton-pipelines/pipelineruns复制代码流水线执行成功实例:
教你本地k8s集群搭建云原生 Tekton CICD 流水线

文章插图
 
[Option 1: push 模式] 配置 Tekton triggers前面的步骤中,我们用手动的方式执行了 pipeline,下面我们配置 Tekton triggers,通过 webhok 的方式自动执行 。


推荐阅读