前言
serverless 大環(huán)境下出現(xiàn)了 faas闷旧,即 function as a service磷蛹,函數(shù)即服務算撮;其意思也非常好理解,就是能將一個函數(shù)作為一個服務進行使用亿柑,用戶只需要編寫一個函數(shù)功能即可邢疙,不需要額外去關(guān)心別的東西。https://github.com/openfaas/faas 是其中的一種實現(xiàn)方式望薄。
環(huán)境準備
以下環(huán)境在 mac 上進行搭建:
首先需要準備 docker 和 kubernetes 的環(huán)境秘症,先做 k8s 的環(huán)境直接能通過 docker 桌面進行配置,已經(jīng)算是很方便了式矫。
安裝步驟
openfaas-cli
curl -sL https://cli.openfaas.com | sh
namespace
git clone https://github.com/openfaas/faas-netes
cd faas-netes
kubectl apply -f namespaces.yml
password
$ cat passwd.sh
# PASSWORD=$(head -c 12 /dev/urandom | sha1sum |cut -d' ' -f1)
PASSWORD=admin123
echo $PASSWORD > passwd
kubectl -n openfaas create secret generic basic-auth \
--from-literal=basic-auth-user=admin \
--from-literal=basic-auth-password="$PASSWORD"
$ sh ./passwd.sh
部署
$ kubectl apply -f ./yaml
$ kubectl get pods -n openfaas --watch
? ~ kubectl get pods -n openfaas
NAME READY STATUS RESTARTS AGE
alertmanager-7dd959fd86-stslk 1/1 Running 0 3h30m
basic-auth-plugin-85649fd6fc-4xlph 1/1 Running 0 3h30m
faas-idler-f4597f655-6c4nb 1/1 Running 2 3h30m
gateway-7c579bc859-cpm6g 2/2 Running 1 3h30m
nats-8455bfbb58-gq2vh 1/1 Running 0 3h30m
prometheus-86f7fdf9b5-jtb6q 1/1 Running 0 3h30m
queue-worker-c6d788779-xl6d2 1/1 Running 0 3h30m
# 當全部啟動時則正常部署成功
訪問
http://127.0.0.1:31112
admin/admin123
使用
openfaas 默認帶有一些可以部署的 function
nodeinfo
點擊 deploy 之后等待狀態(tài) ready 之后就可以進行使用了乡摹,點擊 invoke 進行調(diào)用,這個 function 是用來獲取主機信息的采转。
ocr
這個 function 是用來做圖像識別的
還有其他很多自帶的 function 都可以試試聪廉,這里不再列舉了
qrcode
其實很多 function 的實現(xiàn)是非常簡單的,如這個生成二維碼的 function故慈,使用 go 實現(xiàn)板熊,代碼如下
package main
import (
"encoding/binary"
"io/ioutil"
"log"
"os"
qrcode "github.com/skip2/go-qrcode"
)
func main() {
input, err := ioutil.ReadAll(os.Stdin)
if err != nil {
log.Fatalf("Unable to read standard input: %s", err.Error())
}
png, err := qrcode.Encode(string(input), qrcode.Medium, 256)
if err != nil {
log.Fatalf("Unable to read standard input: %s", err.Error())
}
binary.Write(os.Stdout, binary.LittleEndian, png)
}
其實就是調(diào)用了一個三方的庫,在 main 函數(shù)中從 std 讀如參數(shù)察绷,然后將結(jié)果輸出到 stdout 中就可以了干签,就其實和我們普通寫的函數(shù)一模一樣。
實現(xiàn)function
那么如何自己實現(xiàn)一個 function 并注冊使用呢拆撼?其實也很簡單容劳,現(xiàn)在 faas-cli 工具已經(jīng)提供了相關(guān)的功能,這里說明使用 golang 來時進實現(xiàn)的方式闸度,其他語言也是類似的竭贩。
初始化
創(chuàng)建一個空目錄,在空目錄下使用 faas-cli 命令進行初始化
faas-cli new hellofaas --lang go
這樣你就能得到一個基礎的功能目錄
hellofaas 文件夾中包含一個 go 文件莺禁,這個文件就是你需要自己實現(xiàn)的 function留量,里面是一個 http 請求的 handle,接受一個參數(shù),返回一個字符串楼熄,函數(shù)中你可以實現(xiàn)你自己的邏輯功能忆绰。
package function
import (
"fmt"
)
// Handle a serverless request
func Handle(req []byte) string {
return fmt.Sprintf("Hello, Go. You said: %s", string(req))
}
配置鏡像參數(shù)
hellofaas.yml 文件是用來部署和上傳鏡像的
version: 1.0
provider:
name: openfaas
gateway: http://127.0.0.1:31112
functions:
hellofaas:
lang: go
handler: ./hellofaas
image: linkinstar/hellofaas:latest
其中需要修改的是 gateway 為你自己的 faas 部署地址
然后就是 images 是你 docker hub 的地址,如果需要推送到私有倉庫需要你手動進行登錄操作
構(gòu)建可岂、推送较木、部署
剩下就很簡單了,三個命令青柄,構(gòu)建時間可能會長一些,拉取鏡像比較緩慢
faas-cli build -f hellofaas.yml
faas-cli push -f hellofaas.yml
faas-cli deploy -f hello.yml --gateway http://127.0.0.1:31112
如果沒有問題预侯,那么在頁面上你就可以看到你自己的 function 了
當然你也可以這樣調(diào)用:
echo test | faas-cli invoke hellofaas --gateway http://127.0.0.1:31112
總結(jié)
其實對于 faas 的使用還算簡單致开,并沒有想象中的那么復雜,它的實現(xiàn)方式也比較符合我的想法萎馅,作為一個鏡像進行打包進行輸出進行使用双戳,而且支持各種語言進行實現(xiàn),也不失為一種比較好的實現(xiàn)策略吧糜芳。
我覺得更多的是 function 的這樣的思想飒货,讓我們要意識到,什么樣類型的功能能被抽離為一個 function 峭竣,并且這個的 function 是否應該有業(yè)務屬性塘辅,以及它作為一個 service 的定義是什么,這我覺得是我們應該考慮的皆撩。因為它很輕扣墩,輕的東西就容易多,多的東西就不好管控扛吞,所以控制方面也應該做考慮呻惕。
總之要認清它的目標和使用場景還是一個比較難得事情。
參考文檔
https://www.lanqiao.cn/library/kubernetes-handbook/usecases/openfaas-quick-start/
https://cloud.tencent.com/developer/article/1681551
http://www.liangxiaolei.fun/2020/06/11/k8s%E7%AC%94%E8%AE%B0-serverless-openfaas%E4%BD%93%E9%AA%8C/