介紹基於OpenFaaS函式的knative Build教程 - alexellis

banq發表於2019-08-15

在這篇文章中,我將詳細介紹如何使用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推送祕密繫結到構建並可用的方式

介紹基於OpenFaaS函式的knative Build教程 - alexellis每個構建步驟都被指定為一個命令和一組有序引數,其語法與您在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,我也可以使用其他專案。

相關文章