Serverless 工程實踐|自建 Apache OpenWhisk 平臺

阿里巴巴雲原生發表於2021-11-01

作者 | 劉宇(江昱)

前言:OpenWhisk 是一個開源、無伺服器的雲平臺,可以在執行時容器中通過執行擴充套件的程式碼響應各種事件,而無須使用者關心相關的基礎設施架構。

OpenWhisk 簡介

OpenWhisk 是基於雲的分散式事件驅動的程式設計服務。OpenWhisk 提供一種程式設計模型,將事件處理程式註冊到雲服務中,以處理各種不同的服務。其可以支援數千觸發器和呼叫,可以對不同規模的事件進行響應。

OpenWhisk 是由許多元件構建的,這些元件讓 OpenWhisk 成為一款優秀的開源 FaaS 平臺。

1.png
Apache OpenWhisk 元件結構

OpenWhisk 部署

實驗機器作業系統為 Ubuntu 18.04 Desktop。使用 GitHub 上所提供的 incubator-openwhisk 進行安裝,如果本機沒有安裝 Git,需要先安裝 Git:

apt install git

接下來克隆 repo 到本地目錄:

git clone https://github.com/apache/incubator-openwhisk.git openwhisk

克隆完成之後,顯示如圖所示。

2.png
Apache OpenWhisk 專案 Clone

進入 OpenWhisk 目錄,並且執行指令碼。OpenWhisk 是由 Scala 開發的,執行需要安裝 Java 環境。下面的指令碼實現了 Java 環境的安裝,以及其他的所需要的軟體:

cd openwhisk && cd tools/ubuntu-setup && ./all.sh

Apache OpenWhisk 安裝配置如圖所示。

3.png
Apache OpenWhisk 安裝配置

OpenWhisk 使用 ansible 進行部署,環境變數定義在 ansible/environments/group_vars/all 下:

limits:
invocationsPerMinute: "{{ limit_invocations_per_minute | default(60) }}"
concurrentInvocations: "{{ limit_invocations_concurrent | default(30) }}"
concurrentInvocationsSystem:  "{{ limit_invocations_concurrent_system | default
    (5000) }}"
firesPerMinute: "{{ limit_fires_per_minute | default(60) }}"
sequenceMaxLength: "{{ limit_sequence_max_length | default(50) }}"

上面程式定義了 OpenWhisk 在系統中的限制。

  • invocationsPerMinute 表示同一個 Namespace 每分鐘呼叫 Action 的數量。
  • concurrentInvocations 表示同一個 Namespace 的併發呼叫數量。
  • concurrentInvocationsSystem 表示系統中所有 Namespace 的併發呼叫數量。
  • firesPerMinute 表示同一個 Namespace 中每分鐘呼叫 Trigger 的數量。
  • sequenceMaxLength 表示 Action 的最大序列長度。

如果需要修改上述的預設值,可以把修改後的值新增到檔案 ansible/environments/local/group_vars/all 的末尾。例如,Action 的最大序列長度為 100,可以將 sequenceMaxLength: 120 新增到檔案的末尾。

接下來,為 OpenWhisk 配置一個持久儲存的資料庫,有 CouchDB 和 Cloudant 可選。以 CouchDB 為例,配置環境:

export OW_DB=CouchDB
export OW_DB_USERNAME=root
export OW_DB_PASSWORD=PASSWORD
export OW_DB_PROTOCOL=http
export OW_DB_HOST=172.17.0.1
export OW_DB_PORT=5984

在 openwhisk/ansible 目錄下,執行指令碼,如圖所示。

ansible-playbook -i environments/local/ setup.yml

4.png
執行指令碼過程

接下來使用 CouchDB 部署 OpenWhisk,確保本地已經有了 db_local.ini。在 openwhisk/ 目錄下執行部署命令:

./gradlew distDocker

如果部署過程中出現問題(如下圖所示),可能是沒有安裝 npm 導致的,此時可以執行如下指令。

5.png
部署過程可能報錯示例

apt install npm

稍等片刻,可以看到 Build 成功頁面,如圖所示。

6.png
Build 成功示例

接下來進入 openwhisk/ansible 目錄:

ansible-playbook -i environments/local/ couchdb.yml
ansible-playbook -i environments/local/ initdb.yml
ansible-playbook -i environments/local/ wipe.yml
ansible-playbook -i environments/local/ apigateway.yml
ansible-playbook -i environments/local/ openwhisk.yml
ansible-playbook -i environments/local/ postdeploy.yml

執行指令碼過程如圖所示。

7.png
圖片執行指令碼過程

部署成功後,OpenWhisk 會在系統中啟動幾個 Docker 容器。我們可以通過 docker ps 來檢視:

docker ps --format "{{.Image}} \t {{.Names }}"

安裝成功後的容器列表如圖所示。

8.png
安裝成功後的容器列表

開發者工具

OpenWhisk 提供了一個統一的命令列介面 wsk。生成的 wsk 在 openwhisk/bin 下。其有兩個屬性需要配置。

  • API host 用於部署 OpenWhisk 的主機名或 IP 地址的 API。
  • Authorization key(使用者名稱或密碼)用來授權操作 OpenWhisk 的 API。

設定 API host,在單機配置中的 IP 應該為 172.17.0.1,如圖所示。

./bin/wsk property set --apihost '172.17.0.1'

9.png
設定 API host

設定 key:

./bin/wsk property set --auth `cat ansible/files/auth.guest

許可權設定如圖所示。

10.png
圖片設定許可權

OpenWhisk 將 CLI 的配置資訊儲存在 ~/.wskprops 中。這個檔案的位置也可以通過環境變數 WSK_CONFIG_FILE 來指定。

驗證 CLI:

wsk action invoke /whisk.system/utils/echo –p message hello –result
{
    "message": "hello"
}

體驗測試

建立簡單的動作(action),程式碼如下:

# test.py
def main(args):
    num = args.get("number", "30")
    return {"fibonacci": F(int(num))}
def F(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return F(n - 1) + F(n - 2)

建立動作:

/bin/wsk action create myfunction ./test.py  --insecure

函式建立如圖所示。
11.png
建立函式

觸發動作:

./bin/wsk -i action invoke myfunction --result --blocking --param nember 20

得到結果,如圖所示。

12.png
執行函式

至此,我們完成了 OpenWhisk 專案的部署以及測試。

相關文章