介绍基于OpenFaaS函数的knative Build教程 - alexellis


在这篇文章中,我将详细介绍如何使用knative build为基于Kubernetes之上的一个OpenFaaS函数构建Docker镜像。到帖子结束时,我们将使用Node.js为OpenFaaS函数构建一个Docker镜像,然后我们将探索如何在多个函数中使用它更通用。

背景
knative构建组件可以单独部署到其他组件,例如:Serving和Eventing。它的主要用例是使用声明性一次性作业在Kubernetes上进行集群内构建,其方式与我们传统上使用Jenkins创建的类似。
一旦你有一个工作的项目构建定义,你可以将它扩展到BuildTemplate并开始参数化,以包括像Docker图像名称中的Git修订,使用自定义git分支等。
构建作业由Build自定义资源定义或CRD表示。这些是YAML文件,可以使用它们加载到集群中kubectl apply -f filename.yaml。
在这篇文章中,我将编写一个faas-cli与一个存储库一起使用的示例,其中有一个函数。

先决条件
您可以在不安装OpenFaaS或CLI的情况下学习本教程,但如果您这样做可能会更有意义。


您可以使用我的GitHub存储库作为示例或创建您自己的存储库:

git clone https://github.com/myaccount/example
cd example

faas-cli template store pull node10-express
faas-cli new --lang node10-express node-tester

这将生成以下文件:

node-tester/handler.js
node-tester/package.json
node-tester.yml

示例处理程序:

"use strict"

module.exports = (event, context) => {
    let err;
    const result =             {
        status: "You said: " + JSON.stringify(event.body)
    };

    context
        .status(200)
        .succeed(result);
}

您可以通过查找其GitHub存储库然后查看其自述文件来了解如何利用OpenFaaS模板。

faas-cli template store describe node10-express

Name:              node10-express
Platform:          x86_64
Language:          NodeJS
Source:            openfaas-incubator
Description:       NodeJS 10 Express template
Repository:        https://github.com/openfaas-incubator/node10-express-template
Official Template: true

我倾向于YAML文件: 从node-tester.yml到stack.yml是默认的,可减少打字。如果您不想重命名该文件,请将-for --yaml参数传递给每个faas-cli命令。

教程
首先创建一个Kubernets集群,这可是使用kind,远程集群或现有集群。

1. 安装knative build
现在安装knative构建组件。这些不是用helm打包的,而是作为普通的YAML文件:

kubectl apply -f \
 https://github.com/knative/build/releases/download/v0.5.0/build.yaml

您可以检查rollout运行何时完成:

kubectl rollout status --namespace knative-build \
  deploy/build-controller

kubectl rollout status --namespace knative-build \
  deploy/build-webhook

当他们运行起来时你会看到:

deployment "build-controller" successfully rolled out
deployment "build-webhook" successfully rolled out

2. 定义安全以推送镜像
我们现在可以定义一个安全策略,用于将Docker镜像推送到Docker Hub或其他远程注册表。
创建regcred.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: regcred
  annotations:
    build.knative.dev/docker-0: https://index.docker.io/v1/
type: kubernetes.io/basic-auth
stringData: NOT Base64 encoded
  username: username-here
  password: password-here

运行应用 :
kubectl apply -f regcred.yaml

3. 为构建定义服务帐户
为了授予上述秘密访问权限,我们需要创建一个Kubernetes服务帐户。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-bot
secrets:
  - name: regcred

保存文件并应用:
kubectl apply -f build-bot.yaml
如果您已将该名称build-bot用于其他目的,则可以使用其他名称。

4. 定义Build
这是使用模板存储中的node8-express模板构建Node.js函数。

apiVersion: build.knative.dev/v1alpha1
kind: Build
metadata:
  name: openfaas-cloud-test-build
spec:
  serviceAccountName: build-bot
  source:
    git:
      url: https://github.com/alexellis/openfaas-cloud-test.git
      revision: master
  steps:
  - name: pull-template
    image: openfaas/faas-cli:0.8.8
    command: ["faas-cli"]
    args: ['template', 'store', 'pull', 'node8-express']
  - name: shrinkwrap
    image: openfaas/faas-cli:0.8.8
    command: ["faas-cli"]
    args: ['build', '--shrinkwrap']
  - name: build-push
    image: gcr.io/kaniko-project/executor:v0.7.0
    args:
      - "--context=dir:///workspace/build/timezone-shift"
      - "--dockerfile=/workspace/build/timezone-shift/Dockerfile"
      - "--destination=docker.io/alexellis2/openfaas-cloud-test:0.1.1"

请注意有关构建的以下内容:

  • source- 这里定义了GitHub存储库,它是公共的,revision是master。这是可配置的并提供源代码
  • serviceAccountName - 这就是Docker Hub推送秘密绑定到构建并可用的方式

每个构建步骤都被指定为一个命令和一组有序参数,其语法与您在Dockerfile CMD条目中使用的语法类似。

  • pull-template - 只有在使用模板商店时才需要这样做。如果你使用默认模板go,那么拉取动作会在build步骤`中自动发生
  • shrinkwrap- 此步骤采用源代码、OpenFaaS模板,并在不调用Docker的情况下建立build文件夹。该build文件夹将包含可与任何容器构建器一起使用的build上下文和Dockerfile
  • build-push - 在最后一步中,我们使用固定版本的Kaniko进行构建,然后将镜像推送到Docker Hub。版本0.8.0和0.9.0有一个bug会阻碍注册表的使用。我使用了三个标准标记:包括--context=dir://指定用于构建Dockerfile的根。我把它指向了shrinkwrap阶段生成的目录。

应用YAML 开始构建:

kubectl apply -f openfaas-cloud-test-build.yaml

更多:
 Kaniko docs and build arguments.

您可以使用kail -n default查看构建的进度,从指定名称空间中的每个容器和Pod输出日志。

更多: boz/kail
您还可以describe使用CRD条目来检查构建的每个步骤:

kubectl describe build/openfaas-cloud-test-build

现在,上述内容与Google的Cloud Build产品非常相似。实际上,等效文件将是:

steps:
## Shinkwrap
- name: 'gcr.io/$PROJECT_ID/faas-cli:0.8.8'
  args: ['faas-cli', 'template', 'store', 'pull', 'node8-express']
- name: 'gcr.io/$PROJECT_ID/faas-cli:0.8.8'
  args: ['faas-cli', 'build', '--shrinkwrap']
## Build Docker image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/timezone-shift:$REVISION_ID', '-t', 'gcr.io/$PROJECT_ID/timezone-shift:latest', '-f' ,'./build/timezone-shift/Dockerfile', './build/timezone-shift/']

images: 
- 'gcr.io/$PROJECT_ID/timezone-shift'

请注意,在Cloud Build中,模板的使用使文件更通用。在knative build中,通过BuildTemplateCRD 可以最好地完成任务。

5. BuildTemplate
我们现在可以开始参数化Build以在多个存储库中使用。
让我们对Docker Hub名称和函数名称进行参数化。
(1) 定义 BuildTemplate:

apiVersion: build.knative.dev/v1alpha1
kind: BuildTemplate
metadata:
  name: node8-express-openfaas
spec:
  steps:
  - name: pull-template
    image: openfaas/faas-cli:0.8.8
    command: ["faas-cli"]
    args: ['template', 'store', 'pull', 'node8-express']
  - name: shrinkwrap
    image: openfaas/faas-cli:0.8.8
    command: ["faas-cli"]
    args: ['build', '--shrinkwrap']
  - name: build-push
    image: gcr.io/kaniko-project/executor:v0.7.0
    args:
      - "--context=dir:///workspace/build/${FUNCTION}"
      - "--dockerfile=/workspace/build/${FUNCTION}/Dockerfile"
      - "--destination=${IMAGE}"

保存此文件并将其应用于 kubectl apply -f node8-express-openfaas-template.yaml

(2) 定义新构建
当我们有一个工作模板时,我们将能够显着减少我们的构建。现在我们只定义source,template和一些参数。

apiVersion: build.knative.dev/v1alpha1
kind: Build
metadata:
  name: ofc-templated-test-build
spec:
  serviceAccountName: build-bot
  source:
    git:
      url: https://github.com/alexellis/openfaas-cloud-test.git
      revision: master
  template:
    name: node8-express-openfaas
    kind: BuildTemplate # (or ClusterBuildTemplate)
    arguments:
    - name: IMAGE
      value: docker.io/alexellis2/openfaas-cloud-test:0.2.0
    - name: FUNCTION
      value: timezone-shift

保存以上内容ofc-templated-test-build.yaml并应用kubectl apply -f。

您现在应该看到终端上出现了一些日志,kail并在构建中输出:

kubectl describe build/ofc-templated-test-build

总结
可以在Docker Hub上看到我的两个版本 - 第一个是通过Build硬编码值创建的,第二个是通过更通用的创建的BuildTemplate,我也可以使用其他项目。