前言
serverless 大環(huán)境下出現(xiàn)了 faas,即 function as a service,函數(shù)即服務(wù);其意思也非常好理解,就是能將一個(gè)函數(shù)作為一個(gè)服務(wù)進(jìn)行使用,用戶只需要編寫一個(gè)函數(shù)功能即可,不需要額外去關(guān)心別的東西。https://github.com/openfaas/faas 是其中的一種實(shí)現(xiàn)方式。
環(huán)境準(zhǔn)備
以下環(huán)境在 mac 上進(jìn)行搭建:
首先需要準(zhǔn)備 docker 和 kubernetes 的環(huán)境,先做 k8s 的環(huán)境直接能通過 docker 桌面進(jìn)行配置,已經(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
# 當(dāng)全部啟動(dòng)時(shí)則正常部署成功
訪問
http://127.0.0.1:31112
admin/admin123
使用
openfaas 默認(rèn)帶有一些可以部署的 function
nodeinfo


點(diǎn)擊 deploy 之后等待狀態(tài) ready 之后就可以進(jìn)行使用了,點(diǎn)擊 invoke 進(jìn)行調(diào)用,這個(gè) function 是用來獲取主機(jī)信息的。
ocr

這個(gè) function 是用來做圖像識(shí)別的
還有其他很多自帶的 function 都可以試試,這里不再列舉了
qrcode
其實(shí)很多 function 的實(shí)現(xiàn)是非常簡(jiǎn)單的,如這個(gè)生成二維碼的 function,使用 go 實(shí)現(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)
}
其實(shí)就是調(diào)用了一個(gè)三方的庫,在 main 函數(shù)中從 std 讀如參數(shù),然后將結(jié)果輸出到 stdout 中就可以了,就其實(shí)和我們普通寫的函數(shù)一模一樣。
實(shí)現(xiàn)function
那么如何自己實(shí)現(xiàn)一個(gè) function 并注冊(cè)使用呢?其實(shí)也很簡(jiǎn)單,現(xiàn)在 faas-cli 工具已經(jīng)提供了相關(guān)的功能,這里說明使用 golang 來時(shí)進(jìn)實(shí)現(xiàn)的方式,其他語言也是類似的。
初始化
創(chuàng)建一個(gè)空目錄,在空目錄下使用 faas-cli 命令進(jìn)行初始化
faas-cli new hellofaas --lang go
這樣你就能得到一個(gè)基礎(chǔ)的功能目錄
hellofaas 文件夾中包含一個(gè) go 文件,這個(gè)文件就是你需要自己實(shí)現(xiàn)的 function,里面是一個(gè) http 請(qǐng)求的 handle,接受一個(gè)參數(shù),返回一個(gè)字符串,函數(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 的地址,如果需要推送到私有倉庫需要你手動(dòng)進(jìn)行登錄操作
構(gòu)建、推送、部署
剩下就很簡(jiǎn)單了,三個(gè)命令,構(gòu)建時(shí)間可能會(huì)長(zhǎng)一些,拉取鏡像比較緩慢
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 了

當(dāng)然你也可以這樣調(diào)用:
echo test | faas-cli invoke hellofaas --gateway http://127.0.0.1:31112
總結(jié)
其實(shí)對(duì)于 faas 的使用還算簡(jiǎn)單,并沒有想象中的那么復(fù)雜,它的實(shí)現(xiàn)方式也比較符合我的想法,作為一個(gè)鏡像進(jìn)行打包進(jìn)行輸出進(jìn)行使用,而且支持各種語言進(jìn)行實(shí)現(xiàn),也不失為一種比較好的實(shí)現(xiàn)策略吧。
我覺得更多的是 function 的這樣的思想,讓我們要意識(shí)到,什么樣類型的功能能被抽離為一個(gè) function ,并且這個(gè)的 function 是否應(yīng)該有業(yè)務(wù)屬性,以及它作為一個(gè) service 的定義是什么,這我覺得是我們應(yīng)該考慮的。因?yàn)樗茌p,輕的東西就容易多,多的東西就不好管控,所以控制方面也應(yīng)該做考慮。
總之要認(rèn)清它的目標(biāo)和使用場(chǎng)景還是一個(gè)比較難得事情。
參考文檔
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/