基于Knative部署Knative Functions
Knative Functions為您在Knative平臺(tái)上創(chuàng)建和部署函數(shù)提供了一個(gè)簡(jiǎn)化的編程模型,屏蔽了許多Knative、Kubernetes、容器等復(fù)雜的底層細(xì)節(jié)。您只需創(chuàng)建函數(shù),系統(tǒng)會(huì)自動(dòng)生成容器鏡像,自定義鏡像構(gòu)建和部署的相關(guān)參數(shù)后,您可以完成函數(shù)的部署,函數(shù)會(huì)以Knative Service的形式存在。
前提條件
已在集群中部署Knative,請(qǐng)參見部署Knative。
步驟一:安裝命令行工具
在funcrelease page頁(yè)面,下載適用于您操作系統(tǒng)的
func
二進(jìn)制文件。本文以Linux系統(tǒng)為例,介紹如何安裝func命令行工具。
下載完成后,執(zhí)行以下命令,將二進(jìn)制文件重新命名為
func
。mv <path-to-binary-file> func # <path-to-binary-file> 表示二進(jìn)制文件的本地地址。如:func_darwin_amd64或func_linux_amd64。
執(zhí)行以下命令,賦予二進(jìn)制文件可執(zhí)行權(quán)限。
chmod +x func
執(zhí)行以下命令,將func命令移動(dòng)到系統(tǒng)PATH中的某個(gè)目錄里,這樣才能在任何地方執(zhí)行該命令。
mv func /usr/local/bin
執(zhí)行以下命令,驗(yàn)證func命令行工具是否已安裝成功。
func version
如果顯示已安裝的func工具的版本信息,則表明命令行工具已安裝成功。
步驟二:創(chuàng)建函數(shù)
Knative函數(shù)提供了創(chuàng)建基本函數(shù)的模板。您可以選擇函數(shù)的語(yǔ)言和調(diào)用方式。以下模板可用于CloudEvent和HTTP調(diào)用。
下文以Go語(yǔ)言的模板為例,介紹如何創(chuàng)建函數(shù)。
執(zhí)行以下命令,創(chuàng)建函數(shù)。
func create -l <language> <function-name>
例如,創(chuàng)建一個(gè)Go語(yǔ)言的示例函數(shù)。
func create -l go hello
預(yù)期輸出:
Created go function in /usr/local/bin/hello
在
hello
目錄下執(zhí)行ls
命令,查看創(chuàng)建的Project目錄。func.yaml go.mod handle.go handle_test.go README.md
在
hello
目錄下執(zhí)行以下命令,查看自動(dòng)創(chuàng)建出來(lái)的func.yaml文件。cat func.yaml
預(yù)期輸出:
specVersion: 0.35.0 name: hello runtime: go created: 2023-12-13T06:48:45.419587147Z
編輯func.yaml文件,自定義配置構(gòu)建和部署的參數(shù),以供后續(xù)使用。func.yaml文件包含函數(shù)項(xiàng)目的配置信息。詳細(xì)信息,請(qǐng)參見func_yaml.md。
func.yaml文件的示例代碼如下所示:
specVersion: 0.35.0 name: hello runtime: go created: 2023-11-29T14:47:34.101658+08:00 registry: registry.cn-beijing.aliyuncs.com/knative-release-xxx image: registry.cn-beijing.aliyuncs.com/knative-release-xxx/hello:latest build: builderImages: pack: registry-cn-beijing.ack.aliyuncs.com/acs/knative-func-builder-jammy-tiny:latest deploy: namespace: default
registry
:表示構(gòu)建之后,推送鏡像的目標(biāo)倉(cāng)庫(kù)地址。builderImages
:表示鏡像構(gòu)建所使用的容器,例如registry-cn-beijing.ack.aliyuncs.com/acs/knative-func-builder-jammy-tiny:latest
。deploy
:表示部署相關(guān)的配置,如Namespace等。
步驟三:部署Knative Functions
在創(chuàng)建函數(shù)后,您可以直接部署Knative Functions。
執(zhí)行以下命令,在函數(shù)項(xiàng)目中部署函數(shù)。
deploy
命令默認(rèn)使用函數(shù)項(xiàng)目名稱作為Knative服務(wù)名稱。構(gòu)建函數(shù)時(shí),將使用項(xiàng)目名稱和鏡像倉(cāng)庫(kù)名稱來(lái)構(gòu)造函數(shù)的完整鏡像地址。func deploy
預(yù)期輸出:
Building function image Still building Still building Yes, still building Don't give up on me Still building This is taking a while Still building Still building Yes, still building Function built: registry.cn-beijing.aliyuncs.com/knative-release-xxx/hello:latest Pushing function image to the registry "registry.cn-beijing.aliyuncs.com" using the "xxx" user credentials Deploying function to the cluster Function deployed in namespace "default" and exposed at URL: http://hello.default.example.com
執(zhí)行以下命令,查看函數(shù)部署信息。
func info
預(yù)期輸出:
Function name: hello Function is built in image: Function is deployed in namespace: default Routes: http://hello.default.example.com
步驟四:調(diào)用Knative Functions
將Knative訪問網(wǎng)關(guān)地址與需要訪問的域名進(jìn)行Host綁定,在Hosts文件中添加綁定信息。
綁定樣例如下。
121.xx.xxx.xx hello.default.example.com # 121.xx.xxx.xx請(qǐng)?zhí)鎿Q為Knative服務(wù)的網(wǎng)關(guān)地址,hello.default.example.com請(qǐng)?zhí)鎿Q為您的服務(wù)域名。
執(zhí)行以下命令,調(diào)用函數(shù)。
func invoke
預(yù)期輸出:
POST / HTTP/1.1 hello.default.example.com Content-Type: application/json Forwarded: for=192.168.102.101;proto=http Knative-Serving-Default-Route: true X-Forwarded-Proto: http User-Agent: Go-http-client/1.1 Content-Length: 25 Accept-Encoding: gzip K-Proxy-Request: activator X-Forwarded-For: 192.168.102.101, 192.168.102.97 X-Request-Id: 3d82cfc8-f9df-4935-84cd-c6561b4587f6 Body:
預(yù)期輸出表明,一個(gè)HTTP請(qǐng)求被發(fā)送到了Knative Functions,函數(shù)調(diào)用成功。
執(zhí)行以下命令,查看集群中Pod的狀態(tài)。
kubectl get pod
預(yù)期輸出:
NAME READY STATUS RESTARTS AGE hello-00001-deployment-7b65fcdc4c-gfcbp 2/2 Running 0 34
預(yù)期輸出表明,函數(shù)調(diào)用成功觸發(fā)了Pod的創(chuàng)建。
相關(guān)文檔
關(guān)于使用Knative時(shí)可能遇到的常見問題及對(duì)應(yīng)的解決方案,請(qǐng)參見Knative FAQ。