Izrada našeg vlastitog servera bez poslužitelja na temelju Fn

Izrada našeg vlastitog servera bez poslužitelja na temelju Fn

Računalstvo bez poslužitelja je jedan od najistaknutijih trendova u računalstvu u oblaku. Osnovno načelo rada je da infrastruktura nije briga DevOpsa, već pružatelja usluga. Skaliranje resursa automatski se prilagođava opterećenju i ima visoku stopu promjene.

Druga zajednička značajka je tendencija minimiziranja i fokusiranja koda, zbog čega se računalstvo bez poslužitelja ponekad naziva funkcija kao usluga (FaaS).

Povijesno gledano, prvi pružatelj usluga u oblaku koji je ponudio FaaS s AWS Lambda bio je Amazon, otuda i naziv. Drugi pružatelji usluga u oblaku također nude slične:

  • Googleove funkcije u oblaku
  • Azure funkcije iz Microsofta

Sve te tvrtke pružaju računalstvo bez poslužitelja, automatsko skaliranje i plaćaju samo ono što stvarno koristite, ali zaključavaju kupce na svoj vlastiti proizvod. Međutim, postoje besplatne alternative otvorenog koda za računalstvo bez poslužitelja. Ne vrijedi ništa:

  • Platforma Apache OpenWhisk, razvijen u inkubatoru od strane IBM-a,
  • Proljetne funkcije oblaka, kao dio prilično bogatog Spring Framework ekosustava, koji se može koristiti i kao fasada za AWS Lambda, Azure Functions i OpenWhisk,
  • Projekt Fn, uz podršku Oraclea.

Svi oni potpuno su neovisni o oblacima, odnosno mogu se instalirati u bilo koji oblak, pa i svoj, javni ili privatni, te naravno u Exoscale.

Kako funkcionira projekt Fn

Fn se u potpunosti temelji na Dockeru, sastoji se od dvije glavne komponente:

  • CLI program dizajniran za upravljanje svim aspektima Fn infrastrukture i interakciju s Fn poslužiteljem,
  • Sam Fn poslužitelj je obična aplikacija upakirana u Docker kontejner.

Funkcije raspoređene u Fn-u također se izvode u zasebnim spremnicima, što vam omogućuje podršku za mnogo programskih jezika, na primjer... Clojure!

Argumenti funkcije prosljeđuju se na standardni ulaz (STDIN), rezultati se zapisuju na standardni izlaz (STDOUT). Ako argumenti ili povratne vrijednosti nisu jednostavne vrijednosti (kao što je JSON objekt), mogu se pretvoriti pomoću sloja apstrakcije koji pruža sam Fn u obliku kompleta za razvoj funkcija (FDK).

Radi praktičnosti, ponuđeni su ugrađeni skupovi predložaka koji olakšavaju implementaciju FaaS-a na opsežnom popisu različitih jezika i njihovih verzija (Go, različite verzije Jave, Python, itd.).

Stvaranje FaaS-a jednostavno je slijedeći ovaj dijagram:

  • Implementacija funkcije pomoću Fn CLI: konfiguracijska datoteka aplikacije za Fn kreirana je na temelju odabranog predloška.
  • Uvodimo vlastitu funkciju, opet pomoću CLI Fn: slika spremnika se postavlja u određeno spremište, nakon čega se poslužitelj obavještava o postojanju i postavljanju te slike.

Izrada našeg vlastitog servera bez poslužitelja na temelju Fn
Princip isporuke funkcija Fn

Lokalna instalacija i testiranje funkcija bez poslužitelja

Počnimo instalirati Fn na lokalnom računalu. Prvo se instalira Docker, prema zahtjevu Fn. Pod pretpostavkom da smo na Debian/Ubuntu:

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

Ili upotrijebite paket upravitelja/Docker izgradnju prema vašem sustavu. Zatim možete odmah prijeći na instalaciju Fn CLI. Na primjer, pomoću curl:

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

Ako ste na OSX-u s instaliranim Homebrewom, možete ići drugim putem:

$ 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

Sada smo spremni za početnu implementaciju naše funkcije pomoću CLI-ja. Radi jednostavnosti, koristit ćemo ugrađeno okruženje za pokretanje, kao što je Node:

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

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

Stvorit će se novi imenik hellonode za daljnji razvoj naše funkcije Fn s nekim osnovnim konfiguracijskim datotekama. Unutar novostvorenog direktorija možete izraditi svoju aplikaciju prema standardima odabranog jezika ili vremena izvođenja:

# Каталог с 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 stvara početnu strukturu projekta, stvara datoteku func.yaml, koji sadrži potrebne postavke za Fn, i postavlja predložak za kod na jeziku koji ste odabrali.

U slučaju vremena izvođenja čvora, to znači:

$ 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}
})

Sada ćemo brzo testirati našu funkciju lokalno da vidimo kako sve radi.

Prvo ćemo pokrenuti Fn poslužitelj. Kao što je već spomenuto, Fn poslužitelj je Docker spremnik, stoga će nakon pokretanja otići i uzeti sliku iz Docker registra.

$ 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

Da bismo pokrenuli našu funkciju, ona se mora "razviti". Ovo zahtijeva имя приложения: U Fn, sve aplikacije moraju biti navedene kao prostori imena za povezane funkcije.

Fn CLI će tražiti datoteku func.yaml u trenutnom direktoriju koji će se koristiti za konfiguriranje funkcije. Dakle, prvo morate otići u naš imenik 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

Kao što možete vidjeti iz izlaza naredbe, stvorena je nova slika Docker spremnika koja sadrži našu funkciju. Funkcija je spremna za pozivanje, a imamo dva načina da to učinimo:

  • pomoću naredbe Fn invoke
  • zovete izravno putem http

poziv invoke putem Fn jednostavno emulira rad putem HTTP-a za testove, što je zgodno za brzo testiranje:

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

{"message":"Hello World"}

Kako biste izravno pozvali funkciju, morate znati puni URL:

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

{"message":"Hello World"}

Fn poslužitelj izlaže svoje funkcije na priključku 8080 i čini se da URL funkcije odgovara uzorku t/app/function, ali ne u potpunosti. Preko HTTP-a funkcija se ne poziva izravno, već putem takozvanog okidača koji, prema svom nazivu, “pokreće” poziv funkcije. Okidači su definirani u `func.yml projekt:

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 триггера

Možemo promijeniti naziv okidača da odgovara nazivu funkcije, ovo će sve pojednostaviti:

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

Zatim ponovno pokrećemo isporuku funkcije i pozivamo je s novog okidača:

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

{"message":"Hello World"}

Sve radi! Vrijeme je da prijeđemo na potpune eksperimente i objavimo naš FaaS na poslužitelju!

Instaliranje usluga funkcije bez poslužitelja na vlastitu infrastrukturu

Brzo instalirajmo virtualni stroj koristeći Exoscale CLI. Ako ga još niste postavili, možete koristiti naš vodič za brzi početak. Ovo je super alat koji će još više povećati vašu produktivnost. Ne zaboravite da trebate konfigurirati pravilo za otvaranje priključka 8080 u Sigurnosnoj grupi! Sljedeće naredbe pokrenut će čisti virtualni stroj, spreman za ugošćavanje naših funkcija:

$ 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

Zatim možete pristupiti ssh-om u virtualni stroj i instalirati udaljeni Fn poslužitelj:

$ 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)

Zatim instalirajte Docker i Fn poslužitelj na isti način kao što je već učinjeno na lokalnom računalu, pokrenite poslužitelj:

$ 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 je spreman za primanje funkcija! Za ciljani prijenos funkcija na udaljeni poslužitelj koristit ćemo naredbu deploy s lokalnog računala izostavljanjem oznake --local.

Osim toga, Fn zahtijeva da navedete lokaciju Fn poslužitelja i Docker registra. Ove se opcije mogu postaviti putem varijabli okoline FN_API_URL и FN_REGISTRY respektivno, ali nudi i praktičniji način za jednostavno upravljanje stvaranjem i upravljanjem konfiguracijama za implementaciju.

U terminima Fn, poziva se konfiguracija za implementaciju context. Sljedeća naredba će stvoriti kontekst:

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

Dostupne kontekste možete pogledati ovako:

$ fn list contexts

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

I prebacite se na kontekst koji je upravo stvoren ovako:

 $ fn use context exoscale

 Now using context: exoscale

Odavde će isporuka značajke Fn preuzeti Docker slike pomoću odabranog DockerHub računa (u mom slučaju - nfrankel), a zatim obavijestite udaljeni poslužitelj (u ovom primjeru - http://185.19.30.175:8080) o mjestu i verziji najnovije slike koja sadrži vašu funkciju.

$ 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 .

Konačno:

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

{"message":"Hello World"}

Izrada našeg vlastitog servera bez poslužitelja na temelju Fn
Životni ciklus funkcije u računalstvu bez poslužitelja temeljenom na Fn-u

Prednosti računalstva bez poslužitelja u vlastitom kapacitetu

Računalstvo bez poslužitelja prikladno je rješenje za brzu implementaciju neovisnih dijelova aplikacije koji su u interakciji sa složenijim aplikacijama ili mikroservisima.

To je često zbog skrivenih troškova vezanosti za odabranog dobavljača, što, ovisno o specifičnom slučaju upotrebe i količini, može dovesti do viših troškova i smanjene fleksibilnosti u budućnosti.

Multi-cloud i hibridne cloud arhitekture također trpe u ovom slučaju, jer se lako možete naći u situaciji da želite koristiti serverless computing, ali zbog korporativnih politika to možda neće biti moguće.

Fn je prilično jednostavan za korištenje i može pružiti gotovo isto FaaS sučelje, s malo troškova. Eliminira bilo kakvo zaključavanje dobavljača i može se instalirati lokalno ili u bilo kojem prikladnom pružatelju rješenja u oblaku po vašem izboru. Postoji i sloboda u odabiru programskog jezika.

Ovaj članak pokriva samo osnove Fn-a, ali stvaranje vlastitog vremena izvođenja prilično je jednostavno, a ukupna arhitektura može se primijeniti šire koristeći Fn balanser opterećenja ili postavljanjem Fn-a iza proxyja radi zaštite.

Izvor: www.habr.com

Dodajte komentar