歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
OpenFaaS實戰系列文章連結
- 部署
- 函式入門
- Java函式
- 模板操作(template)
- 大話watchdog
- of-watchdog(為效能而生)
- java11模板解析
- OpenFaaS實戰之八:自制模板(maven+jdk8)
- OpenFaaS實戰之九:終篇,自制模板(springboot+maven+jdk8)
本篇概覽
- 本文是《OpenFaaS實戰》系列的第二篇,在Kubernetes環境把OpenFaaS在搭建好之後,終於可以開始開發函式了;
- 本篇的主題是熟悉OpenFaaS的函式操作,包括:開發、部署、使用,demo函式使用的語言是python,因為簡單;
- demo函式本身並不複雜:一個加法程式,接收1,2,3這樣的字串,分割成三個數字1、2、3,將它們相加的結果返回;
- 提前把函式操作的流程捋捋,如下所示,後面會按照這個流程去執行:
graph TD
下載模板 --> 建立函式 --> 調整描述檔案,非必須 --> 函式功能編寫 --> 構建映象 --> 推送到倉庫 --> 部署函式 --> 使用函式
- 接下來,開始操作吧;
提醒
本文中的操作會用到工具faas-cli,前文已提到過此工具可以部署在任意電腦上,遠端連線OpenFaaS,請確保faas-cli所在機器上有docker服務,因為構建映象時會用到。
下載模板
- OpenFaaS官方提供了程式語言模板,執行命令faas-cli template pull,可以將最新模板下載到本地:
[root@node1 faas-template]# faas-cli template pull
Fetch templates from repository: https://github.com/openfaas/templates.git at master
2020/11/19 16:34:31 Attempting to expand templates from https://github.com/openfaas/templates.git
2020/11/19 16:34:45 Fetched 12 template(s) : [csharp dockerfile go java11 java11-vert-x node node12 php7 python python3 python3-debian ruby] from https://github.com/openfaas/templates.git
- 執行命令faas-cli new --list,得到模板列表如下,可見語言型別還是很豐富的:
[root@node1 faas-template]# faas-cli new --list
Languages available as templates:
- csharp
- dockerfile
- go
- java11
- java11-vert-x
- node
- node12
- php7
- python
- python3
- python3-debian
- ruby
- 執行以下命令即可建立函式,add是函式名,python是語言型別,bolingcavalry是docker映象名字的字首:
faas-cli new add --lang python -p bolingcavalry
- 控制檯提示如下:
[root@node1 faas-template]# faas-cli new add --lang python -p bolingcavalry
Folder: add created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|
Function created in folder: add
Stack file written: add.yml
- 當前目錄下,產生名為add的資料夾,以及名為add.yml的檔案;
- 先看add.yml,這是函式的描述檔案,本文中已經夠用了,無需修改:
version: 1.0
provider:
name: openfaas
gateway: http://192.168.133.187:31112
functions:
add:
lang: python
handler: ./add
image: bolingcavalry/add:latest
- 進入add資料夾,看到faas-cli幫我們生成的原始碼檔案handler.py,預設程式碼:
def handle(req):
"""handle a request to the function
Args:
req (str): request body
"""
return req
- 上述程式碼不符合我們們的需求,完全替換為以下內容:
def handle(req):
array = req.replace('\n', '').split(',')
rlt = 0
for i in array:
rlt += int(i)
return rlt
- 回到add.yml所在目錄,執行以下命令開始構建函式:
faas-cli build -f ./add.yml
- 如下所示,開始在本地構建docker映象,正常情況下可以構建成功:
Step 29/29 : CMD ["fwatchdog"]
---> Running in 94b3e80d0df2
Removing intermediate container 94b3e80d0df2
---> 5e6c22fa838d
Successfully built 5e6c22fa838d
Successfully tagged bolingcavalry/add:latest
Image: bolingcavalry/add:latest built.
[0] < Building add done in 62.81s.
[0] Worker done.
Total build time: 62.81s
- 檢視本地映象,確定是剛剛構建的:
[root@node1 faas-template]# docker images|grep add
bolingcavalry/add latest 5e6c22fa838d 4 minutes ago 88.4MB
關於OpenFaaS訪問映象
- 此時要關注的是K8S環境如何能訪問到此映象;
- 要注意的是OpenFaaS預設的映象拉取策略是Always,即每次都遠端拉取,所以映象必須放入倉庫,例如hub.docker.com、habor、registry等;(這個策略可以修改,不過本文中先不動它)
- 關於映象倉庫的知識就不在此展開,我這裡用的是hub.docker.com,因為我的ID是bolingcavalry,因此登入後執行docker push bolingcavalry/add:latest即可推送到遠端倉庫;
部署函式
- 執行部署命令faas-cli deploy -f add.yml,控制檯會提示部署成功,還會給出URL:
[root@node1 faas-template]# faas-cli deploy -f add.yml
Deploying: add.
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
Deployed. 202 Accepted.
URL: http://192.168.133.187:31112/function/add.openfaas-fn
- 如果K8S可以順利拉取到映象,就可以看到openfaas-fn這個namespace下新增了名為add-xxx的pod,且狀態正常:
[root@node1 faas-template]# kubectl get pods -n openfaas-fn
NAME READY STATUS RESTARTS AGE
add-5679bcd94c-vc9rw 1/1 Running 0 32m
nodeinfo-57fb768fb8-955tf 1/1 Running 0 104m
- 此時登入管理頁面,http://192.168.133.187:31112,可以看到新增的函式,也可以在頁面上驗證功能呼叫是否正常,如下圖:
- 也可以在其他電腦上發起請求測試,如下所示,函式可以正常服務:
[root@node1 ~]# curl http://192.168.133.187:31112/function/add -X POST -d '1,2,3,4,5,6'
21
至此,OpenFaaS環境下的函式基本操作的實戰就完成了,接下來的文章會繼續深入OpenFaaS,瞭解它更多強大的能力;
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos