OpenFaaS 提供便捷的無伺服器函式佈署方式,尤其在 Kubernetes 和 Docker Swarm 環境中。本文將引導讀者使用 OpenFaaS CLI 建立一個 Go 函式,並探討建置、推播、佈署和呼叫的每個環節。同時,文章也涵蓋了自定義範本、設定監控儀錶板、理解自動擴充套件機制等進階主題,讓讀者能更全面地運用 OpenFaaS。透過實際操作範例和圖表,讀者可以更清晰地理解 OpenFaaS 的運作流程,並快速上手實作自己的無伺服器函式。

使用OpenFaaS建立與佈署Go語言函式的完整

OpenFaaS是一種流行的無伺服器框架,用於在Kubernetes或Docker Swarm上佈署函式。本章節將詳細介紹如何使用OpenFaaS CLI建立、建置、推播和佈署一個簡單的Go語言函式。

建立新函式

首先,我們使用faas-cli new命令來建立一個新的Go語言函式:

$ faas-cli new --lang=go hello

這個命令會從OpenFaaS範本倉函式庫下載必要的範本,並建立一個名為hello的函式目錄。成功執行後,我們可以看到以下輸出:

Function created in folder: hello
Stack file written: hello.yml

內容解密:

  1. faas-cli new命令用於建立新的函式。
  2. --lang=go引數指定函式使用Go語言。
  3. hello是函式的名稱,同時也是建立的目錄名稱。
  4. 命令執行過程中會下載OpenFaaS範本並進行初始化設定。

檢視函式目錄結構

建立函式後,我們可以使用tree命令檢視目錄結構:

$ tree -L2 .
.
├── hello
│   └── handler.go
├── hello.yml
└── template
    ├── csharp
    ├── go
    ├── go-armhf
    ├── node
    ├── node-arm64
    ├── node-armhf
    ├── python
    ├── python3
    ├── python-armhf
    └── ruby

內容解密:

  1. hello目錄包含函式的實作檔案handler.go
  2. hello.yml是函式的設定檔,定義了函式的相關資訊。
  3. template目錄包含不同語言的範本檔案。

分析hello.yml設定檔

hello.yml檔案定義了函式的組態:

provider:
  name: faas
  gateway: http://localhost:8080

functions:
  hello:
    lang: go
    handler: ./hello
    image: hello  # 應該修改為 <你的Docker ID>/hello:v1

內容解密:

  1. provider區塊定義了OpenFaaS的提供者資訊。
  2. functions區塊列出了所有的函式定義。
  3. hello函式使用Go語言,處理程式位於./hello目錄。
  4. image欄位指定了Docker映像檔的名稱,建議修改為包含你的Docker ID。

建置和推播函式

首先,我們需要修改hello.yml中的image欄位:

image: <你的Docker ID>/hello:v1

然後執行建置:

$ faas-cli build -f ./hello.yml

建置成功後,我們可以看到Docker映像檔已經建立:

Successfully built f3b8ec154ee9
Successfully tagged chanwit/hello:v1
Image: chanwit/hello:v1 built.

接著推播映像檔到Docker倉函式庫:

$ faas-cli push -f hello.yml

內容解密:

  1. faas-cli build命令根據hello.yml的定義建置函式。
  2. 建置過程中,faas-cli會使用Dockerfile來編譯和封裝函式。
  3. faas-cli push命令將建置好的映像檔推播到Docker倉函式庫。
  4. 推播過程中會將映像檔的分層上傳到倉函式庫。

佈署和呼叫函式

佈署函式:

$ faas-cli deploy -f hello.yml

佈署成功後,我們可以得到函式的呼叫URL:

Deployed.
URL: http://localhost:8080/function/hello

檢視所有已佈署的函式:

$ faas-cli list

呼叫函式:

$ echo "How are you?" | faas-cli invoke hello
Hello, Go. You said: How are you?

內容解密:

  1. faas-cli deploy命令佈署函式到OpenFaaS平台。
  2. 佈署過程中會建立函式的服務並啟動容器。
  3. faas-cli list命令列出所有已佈署的函式及其呼叫次數。
  4. faas-cli invoke命令用於呼叫函式並傳遞輸入資料。

隨著無伺服器技術的發展,OpenFaaS將繼續改進其功能和效能。未來可能會出現更多改進,例如:

  1. 更好的多語言支援
  2. 更強大的監控和日誌功能
  3. 更簡化的佈署流程

開發者應該持續關注OpenFaaS的最新發展,以充分利用其提供的功能。

安全性考量

在佈署函式時,需要注意以下安全事項:

  1. 使用安全的Docker映像檔來源
  2. 定期更新基礎映像檔
  3. 限制函式的許可權
  4. 使用安全的輸入驗證機制

透過這些措施,可以提高函式的安全性,防止潛在的安全風險。

參考資料

  1. OpenFaaS官方檔案:https://docs.openfaas.com/
  2. Go語言官方檔案:https://golang.org/doc/
  3. Docker官方檔案:https://docs.docker.com/

這些資源提供了更詳細的資訊,可以幫助開發者深入瞭解相關技術。

  graph LR
A[建立函式] --> B[建置函式]
B --> C[推播映像檔]
C --> D[佈署函式]
D --> E[呼叫函式]

圖表翻譯: 此圖示展示了使用OpenFaaS開發函式的主要流程:

  1. 建立函式:使用faas-cli建立新的函式
  2. 建置函式:編譯和封裝函式
  3. 推播映像檔:將建置好的映像檔上傳到倉函式庫
  4. 佈署函式:將函式佈署到OpenFaaS平台
  5. 呼叫函式:測試和呼叫已佈署的函式

這個流程展示了從開發到佈署的完整過程。

詳細程式碼解析

以下是一個簡單的Go語言函式範例:

package function

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func Handle(req []byte) string {
    return fmt.Sprintf("Hello, Go. You said: %s", string(req))
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        defer r.Body.Close()
        body, err := ioutil.ReadAll(r.Body)
        if err != nil {
            log.Printf("Error reading body: %v", err)
            http.Error(w, "can't read body", http.StatusBadRequest)
            return
        }
        
        response := Handle(body)
        w.Write([]byte(response))
    })
    
    log.Fatal(http.ListenAndServe(":8080", nil))
}

內容解密:

  1. Handle函式是函式的主要邏輯實作。
  2. main函式設定了HTTP伺服器來處理請求。
  3. 使用ioutil.ReadAll讀取請求內容。
  4. 將請求內容傳遞給Handle函式處理。
  5. 將處理結果寫回HTTP回應。

這個範例展示了一個簡單的HTTP伺服器實作,用於處理函式呼叫。

效能最佳化建議

  1. 使用適當的錯誤處理機制
  2. 最佳化HTTP伺服器的組態
  3. 使用連線池技術
  4. 減少不必要的記憶體分配

透過這些最佳化措施,可以提高函式的效能和效率。

OpenFaaS 範本客製化與監控儀錶板設定

OpenFaaS 提供了一系列預定義的範本,方便開發者快速建立函式。不過,當需求變得複雜時,瞭解如何自定義範本就變得非常重要。本章節將以 Go 語言範本為例,示範如何簡化建置步驟。

自定義 OpenFaaS 範本

檢視原始範本 Dockerfile

首先,我們來看看 Go 範本的 Dockerfile,該檔案位於 template/go/Dockerfile。這個 Dockerfile 已經使用了多階段建置技術:

###################
# Stage 0
###################
FROM golang:1.8.3-alpine3.6
# ... 省略部分指令
###################
# Stage 1
###################
FROM alpine:3.6
RUN apk --no-cache add ca-certificates
# 新增非 root 使用者
RUN addgroup -S app && adduser -S -g app app && \
    mkdir -p /home/app && \
    chown app /home/app
WORKDIR /home/app
COPY --from=0 /go/src/handler/handler .
COPY --from=0 /usr/bin/fwatchdog .
USER app
ENV fprocess="./handler"
CMD ["./fwatchdog"]

範本結構與自定義

OpenFaaS 範本可以存放在自定義的 Git 倉函式庫中。範本倉函式庫的結構如下:

$ tree .
.
├── README.md
└── template
    └── go
        ├── Dockerfile
        ├── function
        │   └── handler.go
        ├── main.go
        ├── README.md
        └── template.yml

將自定義範本存放在 GitHub 倉函式庫後,可以使用 faas-cli template pull 命令下載:

$ faas-cli template pull https://github.com/chanwit/faas-templates
Fetch templates from repository: https://github.com/chanwit/faas-templates
2017/11/16 15:44:46 HTTP GET https://github.com/chanwit/faas-templates/archive/master.zip
2017/11/16 15:44:48 Writing 2Kb to master.zip
2017/11/16 15:44:48 Attempting to expand templates from master.zip
2017/11/16 15:44:48 Fetched 1 template(s) : [go] from https://github.com/chanwit/faas-templates
2017/11/16 15:44:48 Cleaning up zip file...

下載自定義範本後,可以重新建置函式並減少建置步驟至 15 步:

$ faas-cli build -f hello.yml
[0] > Building: hello.
Clearing temporary build folder: ./build/hello/
Preparing ./hello/ ./build/hello/function
Building: chanwit/hello:v1 with go template. Please wait..
Sending build context to Docker daemon 7.68kB
Step 1/15 : FROM golang:1.8.3-alpine3.6
 ---> fd1ada53b403
...
Step 15/15 : CMD ./fwatchdog
 ---> Using cache
 ---> 23dfcc80a031
Successfully built 23dfcc80a031
Successfully tagged chanwit/hello:v1
Image: chanwit/hello:v1 built.
[0] < Builder done.

內容解密:

上述指令展示瞭如何使用 faas-cli 下載自定義範本並建置函式。透過自定義範本,開發者可以簡化建置流程並滿足特定需求。

OpenFaaS 監控儀錶板設定

啟動 Grafana 服務

要使用 OpenFaaS 儀錶板,需要在相同的網路下啟動 Grafana 服務。可以使用以下命令啟動 Grafana:

$ docker service create --name=grafana \
  --network=func_functions \
  -p 3000:3000 grafana/grafana

啟動後,可以在 http://localhost:3000 存取 Grafana 並使用預設帳號 admin 及密碼 admin 登入。

組態 Prometheus 資料來源

  1. 在 Grafana 中新增資料來源,名稱必須為 prometheus
  2. 將 URL 設為 http://prometheus:9090
  3. 點選 Save & Test 按鈕,若設定正確將顯示綠色提示。

匯入 OpenFaaS 儀錶板

  1. 使用儀錶板 ID 3434 匯入 OpenFaaS 儀錶板。
  2. 在匯入過程中選擇 prometheus 作為資料來源。

匯入後,儀錶板將顯示閘道器健康狀態、函式呼叫統計等資訊。

內容解密:

Grafana 儀錶板的設定使我們能夠即時監控 OpenFaaS 的執行狀態。透過 Prometheus 收集的資料,可以有效地觀察函式呼叫次數、閘道器健康狀態等關鍵指標。

OpenFaaS 自動擴充套件機制

OpenFaaS 的自動擴充套件機制依賴於 Prometheus 及 Alert Manager。當函式呼叫次數達到預設閾值時,Alert Manager 會觸發事件,通知 OpenFaaS 調整函式副本數量。

自動擴充套件流程

  1. 使用者透過 API 閘道器呼叫函式。
  2. 呼叫記錄被存入 Prometheus。
  3. Alert Manager 根據預定義規則觸發事件。
  4. OpenFaaS Alert Handler 接收事件並計算所需的副本數量。
  5. 透過 Docker Swarm API 調整函式副本數量。

內容解密:

自動擴充套件機制確保了 OpenFaaS 函式能夠根據實際負載動態調整資源,有效提升系統的彈性與效能。

練習題

  1. 使用 OpenFaaS 的優點有哪些?
  2. 描述 OpenFaaS 的架構及其元件之間的互動方式。
  3. 如何在 Docker Swarm 上佈署 OpenFaaS?
  4. 為什麼 OpenFaaS 使用多階段建置?
  5. 如何為 Node.js 建立新的 OpenFaaS 函式?
  6. 如何建置及封裝 OpenFaaS 函式?
  7. OpenFaaS 預設使用的 Overlay 網路名稱是什麼?
  8. 什麼是函式範本?它的用途是什麼?
  9. 描述如何準備自定義範本並將其託管在 GitHub 上。
  10. 如何為 OpenFaaS 定義 Grafana 儀錶板?

內容解密:

這些練習題旨在幫助讀者複習本章節的關鍵概念,包括 OpenFaaS 的架構、範本自定義、監控儀錶板設定及自動擴充套件機制。透過這些練習,讀者能夠更深入地理解 OpenFaaS 的運作原理及應用方法。

  graph LR
    D[D]
A[使用者呼叫函式] --> B[API 閘道器]
B --> C[Prometheus 記錄呼叫資料]
C --> D{Alert Manager 觸發事件}
D -->|是| E[OpenFaaS Alert Handler 調整副本數量]
E --> F[Docker Swarm 調整函式副本]

圖表翻譯: 此圖表展示了 OpenFaaS 的自動擴充套件流程。使用者呼叫函式後,Prometheus 會記錄呼叫資料。當資料達到預設閾值時,Alert Manager 觸發事件,通知 OpenFaaS Alert Handler 調整函式副本數量,最終由 Docker Swarm 執行調整操作。這個流程確保了系統能夠根據實際負載動態調整資源。