基於Fn來建構我們自己的Serverless

基於Fn來建構我們自己的Serverless

無伺服器計算 ——雲端運算最引人注目的趨勢之一。其基本營運原則是,基礎設施不再由 DevOps 負責,而由服務提供者負責。資源擴展會根據負載自動調整,變化率很高。

另一個常見特徵是傾向於最小化和集中程式碼,這就是為什麼無伺服器運算有時被稱為「函數即服務」(FaaS)。

從歷史上看,第一個透過 AWS Lambda 提供 FaaS 的雲端服務供應商是亞馬遜,因此得名。其他雲端服務供應商也提供類似的產品:

  • Google 的雲端功能
  • Microsoft 的 Azure Functions

所有這些公司都提供無伺服器運算、自動擴展和按需付費的定價模式,但它們將客戶鎖定在其專有產品中。不過,也有一些免費的開源無伺服器運算替代方案。值得注意的是:

  • 平台 Apache OpenWhisk由 IBM 在孵化器中開發,
  • Spring Cloud 函數作為豐富的 Spring Framework 生態系統的一部分,它也可以用作 AWS Lambda、Azure Functions 和 OpenWhisk 的外觀,
  • Fn 項目,由 Oracle 支援。

它們都是完全與雲端無關的,這意味著它們可以安裝在任何雲端中,包括您自己的雲端、公有雲或私有雲,當然還有 Exoscale。

Fn 計畫的運作方式

Fn 完全基於 Docker,由兩個主要元件組成:

  • CLI 程式旨在管理 Fn 基礎設施的各個方面並與 Fn 伺服器交互,
  • Fn 伺服器本身是一個打包在 Docker 容器中的常規應用程式。

Fn 中部署的函數也在單獨的容器中執行,這使我們能夠支援相當多的程式語言,例如…Clojure!

函數參數傳遞到標準輸入 (STDIN),結果寫入標準輸出 (STDOUT)。如果參數或傳回值不是簡單的值(例如 JSON 物件),則可以使用 Fn 本身以函數開發工具包 (FDK) 形式提供的抽象層進行轉換。

為了方便起見,我們提供了內建模板集,以便於在各種不同語言及其版本(Go、不同版本的 Java、Python 等)中部署 FaaS。

建立 FaaS 很容易,請按照以下圖表操作:

  • 使用 Fn CLI 部署功能:這將根據所選範本為 Fn 建立應用程式設定檔。
  • 我們推出自己的功能,再次使用 CLI Fn:將容器鏡像放置在某個儲存庫中,然後通知伺服器該映像的存在和位置。

基於Fn來建構我們自己的Serverless
Fn 中提供函數的原理

在本地安裝和測試無伺服器功能

讓我們開始在本機上安裝 Fn。首先,我們需要安裝 Fn 所需的 Docker。這裡假設我們位於… Debian/Ubuntu:

$ sudo apt-get update
$ sudo apt-get install docker.io

或使用適合您系統的套件管理器/Docker 建置。然後您可以直接安裝 Fn CLI。例如,使用 curl:

$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

如果您使用的是安裝了 Homebrew 的 OSX,則可以採取不同的方法:

$ brew install fn

==> Downloading https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Pouring fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 files, 16.7MB

現在,我們準備好使用 CLI 來初步部署我們的函數。為了簡單起見,我們將使用內建運行時,例如 Node:

$ fn init --runtime node --trigger http hellonode

Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.

將建立一個新目錄。 hellonode 使用一些基本的設定檔來進一步開發我們的 Fn 函數。在新建立的目錄中,您可以按照所選語言或運行時的標準建立應用程式:

# Каталог с node выглядит так:

   hellonode
   ├── func.js
   ├── func.yaml
   └── package.json

# Свежеустановленное окружение Java11 такое:

   hellojava11
   ├── func.yaml
   ├── pom.xml
   └── src
       ├── main
       │   └── java
       │       └── com
       │           └── example
       │               └── fn
       │                   └── HelloFunction.java
       └── test
           └── java
               └── com
                   └── example
                       └── fn
                           └── HelloFunctionTest.java

Fn 建立初始專案結構,建立文件 func.yaml,其中包含 Fn 的必要設置,並為您選擇的語言的程式碼設定模板。

對於 Node 運行時來說,這意味著:

$ cat hellonode/func.js

const fdk=require('@fnproject/fdk');

fdk.handle(function(input){
  let name = 'World';
  if (input.name) {
    name = input.name;
  }
  return {'message': 'Hello ' + name}
})

現在我們將在本地快速測試我們的功能以查看一切如何運作。

首先,我們啟動 Fn 伺服器。如前所述,Fn 伺服器是一個 Docker 容器,因此啟動後它會從 Docker 映像倉庫中取得映像。

$ fn start -d                    # запускаем локальный сервер в фоне

Unable to find image 'fnproject/fnserver:latest' locally
latest: Pulling from fnproject/fnserver
ff3a5c916c92: Pull complete
1a649ea86bca: Pull complete
ce35f4d5f86a: Pull complete

...

Status: Downloaded newer image for fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5

要啟動我們的功能,我們需要「推出」。這需要 имя приложения:在 Fn 中,所有應用程式都必須指定為相關功能的命名空間。

Fn CLI 將搜尋文件 func.yaml 在目前目錄中,這將用於配置函數。因此,首先我們需要前往我們的目錄 hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # выкатываем функцию локально, имя приложения - fnexo.
                                 # параметр local не заливает образ в удаленный реестр,
                                 # запуская его напрямую

Deploying hellonode to app: fnexo
Bumped to version 0.0.2
Building image nfrankel/hellonode:0.0.3 .
Updating function hellonode using image nfrankel/hellonode:0.0.3...
Successfully created app:  fnexo
Successfully created function: hellonode with nfrankel/hellonode:0.0.3
Successfully created trigger: hellonode-trigger

從命令輸出可以看到,一個包含我們函數的新 Docker 容器映像被建立了。該函數已準備好被調用,我們有兩種方法可以做到這一點:

  • 使用 Fn 指令 invoke
  • 直接透過 http

通話 invoke via Fn 只是模擬透過 HTTP 進行測試,方便快速檢查:

$ fn invoke fnexo hellonode      # вызываем функцию hellonode приложения fnexo

{"message":"Hello World"}

要直接呼叫函數,您需要知道完整的 URL:

$ curl http://localhost:8080/t/fnexo/hellonode-trigger

{"message":"Hello World"}

Fn 伺服器在連接埠 8080 上公開其函數,而函數 URL 似乎與該方案匹配 t/app/function,但並非完全如此。透過 HTTP,函數並非直接調用,而是透過所謂的觸發器調用,顧名思義,觸發器會「啟動」函數調用。觸發器的定義如下: `func.yml 專案:

schema_version: 20180708
name: hellonode
version: 0.0.3
runtime: node
entrypoint: node func.js
format: json
triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode-trigger    # URL триггера

我們可以更改觸發器名稱以匹配函數名稱,這將使事情變得更容易:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # совпадает с именем функции

然後我們再次運行函數傳遞並從新的觸發器調用它:

$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode

{"message":"Hello World"}

一切正常!現在是時候進行實際實驗並在伺服器上發布我們的 FaaS 了!

在您自己的基礎架構上安裝無伺服器功能服務

讓我們使用 Exoscale CLI 快速設定虛擬機器。如果您尚未設置,可以使用 我們的快速入門指南。這是一個很酷的工具,可以進一步提高您的工作效率。 不要忘記在安全群組中設定規則來開啟連接埠 8080! 以下命令將啟動一個乾淨的虛擬機器來承載我們的功能:

$ exo firewall create fn-securitygroup
$ exo firewall add fn-securitygroup ssh --my-ip
$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0/0
$ exo vm create fn-server -s fn-securitygroup

然後就可以透過ssh登入虛擬機,安裝遠端Fn伺服器了:

$ exo ssh fn-server

The authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.
ECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

然後我們按照和本機上相同的方式安裝Docker和Fn伺服器,並啟動伺服器:

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo systemctl start docker
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
$ sudo fn start

...

    ______
   / ____/___
  / /_  / __ 
 / __/ / / / /
/_/   /_/ /_/
    v0.3.643

Fn 已準備好接收函數!為了將函數定向傳輸到遠端伺服器,我們將使用以下命令 deploy 從本地計算機,省略標誌 --local.

此外,Fn 需要您指定 Fn 伺服器和 Docker 映像倉庫的位置。這些參數可以透過環境變數設定。 FN_API_URL и FN_REGISTRY 而且還提供了更便捷的方式來輕鬆管理部署配置的建立和管理。

在 Fn 術語中,部署配置稱為 context以下命令將建立一個上下文:

$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankel

您可以像這樣查看可用的上下文:

$ fn list contexts

CURRENT NAME      PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

並切換到剛剛建立的上下文,如下所示:

 $ fn use context exoscale

 Now using context: exoscale

從這裡開始,Fn 函數交付將使用 DockerHub 上選定的帳戶下載 Docker 映像(在我的情況下, nfrankel),然後通知遠端伺服器(在本例中, http://185.19.30.175:8080)有關包含您的特徵的最新圖像的位置和版本。

$ fn deploy --app fnexo .   # выполняется на локальной машине из каталога hellonode

Deploying function at: /.
Deploying hellonode to app: fnexo
Bumped to version 0.0.5
Building image nfrankel/hellonode:0.0.5 .

最後:

$ curl http://185.19.30.175:8080/t/fnexo/hellonode

{"message":"Hello World"}

基於Fn來建構我們自己的Serverless
基於 Fn 的無伺服器運算中的函數生命週期

本地無伺服器運算的優勢

無伺服器運算是一種便捷的解決方案,可快速實現與更複雜的應用程式或微服務互動的應用程式的獨立部分。

這通常是由於鎖定選定供應商的隱性成本造成的,根據特定的用例和數量,這可能會導致未來成本更高、靈活性更低。

在這種情況下,多雲和混合雲架構也會受到影響,因為您很容易發現自己想要使用無伺服器運算,但由於公司政策,這可能無法實現。

Fn 使用起來非常方便,可以提供與 FaaS 幾乎相同的接口,而且開銷很小。它消除了任何供應商鎖定,您可以本地安裝,也可以選擇任何方便的雲端服務供應商。程式語言的選擇也非常自由。

本文僅介紹 Fn 的基礎知識,但創建自己的運行時相當簡單,並且可以透過使用 Fn 負載平衡器或將 Fn 置於代理程式後面進行保護來進一步擴展整體架構。

來源: www.habr.com

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster