介紹基於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 更多: |
您可以使用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,我也可以使用其他專案。
相關文章
- Knative 核心概念介紹:Build、Serving 和 Eventing 三大核心元件UI元件
- Trim() 函式的介紹函式
- Tensorflow教程(2)Tensorflow的常用函式介紹函式
- 無涯教程: Laravel 8 - 自定義函式介紹Laravel函式
- ORACLE函式介紹Oracle函式
- TypeScript 函式介紹TypeScript函式
- stoi函式介紹函式
- OpenFaaS實戰之三:Java函式Java函式
- javascript函式中with的介紹JavaScript函式
- Oracle 的基本函式介紹Oracle函式
- javascript中關於匿名函式高階介紹JavaScript函式
- GaussDB資料庫基礎函式介紹1資料庫函式
- oracle常用函式介紹Oracle函式
- 機器學習基本函式介紹機器學習函式
- replaceChild()函式用法介紹函式
- lpad函式介紹函式
- oracle REPLACE 函式 介紹Oracle函式
- oracle 日期函式介紹Oracle函式
- CUDA常用函式介紹函式
- GCD、dispatch 函式介紹GC函式
- cuda函式庫介紹函式
- 【函式】Oracle TRIM函式語法介紹函式Oracle
- OpenFaaS實戰之二:函式入門函式
- javascript高階函式的介紹JavaScript函式
- javascript中generator函式的介紹JavaScript函式
- js lastIndexOf()函式的用法介紹JSASTIndex函式
- javascript的split()函式使用介紹JavaScript函式
- Oracle 8 的函式介紹(轉)Oracle函式
- MySQL 教程基礎介紹MySql
- 函式表示式和函式宣告簡單介紹函式
- 【重溫基礎】JS中的常用高階函式介紹JS函式
- Dart建構函式介紹Dart函式
- funclib函式庫介紹函式
- 網路常用函式介紹函式
- prototype.js函式介紹JS函式
- 基於函式的索引函式索引
- Hive的基本介紹以及常用函式Hive函式
- Angular 14 新的 inject 函式介紹Angular函式