云原生强大且灵活的持续集成CI开源框架Tekton实战-上
@
概述
定义
Tekton 官网地址 https://tekton.dev/
Tekton 最新官网文档 https://tekton.dev/docs/
Tekton GitHub源码地址 https://github.com/tektoncd
Tekton是一个强大、灵活的构建 CI/CD 流水线系统的开源框架,允许开发者构建、测试和发布应用。Tekton 是云原生的,通过定义 CRD ,让用户快速灵活定义流水线;
Tekton是构建CI/CD系统的本地云解决方案。它由提供构建块的Tekton pipeline和支持组件组成,如Tekton CLI和Tekton Catalog,使Tekton成为一个完整的生态系统;Tekton也是CD基金会(一个Linux基金会项目)的一部分;以yaml文件编排应用构建及部署流程,是一个纯云原生的标准化CICD流水线构建、测试和部署流程的工具。
常见CICD工具
使用好处
- 可定制的:Tekton实体是完全可定制的,从而具有高度的灵活性。平台工程师可以定义非常详细的构建基目录,以供开发人员在各种情况下使用。
- 可重复使用的:Tekton实体是完全可移植的,因此一旦定义,组织内的任何人都可以使用给定的管道并重用其构造块。这使开发人员可以快速构建复杂的管道,而无需“重新发明轮子”。
- 可扩展的:Tekton Catalog是Tekton社区驱动的存储库。您可以使用Tekton目录中的预制组件快速创建新的并展开现有管道。
- 标准化:Tekton在您的Kubernetes集群上作为扩展安装并运行,并使用完善的Kubernetes资源模型。 Tekton工作负载在Kubernetes容器中执行。
- 缩放性:为了增加工作负载容量,您可以简单地将节点添加到群集。 Tekton与您的群集进行缩放,无需重新定义您的资源分配或对管道的任何其他修改。
组件
- Tekton Pipelines:tekton 的基础,定义了一组 CRD,用于定义 pipeline
- Tekton Triggers:允许基于 event 实例化 pipeline。比如:git的pr请求
- Tekton Cli:提供命令行工具和 tekton 交互
- Tekton Dashboard:图形化界面展示 pipeline 信息
- Tekton Catalog:高质量的、社区贡献的 pipeline 仓库
- Tekton Hub:图形化界面访问 tekton catalog
- Tekton Operator:在k8s上安装、移除、更新tekton组件的项目
基本概念
Tekton引入了任务的概念,它指定了你想要运行的工作负载;Tekton 最重要的五个概念:Task、TaskRun、Pipeline、PipelineRun、PipelineResources:
- Task:Tekton中的最小单元,代表一个任务模板,包括多个步骤。每一个操作定义为Task中的一个step
- Pipeline:多个 Task 组成的有向无环图,定义了流水线的模板
- PipelineRun:Pipeline 真正执行时需要定义一个PipelineRun,作为流水线的实例,生成一条流水线记录
- TaskRun:Task 真正执行的实例,记录任务状态。一个TaskRun 会创建一个对应的 Pod,每个 step 对应 pod 中的一个 container
- PipelineResource:流水线执行过程中需要的资源信息
每个任务在它自己的Kubernetes Pod中执行。因此,默认情况下,Pipeline中的任务不共享数据。要在任务之间共享数据,必须显式地配置每个任务,使其输出可用于下一个任务,并将先前执行的任务的输出作为其输入。
安装
前提条件
安装kubectl
安装K8S集群
- minikube部署用于开发测试的K8S集群。
# 先要安装docker,然后安装kubectl
wget "https://storage.googleapis.com/kubernetes-release/release/v1.18.8/bin/linux/amd64/kubectl"
chmod 777 kubectl
mv kubectl /usr/local/bin
# 安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
install minikube-linux-amd64 /usr/local/bin/minikube
minikube start
# 创建新用户,这步不是必要
adduser K8S //创建K8S用户
passwd K8S //设置密码asdfwsxedc
# 将创建的新用户加入到docker组中,,这步不是必要
groupadd mydocker
gpasswd -a K8S mydocker //$USER为上面创建的K8S用户
newgrp mydocker
docker version
# 启动minikube
minikube start
# 卸载minikube
minikube delete
#也可以使用--registry-mirror=https://registry.docker-cn.com, running minikube within a VM, consider using --driver=none,--image-mirror-country='cn'
minikube start --force --driver=docker
- Kubekey部署单节点K8S集群,详细可以参考前面的文章《云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上》
安装Tekton Pipelines
- 官方部署方式
# 使用kubectl安装最新版本的Tekton pipeline
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
- 修改镜像地址方式
# 创建资源时,pull 镜像用的镜像库是国外的,gcr.io 需要替换成国内的镜像源:gcr.azk8s.cn;如果使用原来的gcr.io , 资源创建成功后在启动的过程中,pod状态一直是 imagepullbackoff , 查看pod 内部,是无法pull 镜像所致。
# 官方提供release.yaml中需要的镜像是从谷歌云拉取的,国内的环境可能拉不到镜像
kubectl get pods --namespace tekton-pipelines --watch
kubectl get pods --namespace describe pod <pod-id>
kubectl --namespace tekton-pipelines describe pods
# 创建目录
mkdir tekton
# 下载yaml 文件,注意如果因为我们下面要替换的国内源不是即时更新的,有一个同步时间差,如果下载latest release 可能会遇到下载到昨天发布的最新版本,而使用国内源时会出现找不到最新镜像ID. 所以在更新之前可以在官网看一下最新版本是不是昨天才更新的版本,如果是建议选上一个版本,如果latest 是几天之前的,则没有问题。
#修改yaml 里面的镜像库
vi release.yaml
wget https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
%s/gcr.io/gcr.azk8s.cn/g
#重新创建资源
kubectl apply -f release.yaml
- 阿里云资源方式
# 上面的都还是有问题,最后可以使用阿里云的资源,这一个可以成功的创建
kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/release.yaml
kubectl get pods -n tekton-pipelines
安装完后后,可以看到在Kubernetes集群中新增了哪些Tekton的crd
创建并运行任务
创建并运行一个基本任务,Task在API中表示为Task类对象,它定义了一系列按顺序运行的步骤,以执行Task所需的逻辑。每个Task都作为一个pod在Kubernetes集群上运行,每个步骤都在自己的容器中运行。创建vi hello-world.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: hello
spec:
steps:
- name: echo
image: alpine
script: |
#!/bin/sh
echo "Hello World,itxs"
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: hello
spec:
steps:
- name: echo
image: ubuntu # contains bash
script: |
#!/usr/bin/env bash
echo "Hello World,itxs"
应用到集群的更改
kubectl apply --filename hello-world.yaml
要运行此Task,必须使用TaskRun实例化它。创建另一个名为hello-task-run的文件Yaml,内容如下:
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
name: hello-task-run
spec:
taskRef:
name: hello
将更改应用到集群以启动任务
kubectl apply --filename hello-task-run.yaml
# 验证运行是否正常
kubectl get taskrun hello-task-run
# 查看容器运行日志
kubectl logs --selector=tekton.dev/taskRun=hello-task-run
安装Dashboard
- 官方部署方式
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml
- 阿里云资源方式
# 安装一个 Tekton 提供的一个 Dashboard,我们可以通过 Dashboard 查看 Tekton 整个任务的构建过程,直接执行下面的命令直接安装即可
kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/dashboard.yaml
安装完后,可以查看其svc资源,类型为NodePort,暴露30952端口
访问http://tekton.com:30952/ ,这里我是作为host解析,所以可以域名访问
安装Cli
# 下载rpm或者二进制包
wget https://github.com/tektoncd/cli/releases/download/v0.26.0/tektoncd-cli-0.26.0_Linux-64bit.rpm
# rpm安装
rpm -Uvh tektoncd-cli-0.26.0_Linux-64bit.rpm
tkn task list
tkn --help
Pipelines示例演示
演示步骤如下
- 创建两个任务。其中一个任务用2.3节的任务
- 创建一个包含任务的管道。
- 使用PipelineRun实例化并运行包含任务的管道。
创建goodbye-world.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: goodbye
spec:
steps:
- name: goodbye
image: alpine
script: |
#!/bin/sh
echo "Goodbye World,itxs"
# 应用第二个任务
kubectl apply --filename goodbye-world.yaml
# 管道定义了一个按特定执行顺序排列的有序任务系列,作为CI/CD工作流的一部分,创建管道包含前面两个任务
vi hello-goodbye-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: hello-goodbye
spec:
tasks:
- name: hello
taskRef:
name: hello
- name: goodbye
runAfter:
- hello
taskRef:
name: goodbye
# 应用管道
kubectl apply --filename hello-goodbye-pipeline.yaml
# 用PipelineRun对象实例化你的Pipeline。创建一个名为hello-goodbye-pipeline-run的新文件。Yaml,内容如下
vi hello-goodbye-pipeline-run.yaml
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: hello-goodbye-run
spec:
pipelineRef:
name: hello-goodbye
# 通过将PipelineRun配置应用到集群来启动Pipeline:
kubectl apply --filename hello-goodbye-pipeline-run.yaml
# 使用如下命令查看PipelineRun的日志:
tkn pipelinerun logs hello-goodbye-run -f -n default
后续再补充基于Tekton的CI结合ArgoCD的CD实现完美新一代云原生组合
**本人博客网站 **IT小神 www.itxiaoshen.com
云原生强大且灵活的持续集成CI开源框架Tekton实战-上的更多相关文章
- Jenkins+Gitlab搭建持续集成(CI)环境
利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...
- 基于Jenkins的持续集成CI
CI(continuous integration)持续集成 一次构建:可能包含编译,测试,审查和部署,以及其他一些事情,一次构建就是将源代码放在一起,并验证软件是否可以作为一个一致的单元运行的过程. ...
- Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)
写在前面 记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps gitlab安装 步骤一:安装依赖 yum -y install git gcc glibc-static te ...
- 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表
准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...
- 柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
1.关于柯基数据 南京柯基数据科技有限公司成立于2015年,提供一站式全生命周期知识图谱构建和运维.智能应用服务,致力于"链接海量数据,从大数据中挖掘智慧".帮助企业运用知识 ...
- 持续集成CI与自动化测试
-------------------------------------------------------------------------------------------------- ...
- GitLab、Jenkins结合构建持续集成(CI)环境
1 持续集成 概述及运行流程 1.1 持续集成概述 持续集成概述:持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并迚程自 ...
- CentOS 7 部署Gitlab+Jenkins持续集成(CI)环境
持续集成概述及运行流程 : 持续集成概述 :持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中 ,可以频繁的将代码部署集成到主干,并进行自动化测试 开发→代 ...
- 持续集成CI
一.CI 和 CD 持续集成是什么? 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干.让产品可以快速迭代,同时还能保持高质量. 持续交付( ...
随机推荐
- maven exclusion 理解
结论:exclusion 表示对传递性依赖进行排除,排除后当前项目的依赖jar中,就不会包含该传递性依赖. 扩展:项目中的jar 都会在classpath下,排除后的传递性依赖,相当于在classpa ...
- 在less里面使用js函数
.colorPaletteMixin() { @functions: ~`(function() { this.colorPalette = function() { return '123px'; ...
- python第三方模块与内置模块
目录 openpyxl模块 random随机模块 hashlib加密模块 subprocess模块 logging模块 openpyxl模块 1.读取:openpyxl不擅长读数据 所以有一些模块优化 ...
- 举重若轻流水行云,前端纯CSS3实现质感非凡的图片Logo鼠标悬停(hover)光泽一闪而过的光影特效
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_197 喜欢看电影的朋友肯定会注意到一个有趣的细节,就是电影出品方一定会在片头的Logo环节做一个小特效:暗影流动之间光泽一闪而过, ...
- C#枚举器/迭代器
一.枚举器 1.为什么foreach可以顺序遍历数组? 因为foreach可以识别可枚举类型,通过访问数组提供的枚举器对象来识别数组中元素的位置从而获取元素的值并打印出来. 2.什么是枚举器?可枚举类 ...
- WPF 截图控件之画笔(八)「仿微信」
前言 接着上周写的截图控件继续更新添加 画笔. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...
- SpringBoot 如何集成 MyBatisPlus - SpringBoot 2.7.2实战基础
SpringBoot 2.7.2 学习系列,本节通过实战内容讲解如何集成 MyBatisPlus 本文在前文的基础上集成 MyBatisPlus,并创建数据库表,实现一个实体简单的 CRUD 接口. ...
- WPF 截图控件之移除控件(九)「仿微信」
WPF 截图控件之移除控件(九)「仿微信」 WPF 截图控件之移除控件(九)「仿微信」 作者:WPFDevelopersOrg 原文链接: https://github.com/WPFDevelope ...
- 参考MySQL Internals手册,使用Golang写一个简单解析binlog的程序
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL作为最流行的开源关系型数据库,有大量的拥趸.其生态已经相当完善,各项特性在圈内都有大量研究.每次新特性发布,都会 ...
- java学习第二天面向对象.day08
this 在方法中表示调用当前方法的对象,this与主方法中对象类名调用是同理的,也是去指向堆中的地址. this可以解决成员变量和形参的问题 使用构造器还是setter方法 构造器:在创建对象的时侯 ...