HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Knative 初体验:Build Hello World

  • 2019-08-09
  • 本文字数:3511 字

    阅读完需:约 12 分钟

Knative 初体验:Build Hello World

Build 模块提供了一套 Pipeline 机制。Pipeline 的每一个步骤都可以执行一个动作,这个动作可以是把源码编译成二进制、可以是编译镜像也可以是其他的任何事情。Knative Build 执行编译的时候并不需要我们提前准备编译环境,所有这些都是直接在 Pod 中执行的。当有任务需要执行的时候 Build 模块就自动创建 Pod 进行相应的处理。所以,这一系列的动作都是 Kubernetes 原生的。


Knative Build 的几个关键特性

  • 一个完整的 Build 是由多个 Builder 构成的 Pipeline,每一个 Builder 可以执行一个或多个操作

  • 一个 Builder 在执行的时候就是一个 container,而且容器的镜像是声明 Builder 的时候用户自己指定的,所以可以在 container 里面执行任何指令

  • 基于 Kaniko 可以在 Builder 中编译镜像以及把镜像推送到镜像仓库等操作

  • BuildTemplate 提供了可以重复使用的模板

  • Build 过程可以从 git 仓库 clone 代码、向镜像仓库 push 镜像。所有这些动作使用到的鉴权信息都可以通过 serviceAccount 进行关联。直接使用 Kubernetes 原生的能力即可实现


Build 示例

既然是 Hello World 我们就从一个具体的例子谈起。


apiVersion: build.knative.dev/v1alpha1kind: Buildmetadata:  name: example-build-namespec:  serviceAccountName: build-auth-example  source:    git:      url: https://github.com/example/build-example.git      revision: master  steps:    - name: ubuntu-example      image: ubuntu      args: ["ubuntu-build-example", "SECRETS-example.md"]    - image: gcr.io/example-builders/build-example      args: ["echo", "hello-example", "build"]    - name: dockerfile-pushexample      image: gcr.io/example-builders/push-example      args: ["push", "${IMAGE}"]      volumeMounts:        - name: docker-socket-example          mountPath: /var/run/docker.sock  volumes:    - name: example-volume      emptyDir: {}
复制代码


关键字段解释:


  • steps


steps 字段和 template 字段互斥。如果未指定 template 就需要设置 steps 字段。此字段用于指定 Pipeline 的步骤。也可以把 steps 定义在 BuildTemplate 中,这样就能通过模板来复用 Pipeline 的能力了。


每一个 step 就是制定一个镜像,在真正执行的时候启动一个容器去做当前 step 的动作。


  • Template


如果未设置 steps 就需要指定此字段。此字段通过引用 BuildTemplate 来设置 steps。


  • Source


常用的 Source 就是 git repo,通过此字段指定引用的 git repo ,repo 的授权信息通过关联的 ServiceAccount 进行设定。


  • ServiceAccount


从 git repe 克隆代码和向镜像仓库 push 镜像都需要鉴权信息。这些鉴权信息可以通过 Kubernetes 的 ServiceAccount 进行关联。


  • Volumes


可以通过挂载 volume 的形式挂载 secret 或者 emptyDir 在多个 step 之间共享数据


  • Timeout


整个 Build 过程默认超时时间是 10 分钟,也就是如果在 10 分钟内没有还有 step 没有执行完成就会超时退出。但有可以通过 Timeout 字段自定义超时时间。


接下来分别对每一个关键字段进行详细的解读。


steps

下面这是一个设置 steps 的例子,这个例子中有三个 step。每一个 step 都通过一个镜像执行一个容器完成自己的动作。


spec:  steps:    - name: ubuntu-example      image: ubuntu      args: ["ubuntu-build-example", "SECRETS-example.md"]    - image: gcr.io/example-builders/build-example      args: ["echo", "hello-example", "build"]    - name: dockerfile-pushexample      image: gcr.io/example-builders/push-example      args: ["push", "${IMAGE}"]      volumeMounts:        - name: docker-socket-example          mountPath: /var/run/docker.sock
复制代码


Template

通过 BuildTemplate 来定义可以重复使用的 steps,主要是对 steps 的复用。BuildTemplate 本身是 Kubernetes 中的一个 CRD。CRD 的好处就是可以在用户之间共享,只要是在同一个 Kubernetes 集群内就可以相互共享,这样效率更高。


BuildTemplate 除了定义 steps 以外还可以指定 parameters,用户在使用 BuildTemplate 的时候可以基于 parameters 对 steps 做个性化的设置。而 BuildTemplate 的编写者也可以通过 parameters 来共享变量。


spec:  parameters:    # This has no default, and is therefore required.    - name: IMAGE      description: Where to publish the resulting image.
# These may be overridden, but provide sensible defaults. - name: DIRECTORY description: The directory containing the build context. default: /workspace - name: DOCKERFILE_NAME description: The name of the Dockerfile default: Dockerfile
steps: - name: dockerfile-build image: gcr.io/cloud-builders/docker workingDir: "${DIRECTORY}" args: [ "build", "--no-cache", "--tag", "${IMAGE}", "--file", "${DOCKERFILE_NAME}", ".", ] volumeMounts: - name: docker-socket mountPath: /var/run/docker.sock
- name: dockerfile-push image: gcr.io/cloud-builders/docker args: ["push", "${IMAGE}"] volumeMounts: - name: docker-socket mountPath: /var/run/docker.sock
# As an implementation detail, this template mounts the host's daemon socket. volumes: - name: docker-socket hostPath: path: /var/run/docker.sock type: Socket
复制代码


Source

常见的 source 就是指定一个 git repo 或者 emptyDir 共享数据,下面我们分别对这两种场景进行说明。


  • git repo 的例子


下面这个例子的意思是从 https://github.com/knative/build.git clone 代码,并且指定一个 step 是 cat README.md


spec:  source:    git:      url: https://github.com/knative/build.git      revision: master  steps:    - image: ubuntu      args: ["cat", "README.md"]
复制代码


  • volume 共享数据


下面这个例子是两个 step,第一个 step 下载文件并保存到 /var/my-volume 中,第二个 step 是使用 /var/my-volume 的内容。


spec:  steps:    - image: ubuntu      entrypoint: ["bash"]      args: ["-c", "curl https://foo.com > /var/my-volume"]      volumeMounts:        - name: my-volume          mountPath: /var/my-volume
- image: ubuntu args: ["cat", "/etc/my-volume"] volumeMounts: - name: my-volume mountPath: /etc/my-volume
volumes: - name: my-volume emptyDir: {}
复制代码


ServiceAccount

下面这个例子是使用了 test-build-robot-git-ssh 这个 ServiceAccount 去关联 clone 代码需要的 git ssh 认证信息。通过 ServiceAccount 和 secret 保存认证信息也可以做到在多个用户之间共享相同的数据,而且可以通过 RBAC 控制不同资源的可见范围,比较灵活。


  • Build 配置如下


apiVersion: build.knative.dev/v1alpha1kind: Buildmetadata:  name: test-build-with-serviceaccount-git-ssh  labels:    expect: succeededspec:  serviceAccountName: test-build-robot-git-ssh  source:    git:      url: git@github.com:knative/build.git      revision: master
steps: - name: config image: ubuntu command: ["/bin/bash"] args: ["-c", "cat README.md"]
复制代码


  • test-build-robot-git-ssh ServiceAccount 配置如下


apiVersion: v1kind: ServiceAccountmetadata:  name: test-build-robot-git-sshsecrets:  - name: test-git-ssh
复制代码


  • ServiceAccount 关联的 secret 如下


apiVersion: v1kind: Secretmetadata:  name: test-git-ssh  annotations:    build.knative.dev/git-0: github.comtype: kubernetes.io/ssh-authdata:  # Generated by:  # cat id_rsa | base64 -w 0  ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVk.....[example]  # Generated by:  # ssh-keyscan github.com | base64 -w 0  known_hosts: Z2l0aHViLmNvbSBzc2g.....[example]
复制代码


Timeout

下面这个是自定义 Build 超时时间的例子。


spec:  timeout: 20m  source:    git:      url: https://github.com/knative/build.git      revision: master  steps:    - image: ubuntu      args: ["cat", "README.md"]
复制代码


相关文章:


《初识 Knative:跨平台的 Serverless 编排框架》


《Knative 初体验:Serving Hello World》


《Knative 初体验:Eventing Hello World》


2019-08-09 08:184025
用户头像
阿里云容器平台 ACK,企业云原生转型最佳搭档

发布了 43 篇内容, 共 23.3 次阅读, 收获喜欢 81 次。

关注

评论

发布
暂无评论
发现更多内容

LabVIEW控制Arduino采集多路模拟量、数字量(进阶篇—1)

不脱发的程序猿

单片机 LabVIEW VISA Arduino Uno 采集多路模拟量、数字量

Squarespace 和 WordPress 的区别

海拥(haiyong.site)

WordPress 6月月更

使用 TensorFlow 和 Express.js 实现AI图像识别

devpoint

tensorflow Express 6月月更

【Spring 学习笔记(四)】Spring Bean 集合注入和自动装配

倔强的牛角

spring Java EE 6月月更

抖音大举进军电商领域:这步棋应该如何下

石头IT视角

学生管理系统架构文档

爱晒太阳的大白

模块3作业(外包学生管理系统架构文档)

Geek_701557

关于 SAP Commerce Cloud 的 Sample Setup Github 仓库

汪子熙

typescript angular SAP commerce 6月月更

JavaScript迭代器

大熊G

JavaScript 前端 6月月更

以购物清单为例讲述 Redux 的状态如何在 Flutter 多个组件间共享

岛上码农

flutter 安卓开发 ios 开发 跨平台应用 6月月更

【腾讯云代码分析】五月上新+新功能前瞻

腾源会

Web Service进阶(一)运行原理

No Silver Bullet

6月月更 Web Service 运行原理

Python环境搭建

梦笔生花

Python编程 6月月更 Python环境

修改gradle脚本,加速spring4.1源码编译构建速度

程序员欣宸

Java spring Gradle 6月月更

【盲盒APP】开发功能版块及功能介绍

WDL22119

Flink on yarn 远程调试源码

JasonLee实时计算

flink

数据库每日一题---第3天:大的国家

知心宝贝

数据库 算法 前端 后端 6月月更

区块链mass哈希競猜dapp游戏开发源代码(多游戏)

开发微hkkf5566

等你加入|建木开源社区团队成员招募

Jianmu

开源社区 自动化运维 社区运营 志愿者招募

Fabric.js 居中元素 🎗️

德育处主任

fabric canvas FabricJS Fabric.js 6月月更

《WebRTC源码深入剖析》总结

音视频专家-李超

源码分析 音视频 WebRTC 源码剖析

Flink 通过 State Processor API 实现状态的读取和写入

JasonLee实时计算

flink

java构造器(构造方法、构造函数)

写代码两年半

面试 javase 构造函数 6月月更

700行无用 纯 CSS 祝考生 金榜高粽《1_bit 的无用 CSS 代码 》

1_bit

CSS html 前端

Kubernetes社区发行版:开源容器云OpenShift Origin(OKD)认知

山河已无恙

k8s openshift

Web Service进阶(三)HTTP-GET, HTTP-POST and SOAP的比较

No Silver Bullet

soap 6月月更 Web Service HTTP-GET HTTP-POST

C#入门系列(五) -- 运算符

陈言必行

C# 6月月更

【LeetCode】数组中第 K 个独一无二的字符串Java题解

Albert

LeetCode 6月月更

Linux驱动开发_数码相册项目、360WIFI驱动移植介绍

DS小龙哥

6月月更

Sentinel与OpenFeign 服务熔断那些事

牧小农

sentinel openfeign

外包学生管理系统

极客土豆

Knative 初体验:Build Hello World_文化 & 方法_冬岛_InfoQ精选文章