轉(zhuǎn)自:http://www.lxweimin.com/p/7d11d9e8792a
背景
faas是以函數(shù)為維度對(duì)外提供服務(wù),這句話怎么理解呢,畢竟普通的以api提供服務(wù)的微服務(wù)最終邏輯實(shí)現(xiàn)上也是函數(shù)。faas是一個(gè)函數(shù)對(duì)應(yīng)一個(gè)服務(wù)。不像微服務(wù),一個(gè)服務(wù)集中了多個(gè)對(duì)外提供服務(wù)的接口。可以理解為把包含多個(gè)接口的微服務(wù)拆分成多個(gè)函數(shù)服務(wù),每個(gè)函數(shù)就是一個(gè)單獨(dú)的進(jìn)程,單獨(dú)的鏡像 。微服務(wù)的問(wèn)題是,單服務(wù)中的接口中只要一個(gè)接口需要擴(kuò)容,那么其他流量較小的接口也會(huì)隨著微服務(wù)實(shí)例的擴(kuò)容而擴(kuò)容,造成資源的浪費(fèi),而faas以函數(shù)功能為維度的容器擴(kuò)容,只會(huì)正對(duì)這個(gè)接口的實(shí)例來(lái)擴(kuò)容。
安裝步驟
openfaas-cli
openfaas命令行工具,包括新函數(shù)服務(wù)的編譯,創(chuàng)建,調(diào)試等都可以通過(guò)該程序?qū)崿F(xiàn)。
curl -sL https://cli.openfaas.com | sh
namespace
會(huì)創(chuàng)建openfaas和openfaas-fn兩個(gè)namespace,前者是openfaas必要的組件的命名空間,后者就是功能函數(shù)的命名空間
git clone https://github.com/openfaas/faas-netes
cd faas-netes
kubectl apply -f namespaces.yml
password
管理頁(yè)面的用戶名和密碼的設(shè)置
$ 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
部署
如何部署不成功,鏡像下載不下來(lái),可以通過(guò)修改 /etc/docker/daemon.json,添加 "https://docker.mirrors.ustc.edu.cn/"如下。
[root@VM-228-105-centos faas]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"http://docker.oa.com:8080",
"http://csighub.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn/"
],
"insecure-registries": [
"mirrors.tencent.com",
"hub.oa.com",
"docker.oa.com:8080",
"csighub.tencentyun.com",
"bk.artifactory.oa.com:8080"
]
}
修改后執(zhí)行systemctl daemon-reload && systemctl restart docker
$ 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í)則正常部署成功
訪問(wèn)
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 是用來(lái)獲取主機(jī)信息的。
ocr
這個(gè) function 是用來(lái)做圖像識(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è)三方的庫(kù),在 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)的功能,這里說(shuō)明使用 golang 來(lái)時(shí)進(jìn)實(shí)現(xiàn)的方式,其他語(yǔ)言也是類似的。
初始化
創(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 文件是用來(lái)部署和上傳鏡像的
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 的地址,如果需要推送到私有倉(cāng)庫(kù)需要你手動(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
首次deploy,會(huì)提示登錄,使用faas-cli login --password 1 -g 127.0.0.1:31112
可以完成登錄
如果沒有問(wèn)題,那么在頁(yè)面上你就可以看到你自己的 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)行使用,而且支持各種語(yǔ)言進(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è)比較難得事情。
Q&A
- 函數(shù)服務(wù)在頁(yè)面的Status一直顯示為Not Ready,怎么解決?
執(zhí)行kubectl get pod -n openfaas-fn
,查看函數(shù)服務(wù)的pod是否正常啟動(dòng),使用kubectl describe ...
查看沒有啟動(dòng)的原因,如果是鏡像不存在,可以執(zhí)行kubectl edit
修改deployment的鏡像拉取策略為imagePullPolicy:IfNotPresent
參考文檔
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/
https://linux.cn/article-9078-1.html
</article>