在这篇文章中,我将详细介绍如何使用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,我也可以使用其他项目。