如何借助 Tekton 实现微服务的 Pipeline( 二 )


实体
Tekton定义了如下的基本Kubernetes自定义资源定义(KubernetesCustomResourceDefinition , CRD)来构建Pipeline:
能够定义可引用的资源 , 比如源码仓库或容器镜像 。
定义了一个按顺序执行的step列表 。 每个step会在容器中执行命令 。 每个task都是一个KubernetesPod , Pod中包含了与step同等数量的容器 。
会实例化一个要执行的 , 并且会带有具体的输入、输出和参数 。
会定义一个task的列表 , 这些task会按照特定的顺序来执行 。
会实例化一个要执行的 , 并且会带有具体的输入、输出和参数 。 它会自动为每个创建实例 。
可以通过创建对象单独运行 , 也可以作为的一部分运行 。
如何借助 Tekton 实现微服务的 Pipeline
文章图片
安装
执行如下的命令来启动集群:
Kubernetes启动就绪之后 , 我们可以下载CLI工具来与TektonPipeline进行交互 。 在本例中 , 我们从发布页面下载0.18.0 。
现在 , 我们通过执行如下的命令安装Tekton控制器:
2
定义Pipeline
接下来 , 我们看一下该如何在Tekton中定义持续交付的Pipeline 。 这个pipeline由两个task组成 。 第一个task从GitHub上clone项目 , 使用Maven(可以是其他任意的构建工具甚至是不同的语言)构建Java项目 , 创建容器镜像并将其推送至一个容器registry 。 第二个任务会将服务部署至一个Kubernetes集群 。
如何借助 Tekton 实现微服务的 Pipeline
文章图片
但是 , 在开发pipeline之前 , 我们先通过一个简单的“HelloWorld”来理解Tekton的概念 。
第一个Task
我们创建一个只包含单个step的task , 该task会启动一个容器并在容器中执行命令 。 创建名为的文件:
使用列出当前注册的所有task:
此时只是注册了这个task , 现在我们需要初始化一个task来执行它 。 我们可以通过使用CLI或应用一个来实现这一点 。 在这里 , 我们创建一个名为的文件 , 它会在字段中注册前文所述的 。
然后 , 我们应用这个文件 , task就会被触发 。
我们可以使用列出当前所有的task:
归根到底 , 只是运行在Kubernetes集群中的一个KubernetesPod , 而每个step则是Pod中的一个容器 。 执行如下的命令获取当前的Pod:
Pod的状态是已完成 , 因为task已经执行完毕了 。 它会运行一个容器 , 容器的名字会符合中部分name字段所定义的值 。
我们可以描述一下Pod , 请关注区域 , 以获取task启动的容器的概况:
如何借助 Tekton 实现微服务的 Pipeline
文章图片
最后 , 我们可以使用的logs命令查看TaskRun的日志:
现在 , 我们对Tekton的task已经有了基本的了解 , 接下来我们更进一步 , 实现一个具备了所需step的真正pipeline 。
Pipeline资源
定义了输入/输出资源的位置 , 这些资源会被Task中的step所用到 。 这些参数通常会遵循GitURL或者容器镜像全限定名的形式 。
我们创建一个新的文件来配置项目的仓库:
然后 , 创建另外一个来设置容器镜像:
Task
在创建task之前 , 我们先创建一个Kubernetes , 它包含了两个用于Quay访问凭证的键/值对 , 分别是Quay的用户名和Quay的密码 。 请将username和password的值替换成正确的值 。
接下来 , 我们创建一个来构建项目 , 创建Linux容器镜像并将其推送至容器registry上(在本例中 , 我们使用Quay , 但是可以切换成任意的其他方案) 。
因为这是一个使用Quarkus实现的Java项目 , 所以我们会通过集成Jib实现以Dockerless的方式创建容器镜像 。 在一个容器运行时(Tekton就是这种情况)中构建容器镜像时 , 我们可能会遇到一些在容器中运行task容器的问题(构建新的容器) 。 这也是为何采用Dockerless技术创建容器的重要原因 。 对于Java项目来说 , Jib是一个可行的方案 , 但是也有其他通用的、不针对特定语言的方案 , 比如Buildah或Kaniko 。