Knative 社区很早就在讨论用 Tekton 替换 Build 模块的相关事宜。Knative Build 官方已经正式说明不再建议使用 Knative Build 了。

如果你知道 Knative Build 是什么,相信你理解起 Tekton 就是一件很容易的事儿了。

  • Knative Build 对自己的一句话概述是:A Kubernetes-native Build resource.
  • Tekton 对自己的一句话概述是: A K8s-native Pipeline resource. https://tekton.dev
    可以看到两者的定位非常相近,但在功能上 Tekton 的设计更加丰富、完整,这也是社区最终采用 Tekton 的原因。接下来我们就看一下 Tekton 的核心概念。

Tekton 极速入门

Tekton 主要由以下五个核心概念组成:

  • Task
  • TaskRun
  • Pipeline
  • PipelineRun
  • PipelineResource

以上五个概念,每一个都是以 CRD 的形式提供服务的。下面分别简述一下这五个概念的含义。

Task

Task 就是一个任务执行模板,之所以说 Task 是一个模板是因为 Task 定义中可以包含变量,Task 在真正执行的时候需要给定变量的具体值。Tekton 的 Task 很类似于一个函数的定义,Task 通过 inputs.params 定义需要哪些入参,并且每一个入参还可以指定默认值。Task 的 steps 字段表示当前 Task 是有哪些子步骤组成的。每一个步骤具体就是一个镜像的执行,镜像的启动参数可以通过 Task 的入参使用模板语法进行配置。

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: Task
  3. metadata:
  4. name: task-with-parameters
  5. spec:
  6. inputs:
  7. params:
  8. - name: flags
  9. type: array
  10. - name: someURL
  11. type: string
  12. steps:
  13. - name: build
  14. image: registry.cn-hangzhou.aliyuncs.com/knative-sample/alpine:3.9
  15. command: ["sh", "-c"]
  16. args: [ "echo ${inputs.params.flags} ; echo ${someURL}"]

TaskRun

Task 定义好以后是不能执行的,就像一个函数定义好以后需要调用才能执行一样。所以需要再定义一个 TaskRun 去执行 Task。TaskRun 主要是负责设置 Task 需要的参数,并通过 taskRef 字段引用要执行的 Task。

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: TaskRun
  3. metadata:
  4. name: run-with-parameters
  5. spec:
  6. taskRef:
  7. name: task-with-parameters
  8. inputs:
  9. params:
  10. - name: flags
  11. value: "--set"
  12. - name: someURL
  13. value: "https://github.com/knative-sample"

Pipeline

一个 TaskRun 只能执行一个 Task,当需要编排多个 Task 的时候就需要 Pipeline 出马了。Pipeline 是一个编排 Task 的模板。Pipeline 的 params 声明了执行时需要的入参。 Pipeline 的 spec.tasks 定义了需要编排的 Task。Tasks 是一个数组,数组中的 task 并不是通过数组声明的顺序去执行的,而是通过 runAfter 来声明 task 执行的顺序。Tekton controller 在解析 CRD 的时候会解析 Task 的顺序,然后根据设定的顺序依次去执行。Pipeline 在编排 Task 的时候需要给每一个 Task 传入必需的参数,这些参数的值可以来自 Pipeline 自身的 params。

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: Pipeline
  3. metadata:
  4. name: pipeline-with-parameters
  5. spec:
  6. params:
  7. - name: context
  8. type: string
  9. description: Path to context
  10. default: /some/where/or/other
  11. tasks:
  12. - name: task-
  13. taskRef:
  14. name: build
  15. params:
  16. - name: pathToDockerFile
  17. value: Dockerfile
  18. - name: pathToContext
  19. value: "${params.context}"
  20. - name: task-
  21. taskRef:
  22. name: build-push
  23. runAfter:
  24. - source-to-image
  25. params:
  26. - name: pathToDockerFile
  27. value: Dockerfile
  28. - name: pathToContext
  29. value: "${params.context}"

PipelineRun

和 Task 一样, Pipeline 定义完成以后也是不能直接执行的,需要 PipelineRun 才能执行 Pipeline。PipelineRun 的主要作用是给 Pipeline 设定必要的入参,并执行 Pipeline。

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: PipelineRun
  3. metadata:
  4. name: pipelinerun-with-parameters
  5. spec:
  6. pipelineRef:
  7. name: pipeline-with-parameters
  8. params:
  9. - name: "context"
  10. value: "/workspace/examples/microservices/leeroy-web"

PipelineResource

前面已经介绍了 Tekton 的四个核心概念。现在我们已经知道怎么定义 task、执行 task 以及编排 task 了。但可能你还想在 Task 之间共享资源,这就是 PipelineResource 的作用。比如我们可以把 git 仓库信息放在 PipelineResource 中。这样所有 Task 就可以共享这份数据了。

  1. piVersion: tekton.dev/v1alpha1
  2. kind: PipelineResource
  3. metadata:
  4. name: wizzbang-git
  5. namespace: default
  6. spec:
  7. type: git
  8. params:
  9. - name: url
  10. value: https://github.com/wizzbangcorp/wizzbang.git
  11. - name: revision
  12. value: master

鉴权信息

git 仓库、镜像仓库这些都是需要鉴权才能使用的。所以还需要一种设定鉴权信息的机制。Tekton 本身是 Kubernetes 原生的编排系统。所以可以直接使用 Kubernetes 的 ServiceAccount 机制实现鉴权。

实例如下:

  • 定义一个保存镜像仓库鉴权信息的 secret
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: ack-cr-push-secret
  5. annotations:
  6. tekton.dev/docker-: https://registry.cn-hangzhou.aliyuncs.com
  7. type: kubernetes.io/basic-auth
  8. stringData:
  9. username: <cleartext non-encoded>
  10. password: <cleartext non-encoded>
  • 定义 ServiceAccount ,并且使用上面的 secret
  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: pipeline-account
  5. secrets:
  6. - name: ack-cr-push-secret
  • PipelineRun 中引用 ServiceAccount
  1. apiVersion: tekton.dev/v1alpha1
  2. kind: PipelineRun
  3. metadata:
  4. generateName: tekton-kn-sample-
  5. spec:
  6. pipelineRef:
  7. name: build-and-deploy-pipeline
  8. ... ...
  9. serviceAccount: pipeline-account

Hello World

https://github.com/knative-sample/tekton-knative 这是一个完整的 Tekton 的 Hello World。下面我们一起体验一下这个  Hello World。

在开始实战之前,你需要有一个 Kubernetes 集群,并且还需要安装 Knative 和 Tekton。tekton-knative 中的 release-v0.5.2.yaml 直接提交到 Kubernetes 集群即可完成 Tekton 的安装。下面我们开始体验使用 Tekton 从源码到构建再到部署的自动化过程。

clone 代码

clone 代码到本地。

  1. git clone https://github.com/knative-sample/tekton-knative

创建 PipelineResource

主要内容在 resources/picalc-git.yaml 文件中。如下所示主要是把 https://github.com/knative-sample/tekton-knative 保存在 resource 中给其他资源使用。

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: PipelineResource
  3. metadata:
  4. name: tekton-knative-git
  5. spec:
  6. type: git
  7. params:
  8. - name: revision
  9. value: master
  10. - name: url
  11. value: https://github.com/knative-sample/tekton-knative

创建 task

创建 task,这个例子中我们创建两个 task:source-to-image 和 deploy-using-kubectl

  • source-to-image
    主要内容在 tasks/source-to-image.yaml 文件中。此 task 的主要功能是把源代码编译成镜像。
    主要是使用 kaniko 实现容器内编译 Docker 镜像的能力。此 Task 的参数主要是设置编译上下文的一些信息,比如:Dockerfile、ContextPath 以及目标镜像 tag 等。
  1. apiVersion: tekton.dev/v1alpha1
  2. kind: Task
  3. metadata:
  4. name: source-to-image
  5. spec:
  6. inputs:
  7. resources:
  8. - name: git-source
  9. type: git
  10. params:
  11. - name: pathToContext
  12. description: The path to the build context, used by Kaniko - within the workspace
  13. default: .
  14. - name: pathToDockerFile
  15. description: The path to the dockerfile to build (relative to the context)
  16. default: Dockerfile
  17. - name: imageUrl
  18. description: Url of image repository
  19. - name: imageTag
  20. description: Tag to apply to the built image
  21. default: "latest"
  22. steps:
  23. - name: build-and-push
  24. image: registry.cn-hangzhou.aliyuncs.com/knative-sample/kaniko-project-executor:v0.10.0
  25. command:
  26. - /kaniko/executor
  27. args:
  28. - --dockerfile=${inputs.params.pathToDockerFile}
  29. - --destination=${inputs.params.imageUrl}:${inputs.params.imageTag}
  30. - --context=/workspace/git-source/${inputs.params.pathToContext}
  31. env:
  32. - name: DOCKER_CONFIG
  33. value: /builder/home/.docker
  • deploy-using-kubectl
    主要内容在 tasks/deploy-using-kubectl.yaml 文件中。
    如下所示这个 Task 主要的作用是通过参数获取到目标镜像的信息,然后执行一条 sed 命令把 Knative Service yaml 中的 __IMAGE__ 替换成目标镜像。再通过 kubectl 发布到 Kubernetes 中。
  1. apiVersion: tekton.dev/v1alpha1
  2. kind: Task
  3. metadata:
  4. name: deploy-using-kubectl
  5. spec:
  6. inputs:
  7. resources:
  8. - name: git-source
  9. type: git
  10. params:
  11. - name: pathToYamlFile
  12. description: The path to the yaml file to deploy within the git source
  13. - name: imageUrl
  14. description: Url of image repository
  15. - name: imageTag
  16. description: Tag of the images to be used.
  17. default: "latest"
  18. steps:
  19. - name: update-yaml
  20. image: alpine
  21. command: ["sed"]
  22. args:
  23. - "-i"
  24. - "-e"
  25. - "s;__IMAGE__;${inputs.params.imageUrl}:${inputs.params.imageTag};g"
  26. - "/workspace/git-source/${inputs.params.pathToYamlFile}"
  27. - name: run-kubectl
  28. image: registry.cn-hangzhou.aliyuncs.com/knative-sample/kubectl:v0.5.0
  29. command: ["kubectl"]
  30. args:
  31. - "apply"
  32. - "-f"
  33. - "/workspace/git-source/${inputs.params.pathToYamlFile}"

定义 Pipeline

我们已经有两个 Task 了,现在我们就用一个 PIpeline 来编排这两个 Task:

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: Pipeline
  3. metadata:
  4. name: build-and-deploy-pipeline
  5. spec:
  6. resources:
  7. - name: git-source
  8. type: git
  9. params:
  10. - name: pathToContext
  11. description: The path to the build context, used by Kaniko - within the workspace
  12. default: src
  13. - name: pathToYamlFile
  14. description: The path to the yaml file to deploy within the git source
  15. - name: imageUrl
  16. description: Url of image repository
  17. - name: imageTag
  18. description: Tag to apply to the built image
  19. tasks:
  20. - name: source-to-image
  21. taskRef:
  22. name: source-to-image
  23. params:
  24. - name: pathToContext
  25. value: "${params.pathToContext}"
  26. - name: imageUrl
  27. value: "${params.imageUrl}"
  28. - name: imageTag
  29. value: "${params.imageTag}"
  30. resources:
  31. inputs:
  32. - name: git-source
  33. resource: git-source
  34. - name: deploy-to-cluster
  35. taskRef:
  36. name: deploy-using-kubectl
  37. runAfter:
  38. - source-to-image
  39. params:
  40. - name: pathToYamlFile
  41. value: "${params.pathToYamlFile}"
  42. - name: imageUrl
  43. value: "${params.imageUrl}"
  44. - name: imageTag
  45. value: "${params.imageTag}"
  46. resources:
  47. inputs:
  48. - name: git-source
  49. resource: git-source

鉴权信息

如下所示,定义一个 Secret 和 ServiceAccount。并且授予 ServiceAccount 绑定执行 Knative Service 的权限。

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: ack-cr-push-secret
  5. annotations:
  6. tekton.dev/docker-: https://registry.cn-hangzhou.aliyuncs.com
  7. type: kubernetes.io/basic-auth
  8. stringData:
  9. username: <cleartext non-encoded>
  10. password: <cleartext non-encoded>
  11. ---
  12. apiVersion: v1
  13. kind: ServiceAccount
  14. metadata:
  15. name: pipeline-account
  16. secrets:
  17. - name: ack-cr-push-secret
  18. ---
  19. apiVersion: v1
  20. kind: Secret
  21. metadata:
  22. name: kube-api-secret
  23. annotations:
  24. kubernetes.io/service-account.name: pipeline-account
  25. type: kubernetes.io/service-account-token
  26. ---
  27. kind: Role
  28. apiVersion: rbac.authorization.k8s.io/v1
  29. metadata:
  30. name: pipeline-role
  31. rules:
  32. - apiGroups: ["serving.knative.dev"]
  33. resources: ["services"]
  34. verbs: ["get", "create", "update", "patch"]
  35. ---
  36. apiVersion: rbac.authorization.k8s.io/v1
  37. kind: RoleBinding
  38. metadata:
  39. name: pipeline-role-binding
  40. roleRef:
  41. apiGroup: rbac.authorization.k8s.io
  42. kind: Role
  43. name: pipeline-role
  44. subjects:
  45. - kind: ServiceAccount
  46. name: pipeline-account

定义 PIpelineRun

ServiceAccount 对应的鉴权信息是通过和 PIpelineRun 绑定的方式来执行的。参见 run/picalc-pipeline-run.yaml 文件

  1. apiVersion: tekton.dev/v1alpha1
  2. kind: PipelineRun
  3. metadata:
  4. generateName: tekton-kn-sample-
  5. spec:
  6. pipelineRef:
  7. name: build-and-deploy-pipeline
  8. resources:
  9. - name: git-source
  10. resourceRef:
  11. name: tekton-knative-git
  12. params:
  13. - name: pathToContext
  14. value: "src"
  15. - name: pathToYamlFile
  16. value: "knative/helloworld-go.yaml"
  17. - name: imageUrl
  18. value: "registry.cn-hangzhou.aliyuncs.com/knative-sample/tekton-knative-helloworld"
  19. - name: imageTag
  20. value: "1.0"
  21. trigger:
  22. type: manual
  23. serviceAccount: pipeline-account

执行 HelloWorld

  1. kubectl apply -f tasks/source-to-image.yaml -f tasks/deploy-using-kubectl.yaml -f resources/picalc-git.yaml -f image-secret.yaml -f pipeline-account.yaml -f pipeline/build-and-deploy-pipeline.yaml -f run/picalc-pipeline-run.yaml

查看一下 pod 信息,可能是下面这样:

  1. └─# kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. tekton-kn-sample-45d84-deploy-to-cluster-wfrzx-pod-f093ef / Completed 8h
  4. tekton-kn-sample-45d84-source-to-image-7zpqn-pod-c2d20c / Completed 8h

欢迎加入 Knative 交流群

Knative 初体验:CICD 极速入门的更多相关文章

  1. Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整

    Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...

  2. Knative 初体验:Build Hello World

    作者 | 阿里云智能事业群技术专家 冬岛 Build 模块提供了一套 Pipeline 机制.Pipeline 的每一个步骤都可以执行一个动作,这个动作可以是把源码编译成二进制.可以是编译镜像也可以是 ...

  3. Knative 初体验:Eventing Hello World

    作者 | 阿里云智能事业群高级开发工程师 元毅 基于事件驱动是Serveless的核心功能之一,通过事件驱动服务,满足了用户按需付费(Pay-as-you-go)的需求.在之前的文章中我们介绍过 Kn ...

  4. python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨

    python系列均基于python3.4环境 ---------@_@? --------------------------------------------------------------- ...

  5. gulp快速入门&初体验

    前言 一句话先 gulp 是一个可以简单和自动化"管理"前端文件的构建工具 先说我以前的主要工作,我主要是做游戏服务端的,用c++/python,所以我对东西的概念理解难免要套到自 ...

  6. 微信小程序初体验,入门练手项目--通讯录,部署上线(二)

    接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...

  7. cucumber java从入门到精通(1)初体验

    cucumber java从入门到精通(1)初体验 cucumber在ruby环境下表现让人惊叹,作为BDD框架的先驱,cucumber后来被移植到了多平台,有cucumber-js以及我们今天要介绍 ...

  8. ARKit从入门到精通(1)-ARKit初体验

    ARKit从入门到精通(1)-ARKit初体验 转载自:http://blog.csdn.net/u013263917/article/details/72903174 该系列文章共十篇,笔者将由易到 ...

  9. pytorch入门2.2构建回归模型初体验(开始训练)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

随机推荐

  1. Redis+Keepalived

    简介 Redis高可用方案,保障两台Redis任意节点故障可正常使用. 方案:Redis主从复制+Redis哨兵+Keepalived 环境 系统:Centos/Radhat 7 服务1:Redis ...

  2. C#A类派生类强转基类IL居然还是可以调用派生类中方法的例子

    大家都知道在C#中,如果B类继承自A类,如果一个对象是B类型的但是转换为A类型之后,这个对象是无法在调用属于B类型的方法的,如下例子: 基类A: public class A { } 派生类B: pu ...

  3. 这些好用却鲜为人知的Python库,你知道多少?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 读芯术 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  4. CSS符合选择器

    CSS复合选择器 后代选择器 后代选择器又称为包含选择器,可以选择父元素里面的子元素.其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔,当标签发生嵌套时,内层标签就成为外层标签的后代 元 ...

  5. 为Dynamics CRM注释的图片附件做个预览功能

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复163或者20151017可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM中注释可 ...

  6. Linux—网络通讯管理命令

    一.ping命令 . ping 主机名 . ping 域名 [root@localhost ~]# ping www.baidu.com . ping IP地址 [root@localhost ~]# ...

  7. Lnmp架构部署动态网站环境.2019-7-2-1.1

    一.Mysql简介 Mysql数据库: 1.社区版 2.商业版 3.cluster集群 Mysql安装方式 1.编译安装 2.yum/rpm 3.二进制包,直接解压,无需编译 二.Mysql安装部署 ...

  8. 简单web服务工作流程梳理

       一.用户访问web基本流转过程梳理 二.web框架粗略概括

  9. 【cf375】D. Tree and Queries(dsu on tree+线段树)

    传送门 题意: 给出一颗以\(1\)为根的有根树,每个结点有个颜色\(c_i\). 之后要回答\(m\)组询问,每组询问包含\(v_i,k_i\),要回答以\(v_i\)为根的子树中,颜色出现次数不小 ...

  10. SpringCloud学习笔记(九、SpringCloud Stream)

    目录: 什么是SpringCloud Stream 如何使用SpringCloud Stream 消息分流 什么是SpringCloud Stream: SpringCloud Stream是一个用于 ...