您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

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

时间:2020-11-13 09:48:30  来源:  作者:

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.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
EOF

kind 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/pipeline
kc 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 将端口暴露出来。

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 的方式自动执行。

Tekton trigger 组件是用来接收 webhook,做一些 校验,过滤,参数绑定等前处理,然后帮你自动创建 PipelineRun 等资源执行流水线。

kc apply -f ./manifests/triggers
复制代码

config webhook in github repo

接收 webhook 需要一个拥有公网 ip 的服务器,首先在 github repo 中配置 webhook。

webhook 地址为 http://<your-remote-host>:9080/tekton-el,勾选 Pull requests,Pushs events,token 为 ./manifests/triggers/webhook-token.yaml中的值。

webhook 配置参考文档: docs.github.com/en/free-pro…

webhook playload 数据结构: docs.github.com/en/free-pro…

利用 ssh 将 webhook 转发到本地

将 kind 中 eventLister 端口暴露出来:

kc port-forward svc/el-demo-listener 9080:8080
复制代码

服务端监听 0.0.0.0 需要 sshd 配置中包含 GatewayPorts clientspecified,详见: serverfault.com/questions/8…

将服务器 9080 端口转发到本地 9080 端口:

ssh -N -R 0.0.0.0:9080:localhost:9080 <user>@<your-remote-host> -p 22
复制代码

check port connected:

nc -v <your-remote-host> 9080
复制代码

debug webhook

部署成功后参考 测试 CICD 中步骤进行测试。

可通过查看 eventLister 日志进行 debug:

kc logs -l eventlistener=demo-listener
复制代码

./manifests/triggers/print.yaml print task 将 webhook head 及 body 打印出来。

[Option 2: pull 模式] 配置 CronJob

Tekton 官方并没有提供类似 Jenkins 那种轮询 pull 检测 git repo,有新的 commit 则触发构建。理由是 pull 模式会对 git 造成较大压力。

但借助 k8s CronJob,自己实现 pull 模式。./src/pull 我实现了一个简单的 pull 程序,定期检查对应仓库和分支有没有新的 commit,自动创建 PipelineRun。

./src/pull/deploy/configmap.yaml 为 PipelineRun 模板,修改 params 部分目标 IMAGE,NAME 等参数。

./src/pull/deploy/cronJob.yaml 为 Pull 脚本定时任务, 修改 args 部分需监听的 repo,branch 等参数。

应用:

kc apply -f ./src/pull/deploy
复制代码

部署成功后参考 测试 CICD 中步骤进行测试。

测试 CICD

提交 commit 进行测试:

git commit -a -m "build commit" --allow-empty && git push
复制代码

后记

问题排查

build-image 卡主

build-image 使用 kaniko,不依赖 docker daemon,所以 Dockerfile 中如果使用 golang:1.14 等体积很大的 dockerhub 镜像,因网络问题下载很慢甚至失败,会导致 build 超时,最好将镜像同步至内网。

git clone auth err

检查 secret git-auth 是否配置正确。

push image auth err

检查 secret docker-auth 是否配置正确。pipeline 中推送镜像地址是否改为你个人镜像仓库地址。

run on openshift

部分任务配置了 securityContext.runAsUser: 0,在 openshift 运行需要配置 scc=anyuid。 参考: docs.openshift.com/container-p…

TODO

  • pipeline 中途失败无法发送机器人通知


作者:win5do
链接:https://juejin.im/post/6893701305173442567
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



Tags:k8s   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景:目前prometheus 给pod的内存告警阀值设置的85%,由于JVM 设置最高申请内存为pod limit 的75%,通过arthas-boot查看到堆内存和元空间占用内存之和跟prometheus告警值不同。...【详细内容】
2021-09-16  Tags: k8s  点击:(104)  评论:(0)  加入收藏
近期由于工作原因,在项目支持的过程中,进行了一次K8S的基础环境部署,云平台一直是公司的重要底座,而我由于一系列原因,一直没有亲自尝试,通过本次的机会,让我重新做了一遍,也找到了...【详细内容】
2021-09-09  Tags: k8s  点击:(90)  评论:(0)  加入收藏
概述谷歌云使用先进的 Andromeda 网络来实现 VPC 内实例之间的相互访问,以及 Google Kubernetes Engine (GKE) 的 Pod 的跨节点互访,避免了配置静态路由或者 Overlay 网络带来...【详细内容】
2021-08-20  Tags: k8s  点击:(103)  评论:(0)  加入收藏
1.创建yaml模板 kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml 2.修改模板 vim web.yamlapiVersion: apps/v1kind: Deploymentmetadata:label...【详细内容】
2021-07-20  Tags: k8s  点击:(160)  评论:(0)  加入收藏
Jenkins 是目前最常用的持续集成工具,拥有近50%的市场份额,他还是很多技术团队的第一个使用的自动化工具。由此可见他的重要性!这份Jenkins宝典从入门介绍到结合Docker+SpringC...【详细内容】
2021-06-09  Tags: k8s  点击:(145)  评论:(0)  加入收藏
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署:# 创建一个 Master 节点$ kubeadm init # 将一...【详细内容】
2021-04-29  Tags: k8s  点击:(276)  评论:(0)  加入收藏
K8S 网络设计与实现是在学习 K8S 网络过程中总结的内容。本文按照 K8S 网络设计原则、Pod 内部网络、Pod 之间网络等几个步骤讲解 K8S 复杂的网络架构。 图片出自:《你女儿也...【详细内容】
2021-04-01  Tags: k8s  点击:(266)  评论:(0)  加入收藏
记录在 ubuntu-20.04.2-live-server系统上通过rancher安装k8s的过程。0. 更换阿里云软件源为了保障下载速度,将ubuntu软件源替换为阿里云软件源。如果网络通畅,可跳过。0.1....【详细内容】
2021-03-26  Tags: k8s  点击:(324)  评论:(0)  加入收藏
1.创建一个简单的应用程序在安装好Docker后,现在让我们来创建一个简单的应用程序。我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返...【详细内容】
2021-03-10  Tags: k8s  点击:(219)  评论:(0)  加入收藏
一、日志收集的需求背景:&bull; 业务发展越来越庞大,服务器越来越多​ &bull; 各种访问日志、应用日志、错误日志量越来越多​ &bull; 开发人员排查问题,需要到服务器上查日志,...【详细内容】
2021-03-05  Tags: k8s  点击:(189)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条