加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

怎样借助 Tekton 实现微服务的 Pipeline

发布时间:2021-11-13 13:41:48 所属栏目:大数据 来源:互联网
导读:在微服务架构中,应用程序是由多个相互连接的服务组成的,这些服务协同工作以实现所需的业务功能。所以,一个典型的企业级微服务架构如下所示: 最初,我们可能认为使用微服务架构实现一个应用程序是很容易的事情。但是,要恰当地完成这一点并不容易,因为
在微服务架构中,应用程序是由多个相互连接的服务组成的,这些服务协同工作以实现所需的业务功能。所以,一个典型的企业级微服务架构如下所示:
 
 
最初,我们可能认为使用微服务架构实现一个应用程序是很容易的事情。但是,要恰当地完成这一点并不容易,因为我们会面临一些新的挑战,而这些挑战是单体架构所未曾遇到的。举例来讲,这样的挑战包括容错、服务发现、扩展性、日志和跟踪等。
 
为了应对这些挑战,每个微服务都需要实现在 Red Hat 被称为“微服务特性(microservicility)”的内容。这个术语指的是除了业务逻辑之外,服务必须要实现的一个横切性关注点的列表。
 
这些关注点总结起来如下图所示:
 
 
在本系列的第一部分和第二部分中,我们分别讨论了如何使用 Quarkus 和 Istio 实现这些微服务特性。但是,还有一个微服务特性是我们在这两篇文章中都没有涉及到的,那就是Pipeline。
 
在微服务架构中,我们应该能够独立地部署服务,而不需要任何的部署编排(orchestration)。在服务间没有任何的编排意味着没有必要在每次部署的时候都部署和发布整个应用程序,只需要其中的很小一部分就可以了。
 
如果我们能够发布应用中各个小的组成部分的话,那么这会带来一些好处:
 
减少在应用中引入破坏性变更的几率。
 
如果出现错误的话,更容易部署和回滚。
 
我们可以增加部署至生产环境的频率。
 
出于这样的原因,每个服务应该都有自己部署 Pipeline,这样的话,我们就可以随时部署它,只需要遵循它自己的规则或流程即可。
 
 
但是,为每个服务都创建一个部署 Pipeline 会带来一些挑战,这是我们需要解决的:
 
如何实现和管理多个 Pipeline。
 
如何为所有的服务实现自动部署。
 
如何跨服务共享 Pipeline 中的某些组成部分,同时又保持这些 Pipeline 的独立性。
 
如何在云环境中执行它们。
 
大多数问题的答案就是 Pipeline 即代码(pipeline-as-code)。这种技术能够允许我们以代码或可视为代码的文件(YAML)的形式创建持续交付 Pipeline。
 
因为 Pipeline 是以代码的形式定义的,所以它们应该置于源码控制之下,这意味着它们是可以重用、可以建立分支也可以创建 tag。更重要的是,我们能够将服务代码和交付 Pipeline 添加到相同的仓库中。
 
Kubernetes 正在成为部署微服务的事实标准工具。它是一个开源的系统,用来自动化、编排、扩展和管理容器。
 
正如我们在前面的两篇文章中所讲到的那样,在我们提到的十个微服务特性中,通过使用 Kubernetes 能够覆盖其中的三个。
 
 
如果我们使用 Istio,可以实现另外五个微服务特性,即服务发现、回弹性、认证、监控和跟踪。
 
 
使用 Kubernetes 和 Istio 是个好主意,但是 Pipeline 该怎么实现呢?我们该如何实现一个 Kubernetes 原生的持续交付 Pipeline 呢?引入 Tekton 是一个可行的解决方案。
 
1
 
Tekton
 
Tekton 是一个 Kubernetes 原生的构建 CI/CD Pipeline 的解决方案,能够以 Kubernetes 扩展的方式安装和运行。它提供了一组 Kubernetes 自定义资源(custom resource),借助这些自定义资源,我们可以为 Pipeline 创建和重用构建块。
 
实体
 
Tekton 定义了如下的基本 Kubernetes 自定义资源定义(Kubernetes Custom Resource Definition,CRD)来构建 Pipeline:
 
能够定义可引用的资源,比如源码仓库或容器镜像。
 
定义了一个按顺序执行的 step 列表。每个 step 会在容器中执行命令。每个 task 都是一个 Kubernetes Pod,Pod 中包含了与 step 同等数量的容器。
 
会实例化一个要执行的,并且会带有具体的输入、输出和参数。
 
会定义一个 task 的列表,这些 task 会按照特定的顺序来执行。
 
会实例化一个要执行的,并且会带有具体的输入、输出和参数。它会自动为每个创建实例。
 
可以通过创建对象单独运行,也可以作为的一部分运行。
 
 
安装
 
执行如下的命令来启动集群:
 
Kubernetes 启动就绪之后,我们可以下载 CLI 工具来与 Tekton Pipeline 进行交互。在本例中,我们从发布页面下载 0.18.0。
 
现在,我们通过执行如下的命令安装 Tekton 控制器:
 
2
 
定义 Pipeline
 
接下来,我们看一下该如何在 Tekton 中定义持续交付的 Pipeline。这个 pipeline 由两个 task 组成。第一个 task 从 GitHub 上 clone 项目,使用 Maven(可以是其他任意的构建工具甚至是不同的语言)构建 Java 项目,创建容器镜像并将其推送至一个容器 registry。第二个任务会将服务部署至一个 Kubernetes 集群。
 
 
但是,在开发 pipeline 之前,我们先通过一个简单的“Hello World”来理解 Tekton 的概念。
 
第一个 Task
 
我们创建一个只包含单个 step 的 task,该 task 会启动一个容器并在容器中执行命令。创建名为的文件:
 
使用列出当前注册的所有 task:
 
此时只是注册了这个 task,现在我们需要初始化一个 task 来执行它。我们可以通过使用 CLI 或应用一个来实现这一点。在这里,我们创建一个名为 的文件,它会在字段中注册前文所述的。
 
然后,我们应用这个文件,task 就会被触发。
 
我们可以使用列出当前所有的 task:
 
归根到底,只是运行在 Kubernetes 集群中的一个 Kubernetes Pod,而每个 step 则是 Pod 中的一个容器。执行如下的命令获取当前的 Pod:
 
Pod 的状态是已完成,因为 task 已经执行完毕了。它会运行一个容器,容器的名字会符合中部分 name 字段所定义的值。
 
我们可以描述一下 Pod,请关注区域,以获取 task 启动的容器的概况:
 
 
最后,我们可以使用的 logs 命令查看 TaskRun 的日志:
 
现在,我们对 Tekton 的 task 已经有了基本的了解,接下来我们更进一步,实现一个具备了所需 step 的真正 pipeline。
 
Pipeline 资源
 
定义了输入 / 输出资源的位置,这些资源会被 Task 中的 step 所用到。这些参数通常会遵循 Git URL 或者容器镜像全限定名的形式。
 
我们创建一个新的文件来配置项目的仓库:
 
然后,创建另外一个来设置容器镜像:
 
Task
 
在创建 task 之前,我们先创建一个 Kubernetes ,它包含了两个用于 Quay 访问凭证的键 / 值对,分别是 Quay 的用户名和 Quay 的密码。请将 username 和 password 的值替换成正确的值。
 
接下来,我们创建一个来构建项目,创建 Linux 容器镜像并将其推送至容器 registry 上(在本例中,我们使用 Quay,但是可以切换成任意的其他方案)。
 
因为这是一个使用 Quarkus 实现的 Java 项目,所以我们会通过集成 Jib 实现以 Dockerless 的方式创建容器镜像。在一个容器运行时(Tekton 就是这种情况)中构建容器镜像时,我们可能会遇到一些在容器中运行 task 容器的问题(构建新的容器)。这也是为何采用 Dockerless 技术创建容器的重要原因。对于 Java 项目来说,Jib 是一个可行的方案,但是也有其他通用的、不针对特定语言的方案,比如 Buildah 或 Kaniko。
 
我们创建一个,它会执行执行 Maven package goal,设置构建所需的 Quarkus 选项并将容器镜像推送至 Quay。当然,我们还需要以输入和输出()的方式设置 Git 仓库和容器镜像名,并以参数(Kubernetes )的形式设置 Quay 的用户名和密码。
 
在前面的文件中,我们看到 Quay 凭证的 secret 名被设置为参数。参数有一个默认值,它的值与命令中所用的值是相同的。
 
输入参数被命名为,类型为。
 
输出参数是容器镜像的名称。
 
在部分中,我们定义了一些环境变量,用来配置 Quarkus 容器镜像扩展如何构建和推送容器镜像:
 
容器镜像名是在输出资源中定义的。
 
Quay 凭证会从 Kubernetes 中注入进来。
 
在 Kubernetes 集群中注册 task:
 
最后我们通过创建一个来初始化这个 task,此时我们需要链接在前文中通过创建的输入 / 输出资源并将 secret 名称设置为参数。
 
注意,字段指向了在前文中定义的的名称。
 
当被应用的时候,构建过程就开始执行了,它会 clone 项目,使用 Maven 进行构建,然后创建并推送镜像。通过使用 CLI,我们可以看到当前 task 的实时日志:
 
 
Pipeline
 
现在,我们已经创建了一个简单的 task。但是,实际的持续交付 / 部署 pipeline 应该是由多个 task 组成的:构建并推送容器镜像,然后将其部署到 Kubernetes 集群中。
 
接下来我们创建具有两个 step 的 task:
 
第一个 step 是使用所设置的容器镜像更新 Kubernetes 。在编辑 deployment YAML 文件时,我们可以使用 yq 工具。同时,我们使用代替来展示在容器中运行命令的另外一种方式。
 
第二个 step 执行命令以部署服务。
 
对于这个 task 来讲,我们需要三个参数:deployment 文件、存储 deployment 文件的 Git 仓库以及前面 task 中所构建的容器镜像的名称。
 
创建名为的文件,内容如下所示:
 
注意,在第一个 step 中,我们使用来代替。要传递 Tekton 参数到区域,我们需要通过环境变量来实现。
 
要部署服务,我们需要在 Kubernetes 集群中执行命令。为了实现这一点,我们需要设置一个 Kubernetes 以允许服务账号(因为这是在我们的样例中运行 Tekton Pipeline 所使用的服务账号)具备相应的权限。这个角色必须要允许在运行的容器中应用 Kubernetes 资源。
 
创建名为的文件,内容如下:
 
注册角色:
 
现在,我们已经可以创建 Tekton Pipeline 将这两个 task 组合在一起了。在这里,定义 pipeline 参数至关重要,因为在 pipeline 定义中引用 Tekton Task 的时候,要设置这些参数。在这两个 task 中,我们都定义了值(和),并引用作为输入 / 输出。
 
创建文件:
 
我们可以使用 CLI 列出 pipeline:
 
通过命令描述 pipeline,能够让我们看到 pipeline 的概述以及在运行它的时候,必须要定义哪些内容:
 
现在,我们不需要任何的了,因为它们会在应用的时候自动创建:
 
在中,我们设置了和之间的链接,因为它是由执行的。
 
与 TaskRun 类似,我们可以通过如下的命令将一个 pipeline 的日志以流的方式链接起来:
 
如果构建成功的话,服务将会部署到当前的 Kubernetes 集群中。我们可以获取所有的 Pod 以查看集群中发生了什么:
 
我们可以看到有两个已完成的 Pod。 Pod 对应的是 task,它会 clone、构建和测试服务,并且最终会创建和推送容器镜像。 Pod 对应 task,它负责部署应用。
 
除了 task 之外,这里还有一个正在运行的 Pod。这就是 pipeline 执行期间所部署的应用 Pod。
 
3
 
结论
 
开发和实现微服务架构要比开发单体应用更具挑战性。我们相信,微服务特性能够促使你在应用基础设施方面正确地开发服务。
 
在本系列的第一篇和第二篇文章中,我们分别学习了如何使用 Quarkus 或 Istio 实现微服务特性,但是我们还没有介绍 Pipeline 这项微服务特性。本文阐述了如何使用 Tekton 实现一个基本的持续交付 pipeline,Tekton 是一个 Kubernetes 原生的解决方案,用于构建 CI/CD pipeline。
 
Tekton 一个很重要的优势是能够在容器最终要部署的同一个集群中创建容器镜像。这减少了容器在某些机器上构建而在其他机器上部署时可能出现的差异。另一个优势是使用 YAML 文件来定义 pipeline 的方式。通过这种方式,pipeline 能够与源代码一起存储,使其可创建分支、可创建 tag 或版本化。
 
有时候,没有必要从头开始定义 task,在 Tekton Catalog 上,我们可以看到很多可以直接使用的 task。除此之外,如果你需要开发自定义的 task 的话,要借助参数和输入 / 输出资源将它们设计的尽可能比较开放。通过这种方式,task 有可能实现在你的组织内的重用,从而解决类似的问题。
 
本文只是 Tekton 的一个简介。我们可以看到当一个对象在集群中创建的时候,pipeline 就会运行,但是触发器 / 事件也可以触发 Pipeline。举例来讲,事件可能是对 GitHub 仓库中特性分支的推送。触发器是一个更高级的话题,你可以通过该地址学习关于触发器的更多知识。
 
用于阐述本文的源码可以在 GitHub仓库中找到。第一篇和第二篇文章的源码也分别可以在这里和这里获取。
 
作者简介:
 
Alex Soto 是红帽公司的开发者体验总监。他对 Java 领域、软件自动化充满热情,他相信开源软件模式。Soto 是Manning 的《Testing Java Microservices》和O’Reilly 的《Quarkus Cookbook》两本书的共同作者,他还是多个开源项目的贡献者。自 2017 年以来,他一直是 Java Champion,是国际演讲者和 Salle URL 大学的教师。你可以在 Twitter 上关注他(Alex Soto ),随时了解 Kubernetes 和 Java 领域的动态。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读