Izgradnja našeg vlastitog servera zasnovanog na Fn

Izgradnja našeg vlastitog servera zasnovanog na Fn

Računanje bez servera je jedan od najistaknutijih trendova u računarstvu u oblaku. Osnovni princip rada je da infrastruktura nije briga DevOps-a, već provajdera usluga. Skaliranje resursa se automatski prilagođava učitavanju i ima visoku stopu promjene.

Još jedna uobičajena karakteristika je sklonost minimiziranju i fokusiranju koda, zbog čega se računarstvo bez servera ponekad naziva funkcija kao usluga (FaaS).

Istorijski gledano, prvi provajder oblaka koji je ponudio FaaS sa AWS Lambda bio je Amazon, otuda i ime. Drugi provajderi cloud usluga također nude slične:

  • Cloud funkcije od Googlea
  • Azure funkcije iz Microsofta

Sve ove kompanije pružaju računarstvo bez servera, automatsko skaliranje i plaćaju samo ono što stvarno koristite, ali zaključavaju kupce u svoj vlasnički proizvod. Međutim, postoje besplatne i open source alternative za računarstvo bez servera. Vrijedi napomenuti:

  • Platforma Apache OpenWhisk, razvijen u inkubatoru od strane IBM-a,
  • Funkcije Spring Cloud, kao dio prilično bogatog Spring Framework ekosistema, koji se može koristiti i kao fasada za AWS Lambda, Azure Functions i OpenWhisk,
  • Projekat Fn, koju podržava Oracle.

Svi su potpuno nezavisni od oblaka, odnosno mogu se instalirati u bilo koji oblak, uključujući vaš, javni ili privatni, i naravno u Exoscale.

Kako funkcioniše projekat Fn

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

  • CLI program dizajniran za upravljanje svim aspektima Fn infrastrukture i interakciju sa Fn serverom,
  • Sam Fn server je obična aplikacija upakovana u Docker kontejner.

Funkcije raspoređene u Fn-u se također izvode u zasebnim kontejnerima, što vam omogućava da podržite mnogo programskih jezika, na primjer... Clojure!

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

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

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

  • Primjena funkcije pomoću Fn CLI: konfiguracijski fajl aplikacije za Fn kreira se na osnovu odabranog predloška.
  • Uvodimo sopstvenu funkciju, ponovo koristeći CLI Fn: slika kontejnera se postavlja u određeno spremište, nakon čega se server obaveštava o postojanju i postavljanju ove slike.

Izgradnja našeg vlastitog servera zasnovanog na Fn
Princip isporuke funkcija Fn

Lokalna instalacija i testiranje funkcija bez servera

Počnimo s instaliranjem Fn na lokalnoj mašini. Prvo, instaliramo Docker, kako to zahtijeva Fn. Ovo pretpostavlja da smo na Debian/Ubuntu:

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

Ili koristite paket menadžer/Docker build prema vašem sistemu. Zatim možete ići direktno na instalaciju Fn CLI. Na primjer, koristeći curl:

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

Ako ste na OSX-u s instaliranim Homebrew-om, 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 koristeći CLI. Radi jednostavnosti, koristić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.

Novi direktorij će biti kreiran hellonode da dalje razvijamo našu Fn funkciju s nekim osnovnim konfiguracijskim datotekama. Unutar novokreiranog direktorija možete kreirati svoju aplikaciju slijedeći standarde odabranog jezika ili vremena izvršavanja:

# Каталог с 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 kreira početnu strukturu projekta, kreira 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 lokalno testirati našu funkciju da vidimo kako sve funkcionira.

Prvo ćemo pokrenuti Fn server. Kao što je već spomenuto, Fn server je Docker kontejner, 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 mora biti “razvedena”. Ovo zahteva имя приложения: U Fn, sve aplikacije moraju biti specificirane kao prostori imena za povezane funkcije.

Fn CLI će tražiti datoteku func.yaml u trenutnom direktoriju koji će se koristiti za konfiguraciju funkcije. Dakle, prvo trebate 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, kreira se nova slika Docker kontejnera koja sadrži našu funkciju. Funkcija je spremna za pozivanje i imamo dva načina da to učinimo:

  • koristeći komandu Fn invoke
  • pozivanje direktno putem http

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

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

{"message":"Hello World"}

Da biste direktno pozvali funkciju, morate znati puni URL:

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

{"message":"Hello World"}

Fn server izlaže svoje funkcije na portu 8080 i izgleda da URL funkcije odgovara uzorku t/app/function, ali ne u potpunosti. Preko HTTP-a funkcija se ne poziva direktno, već preko takozvanog okidača, koji, prema svom nazivu, „pokreće“ poziv funkcije. Okidači su definisani u `func.yml projekat:

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 ime okidača tako da odgovara imenu funkcije, ovo će sve pojednostaviti:

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

Zatim ponovo pokrećemo isporuku funkcije i pozivamo je iz 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 eksperimente punog opsega i objavimo naš FaaS na serveru!

Instaliranje servisa funkcija bez servera na vlastitu infrastrukturu

Hajde da brzo instaliramo virtuelnu mašinu koristeći Exoscale CLI. Ako ga još niste podesili, možete ga koristiti naš vodič za brzi početak. Ovo je super alat koji će još više povećati vašu produktivnost. Ne zaboravite da morate konfigurirati pravilo za otvaranje porta 8080 u Sigurnosnoj grupi! Sljedeće naredbe će pokrenuti čistu virtuelnu mašinu, spremnu za hostovanje 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 ssh u virtuelnu mašinu i instalirati udaljeni Fn server:

$ 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 server na isti način kao što je već urađeno na lokalnoj mašini, pokrenite server:

$ 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 server koristit ćemo naredbu deploy sa lokalnog računara izostavljanjem zastavice --local.

Osim toga, Fn zahtijeva da navedete lokaciju Fn servera i Docker registra. Ove opcije se mogu postaviti preko varijabli okruženja FN_API_URL и FN_REGISTRY respektivno, ali nudi i pogodniji način za jednostavno upravljanje kreiranjem i upravljanjem konfiguracijama za implementaciju.

U Fn terminima, konfiguracija za implementaciju se zove context. Sljedeća naredba će kreirati 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 kreiran ovako:

 $ fn use context exoscale

 Now using context: exoscale

Od sada pa nadalje, isporuka funkcije Fn će preuzimati Docker slike koristeći odabrani DockerHub račun (u mom slučaju - nfrankel), a zatim obavijestite udaljeni server (u ovom primjeru - http://185.19.30.175:8080) o lokaciji 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"}

Izgradnja našeg vlastitog servera zasnovanog na Fn
Životni ciklus funkcije u računarstvu bez servera zasnovanom na Fn-u

Prednosti računarstva bez servera u vlastitom kapacitetu

Računarstvo bez servera je zgodno rješenje za brzu implementaciju nezavisnih dijelova aplikacije koji su u interakciji sa složenijim aplikacijama ili mikroservisima.

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

Multi-cloud i hibridne cloud arhitekture takođe trpe u ovom slučaju, jer se lako možete naći u situaciji da biste želeli da koristite računarstvo bez servera, 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, uz malo dodatnih troškova. Eliminiše bilo kakvo zaključavanje dobavljača i može se instalirati lokalno ili u bilo kojem prikladnom dobavljaču rješenja u oblaku po vašem izboru. Postoji i sloboda u izboru programskog jezika.

Ovaj članak pokriva samo osnove Fn-a, ali kreiranje vlastitog vremena izvođenja je prilično jednostavno, a cjelokupna arhitektura se može širiti korištenjem Fn balansera opterećenja ili postavljanjem Fn iza proxyja radi zaštite.

izvor: www.habr.com

Kupite pouzdan hosting za sajtove sa DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster