Knative 初体验:CICD 极速入门


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 的入参使用模板语法进行配置。

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:name: task-with-parameters
spec:inputs:params:- name: flagstype: array- name: someURLtype: stringsteps:- name: buildimage: registry.cn-hangzhou.aliyuncs.com/knative-sample/alpine:3.9command: ["sh", "-c"]args: [ "echo ${inputs.params.flags} ; echo ${someURL}"]

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

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:name: run-with-parameters
spec:taskRef:name: task-with-parametersinputs:params:- name: flagsvalue: "--set"- name: someURLvalue: "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。

apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:name: pipeline-with-parameters
spec:params:- name: contexttype: stringdescription: Path to contextdefault: /some/where/or/othertasks:- name: task-1taskRef:name: buildparams:- name: pathToDockerFilevalue: Dockerfile- name: pathToContextvalue: "${params.context}"- name: task-2taskRef:name: build-pushrunAfter:- source-to-imageparams:- name: pathToDockerFilevalue: Dockerfile- name: pathToContextvalue: "${params.context}"

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

apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:name: pipelinerun-with-parameters
spec:pipelineRef:name: pipeline-with-parametersparams:- name: "context"value: "/workspace/examples/microservices/leeroy-web"

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

piVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:name: wizzbang-gitnamespace: default
spec:type: gitparams:- name: urlvalue: https://github.com/wizzbangcorp/wizzbang.git- name: revisionvalue: master

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

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

Hello World

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

clone 代码
clone 代码到本地。

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

apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:name: tekton-knative-git
spec:type: gitparams:- name: revisionvalue: master- name: urlvalue: 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 等。

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:name: source-to-image
spec:inputs:resources:- name: git-sourcetype: gitparams:- name: pathToContextdescription: The path to the build context, used by Kaniko - within the workspacedefault: .- name: pathToDockerFiledescription: The path to the dockerfile to build (relative to the context)default: Dockerfile- name: imageUrldescription: Url of image repository- name: imageTagdescription: Tag to apply to the built imagedefault: "latest"steps:- name: build-and-pushimage: registry.cn-hangzhou.aliyuncs.com/knative-sample/kaniko-project-executor:v0.10.0command:- /kaniko/executorargs:- --dockerfile=${inputs.params.pathToDockerFile}- --destination=${inputs.params.imageUrl}:${inputs.params.imageTag}- --context=/workspace/git-source/${inputs.params.pathToContext}env:- name: DOCKER_CONFIGvalue: /builder/home/.docker
  • deploy-using-kubectl 
    主要内容在 tasks/deploy-using-kubectl.yaml 文件中。

如下所示这个 Task 主要的作用是通过参数获取到目标镜像的信息,然后执行一条 sed 命令把 Knative Service yaml 中的 __IMAGE__ 替换成目标镜像。再通过 kubectl 发布到 Kubernetes 中。

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:name: deploy-using-kubectl
spec:inputs:resources:- name: git-sourcetype: gitparams:- name: pathToYamlFiledescription: The path to the yaml file to deploy within the git source- name: imageUrldescription: Url of image repository- name: imageTagdescription: Tag of the images to be used.default: "latest"steps:- name: update-yamlimage: alpinecommand: ["sed"]args:- "-i"- "-e"- "s;__IMAGE__;${inputs.params.imageUrl}:${inputs.params.imageTag};g"- "/workspace/git-source/${inputs.params.pathToYamlFile}"- name: run-kubectlimage: registry.cn-hangzhou.aliyuncs.com/knative-sample/kubectl:v0.5.0command: ["kubectl"]args:- "apply"- "-f"- "/workspace/git-source/${inputs.params.pathToYamlFile}"

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

apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:name: build-and-deploy-pipeline
spec:resources:- name: git-sourcetype: gitparams:- name: pathToContextdescription: The path to the build context, used by Kaniko - within the workspacedefault: src- name: pathToYamlFiledescription: The path to the yaml file to deploy within the git source- name: imageUrldescription: Url of image repository- name: imageTagdescription: Tag to apply to the built imagetasks:- name: source-to-imagetaskRef:name: source-to-imageparams:- name: pathToContextvalue: "${params.pathToContext}"- name: imageUrlvalue: "${params.imageUrl}"- name: imageTagvalue: "${params.imageTag}"resources:inputs:- name: git-sourceresource: git-source- name: deploy-to-clustertaskRef:name: deploy-using-kubectlrunAfter:- source-to-imageparams:- name: pathToYamlFilevalue:  "${params.pathToYamlFile}"- name: imageUrlvalue: "${params.imageUrl}"- name: imageTagvalue: "${params.imageTag}"resources:inputs:- name: git-sourceresource: git-source

鉴权信息
如下所示,定义一个 Secret 和 ServiceAccount。并且给 ServiceAccount 绑定执行 Knative Service 的权限。

首先创建一个 Secret 保存镜像仓库的鉴权信息,如下所示:

  • tekton.dev/docker-0 换成你要推送的镜像仓库的地址
  • username 换成镜像仓库鉴权的用户名
  • password 环境镜像仓库鉴权的密码
apiVersion: v1
kind: Secret
metadata:name: ack-cr-push-secretannotations:tekton.dev/docker-0: https://registry.cn-hangzhou.aliyuncs.com
type: kubernetes.io/basic-auth
stringData:username: <cleartext non-encoded>password: <cleartext non-encoded>

下面这些信息保存到文件中,然后使用 kubectl apply -f 指令提交到 Kubernetes

---
apiVersion: v1
kind: ServiceAccount
metadata:name: pipeline-account
secrets:
- name: ack-cr-push-secret---apiVersion: v1
kind: Secret
metadata:name: kube-api-secretannotations:kubernetes.io/service-account.name: pipeline-account
type: kubernetes.io/service-account-token---kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: pipeline-role
rules:
- apiGroups: ["serving.knative.dev"]resources: ["services"]verbs: ["get", "create", "update", "patch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: pipeline-role-binding
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: pipeline-role
subjects:
- kind: ServiceAccountname: pipeline-account

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

apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:generateName: tekton-kn-sample-
spec:pipelineRef:name: build-and-deploy-pipelineresources:- name: git-sourceresourceRef:name: tekton-knative-gitparams:- name: pathToContextvalue: "src"- name: pathToYamlFilevalue: "knative/helloworld-go.yaml"- name: imageUrlvalue: "registry.cn-hangzhou.aliyuncs.com/knative-sample/tekton-knative-helloworld"- name: imageTagvalue: "1.0"trigger:type: manualserviceAccount: pipeline-account

执行 HelloWorld
准备 PIpeline 的资源

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 

执行 create 把 pipelieRun 提交到 Kubernetes 集群。之所以这里使用 create 而不是使用 apply 是因为 PIpelineRun 每次都会创建一个新的,kubectl 的 create 指令会基于 generateName 创建新的 PIpelineRun 资源。

kubectl create -f run/picalc-pipeline-run.yaml 

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

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


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于 Docker ,你必须了解的核心都在这里了!

来源 | fysuccess来源 | CSDN博客&#xff0c;责编 | Carol头图 | CSDN 下载自视觉中国Docker引擎Docker Engine是具有以下主要组件的客户端-服务器应用程序&#xff1a;服务器是一种长期运行的程序&#xff0c;称为守护程序进程&#xff08; dockerd命令&#xff09;。REST AP…

如何在视频里任意抠图?阿里工程师做到了!

阿里妹导读&#xff1a;现在的我们在手机上花费了越来越多的时间&#xff0c;其中&#xff0c;视频又格外地吸引我们的注意力。有很多好玩的视频&#xff0c;需要把前景物体从视频中分割出来&#xff0c;这需要花费创作者99%以上的时间。今天&#xff0c;阿里资深算法专家任海兵…

启动vue项目失败,报错Failed at the node-sass@4.14.1 postinstall script.

在启动vue项目的时候报错 报错信息如下&#xff1a;npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass4.14.1 postinstall: node scripts/build.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass4.14.1 postinstall script. npm ERR! This i…

DLedger —基于 raft 协议的 commitlog 存储库

尊敬的阿里云用户&#xff1a; 您好&#xff01;为方便您试用开源 RocketMQ 客户端访问阿里云MQ&#xff0c;我们申请了专门的优惠券&#xff0c;优惠券可以直接抵扣金额。请填写下您公司账号信息&#xff0c;点击上图&#xff0c;了解更多哦。 一、DLedger引入目的 在 Rocke…

不服来战!青藤发起“雷火引擎”公测赛 百万赏金寻顶尖白帽

2020年春天&#xff0c;以5G、人工智能、云计算为代表的“新基建”蔚然成风&#xff0c;着眼国家数字经济体系建设&#xff0c;打造数字经济体系底座的“新基建”&#xff0c;无疑成为中国经济整体应对未来发展的核心方案。可以说&#xff0c;没有任何一个时期比现在更能够彰显…

UI2CODE系列文章|如何批量制造高质量样本

在 UI2CODE 项目中&#xff0c;我们大量使用了深度学习方法来做一些物体检测。而深度学习模型的训练&#xff0c;避免不了需要大量的样本&#xff0c;因此如何制造大量样本&#xff0c;来满足模型训练需要是我们必须要解决的一个问题。在这篇文章中&#xff0c;我们将介绍我们如…

javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati

控制台service端打印javax.management.InstanceNotFoundException: org.springframework.boot:typeAdmin,nameSpringApplication 那个报的就点哪个,将红圈里的对勾去掉 就ok了&#xff01;

极测未来|淘宝千人千面内容下的智能评测技术与实践

背景挑战 全面个性化、内容化的淘宝&#xff0c;构造了基于内容的丰富的导购场景&#xff0c;包括猜你喜欢、有好货、每日好店、必买清单、哇哦视频、微淘、买家秀、头条、洋葱盒子….。个性化&#xff0c;给消费者带来更精准的货品分发。内容化为消费者带来更多惊喜和好的体验…

新时代 新营销 新增长, 纷享销客重磅发布CRM7.0产品,持续赋能企业数字化未来

2020年4月26日&#xff0c;主题为“新时代 新营销 新增长”的纷享销客2020销售增长大会暨春季战略与新品发布会&#xff0c;在GMIC大会期间成功举办。纷享销客创始人&CEO罗旭发表“新时代 新营销 新增长”的主题演讲&#xff0c;同时重磅发布纷享销客连接型CRM7.0新品。 这…

python3-matplotlib基本使用(以折线图为例)

1、什么是matplotlib Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一&#xff0c;支持跨平台运行&#xff0c;它是 Python 常用的 2D 绘图库&#xff0c;同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用&#xff0c;是数据分析中不可或…

flowable 开源项目

企业级工作流引擎开源项目 文章目录一、工作流引擎flowable1. flowable2. cims3. RuoYi-flowable4. springboot-flowable-modeler5. flowable-diagram二、工作流引擎activiti2.1. RuoYi-Vue-Process2.2. RuoYi-Process2.3. ruoyi-vue-activiti2.4. activiti7-workflow2.5. JeeS…

看!闲鱼在ServiceMesh的探索和实践

背景&#xff1a; 在阿里服务端开发以Java为主的大背景下&#xff0c;其他异构语言业务如何调用现有Java服务&#xff0c;如何与集团中间件打通&#xff0c;就成为使用非Java语言团队必须要解决的首要问题。 已有方案问题&#xff1a; 在ServiceMesh方案成熟之前&#xff0c…

编译错误 错误:PL/SQL: ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER 行

文章目录1. 现象2. 分析3. 解决方案通过存储过程将临时B表中的数据同步到轨迹表中 1. 现象 PROCEDURE LABS.ASSET_LOANP 编译错误错误&#xff1a;PL/SQL: ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER 行&#xff1a;17 文本&#xff1a;(select n.*, trunc(DBMS_R…

如何保证 HBase 服务的高可用?看看这份 HBase 可用性分析与高可用实践吧!

来源 | 阿丸笔记责编 | Carol头图 | CSDN 下载自视觉中国HBase作为一个分布式存储的数据库&#xff0c;它是如何保证可用性的呢&#xff1f;对于分布式系统的CAP问题&#xff0c;它是如何权衡的呢&#xff1f;最重要的是&#xff0c;我们在生产实践中&#xff0c;又应该如何保证…

python3-matplotlib绘制散点图、绘制条形图

matplotlib 支持的图形 https://matplotlib.org/stable/gallery/index.html 1、绘制散点图 from matplotlib import pyplot as plt from matplotlib import font_manager# y_3是三月每天的最高温度 y_10 是十月每天的最高温度 y_3 [11,17,16,11,12,11,12,6,6,7,8,9,12,…

ORA-01858: 在要求输入数字处找到非数字字符 13行

文章目录1. 现象2. 分析3. 解决方案ORA-01858: 在要求输入数字处找到非数字字符13行 1. 现象 insert /*append*/ into ASSET_LOAN(select * from ASSET_LOANB );commit;2. 分析 由于ASSET_LOANB表和ASSET_LOAN表字段顺序不一致导致的 具体分析&#xff1a;由于ASSET_LOANB表倒数…

牛!Python 全栈必备的 150 个实战案例,一次性获得!

Python 全栈将是你升职加薪的硬通货。我见过很多的 Python 讲解教程和书籍&#xff0c;它们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符…

数据权限实现

权限框架可以根据用户所属角色决定有权限看到的菜单资源权限。 同一个资源下的同一个菜单的数据权限需要单独处理。 案例&#xff1a;一部门的张三和二部门的李四都是普通用户角色&#xff0c;普通用户都有用户管理的查询权限&#xff0c;但是&#xff0c;一部门的张三只能看到…

遍地开花的 Attention ,你真的懂吗?

阿里妹导读&#xff1a;曾被 paper 中各种各样的 Attentioin 搞得晕晕乎乎&#xff0c;尽管零零散散地整理过一些关于Attention 的笔记&#xff0c;重点和线索依然比较凌乱。今天&#xff0c;阿里巴巴工程师楠易&#xff0c;将 Attentioin 的知识系统性地梳理、回顾、总结&…

Wrapper+map实现页面显示

文章目录1. 查询用户数据map集合2. map集合参数拼装1. 查询用户数据map集合 2. map集合参数拼装 用户角色和部门名称&#xff0c;根据角色ID和部门id分别查询替换&#xff0c;简言之&#xff1a;需要的内容分别通过单独查询数据库得到&#xff0c;然后通过遍历依次对比&#xf…