
— jedna od najistaknutijih tendencija u oblaku. Osnovni princip rada je da infrastruktura više nije briga DevOps-a, već dobavljača usluga. Skaliranje resursa automatski se prilagođava opterećenju i ima visoku brzinu promjene.
Druga zajednička karakteristika je tendencija minimizacije i fokusiranja koda, zbog čega se serverless računarstvo ponekad naziva "funkcija kao usluga" (FaaS).
Istorijski, prvi dobavljač oblaka koji je ponudio FaaS bio je Amazon sa AWS Lambda, odakle je i potekao taj naziv. Drugi dobavljači oblaka takođe nude analoge:
- Cloud Functions od Google-a
- Azure Functions od Microsoft-a
Sve ove kompanije pružaju serverless računarstvo, automatsko skaliranje i naplatu samo za stvarno korištene resurse, ali pritom vežu klijente za svoj proprietarni proizvod. Ipak, postoje besplatne alternative sa otvorenim kodom za organizaciju serverless računarstva. Treba napomenuti:
- Platformu , koju razvija IBM u svom inkubatoru,
- , kao deo bogate ekosustava Spring Framework-a, koja se može koristiti i kao fasada za AWS Lambda, Azure Functions i OpenWhisk,
- , koji podržava Oracle.
Svi su nezavisni od oblaka, to jest mogu se instalirati u bilo koji oblak, uključujući vaš vlastiti, javni ili privatni, i naravno u Exoscale.
Kako je projekt Fn organizovan
Fn se potpuno oslanja na Docker, sastoji se od dva glavna komponenta:
- CLI program koji upravlja svim aspektima infrastrukture Fn i komunicira sa serverom Fn,
- I sam server Fn, obična aplikacija pakovana u kontejner za Docker.
Funkcije raspoređene u Fn takođe se izvršavaju u odvojenim kontejnerima, što omogućava podršku za veliki broj programskih jezika, na primer… Clojure!
Argumenti funkcija se prenose na standardni ulaz (STDIN), a rezultati se pišu na standardni izlaz (STDOUT). Ako argumenti ili vraćene vrednosti nisu jednostavne vrednosti (naprimjer, JSON objekat) — mogu se transformisati pomoću sloja apstrakcije koji pruža sam Fn u obliku kompleta za razvoj funkcija (FDK).
Radi praktičnosti dostupni su ugrađeni setovi predložaka koji olakšavaju implementaciju FaaS-a na opsežnom popisu raznih jezika i njihovih verzija (Go, različite verzije Jave, Python itd.).
Jednostavno je stvoriti FaaS slijedeći ovu shemu:
- Implementiramo funkciju pomoću CLI Fn: stvara se konfiguracijska datoteka aplikacije za Fn, koja se temelji na odabranom predlošku.
- Objavljujemo vlastitu funkciju, ponovno pomoću CLI Fn: slika spremnika se stavlja u neki repozitorij, nakon čega se poslužitelj obavještava o postojanju i lokaciji te slike.

Princip isporuke funkcija u Fn
Lokalna instalacija i testiranje bezservernih funkcija
Započnimo s instalacijom Fn na lokalnom računalu. Prvo instaliramo Docker, kako to zahtijeva Fn. Pretpostavljamo da koristimo Debian/Ubuntu:
$ sudo apt-get update
$ sudo apt-get install docker.ioIli koristite paketni menadžer/izgradnju Dockera sukladno vašem sustavu. Zatim možemo odmah preći na instalaciju Fn CLI. Na primjer, pomoću cURL-a:
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | shAko radite na OSX-u s instaliranim Homebrew-om, možete ići drugim putem:
$ brew install fn
==> Preuzimanje https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Preuzimanje s https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Sipanje fn-0.5.8.high_sierra.bottle.tar.gz
/usr/local/Cellar/fn/0.5.8: 5 datoteka, 16.7MBSada je sve spremno za inicijalnu implementaciju naše funkcije koristeći CLI. Radi jednostavnosti, koristit ćemo ugrađeno okruženje za pokretanje, na primjer Node:
$ fn init --runtime node --trigger http hellonode
Stvaranje funkcije na: /hellonode
Generiran predložak funkcije.
func.yaml stvoren.Bit će stvoren novi direktorij hellonode za daljnji razvoj naše Fn funkcije s nekim osnovnim konfiguracijskim datotekama. Unutar novo stvorenog direktorija možete stvoriti svoju aplikaciju koja slijedi standarde odabranog jezika ili okruženja 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.javaFn stvara početnu strukturu projekta, stvara datoteku func.yaml, koja sadrži potrebne postavke za Fn, i postavlja predložak za kod na jeziku koji ste odabrali.
U slučaju Node okruženja, 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 kako bismo vidjeli kako sve funkcionira.
Za početak pokrećemo Fn server. Kao što je već rečeno, Fn server je Docker kontejner, stoga će se nakon pokretanja preuzeti slika iz Docker repozitorija.
$ fn start -d # pokrećemo lokalni server u pozadini
Nema lokalne slike 'fnproject/fnserver:latest'
latest: Preuzimanje iz fnproject/fnserver
ff3a5c916c92: Preuzimanje završeno
1a649ea86bca: Preuzimanje završeno
ce35f4d5f86a: Preuzimanje završeno
...
Status: Preuzeta novija slika za fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5Za pokretanje naše funkcije, potrebno je "izvršiti" je. Za to je potrebno ime aplikacije: u Fn-u sve aplikacije moraju biti definirane kao prostori imena za povezane funkcije.
Fn CLI će pretražiti datoteku func.yaml u trenutnom direktoriju koja će se koristiti za konfiguraciju funkcije. Dakle, prvo se treba prebaciti u naš direktorij hellonode.
$ cd hellonode
$ fn deploy --app fnexo --local # izvršavamo funkciju lokalno, ime aplikacije - fnexo.
# parametar local ne učitava sliku u udaljeni repozitorij,
# pokreće je direktno
Implementiranje hellonode u aplikaciju: fnexo
Povećana na verziju 0.0.2
Gradnja slike nfrankel/hellonode:0.0.3 .
Ažuriranje funkcije hellonode koristeći sliku nfrankel/hellonode:0.0.3...
Uspešno stvorena aplikacija: fnexo
Uspešno stvorena funkcija: hellonode sa nfrankel/hellonode:0.0.3
Uspešno stvoren okidač: hellonode-triggerKao što se može videti iz izlaza komande, stvara se nova slika kontejnera za Docker koja sadrži našu funkciju. Funkcija je spremna za pozivanje, a imamo dva načina da to učinimo:
- koristeći komandu Fn
invoke - pozivajući direktno kroz
http
Poziv invoke putem Fn samo emulira HTTP rad za testiranje, što je praktično za brzu proveru:
$ fn invoke fnexo hellonode # pozivamo funkciju hellonode aplikacije fnexo
{"message":"Hello World"}Da bismo pozvali funkciju direktno, potrebno je znati punu URL adresu:
$ curl http://localhost:8080/t/fnexo/hellonode-trigger
{"message":"Hello World"}Fn server pruža funkcije preko porta 8080, i, čini se, URL funkcije odgovara šemi t/app/function, ali ne u potpunosti. Putem HTTP-a funkcija se ne poziva direktno, već putem takozvanog okidača, koji prema svom imenu "pokreće" poziv funkcije. Okidači se definišu u `func.yml projekta:
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 okidačaMožemo promeniti ime okidača tako da odgovara imenu funkcije, što će sve pojednostaviti:
triggers:
- name: hellonode-trigger
type: http
source: /hellonode # odgovara imenu funkcijeZatim ponovno pokrećemo implementaciju 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 funkcioniše! Idealno je vreme da pređemo na stvarne eksperimente i objavimo naš FaaS na serveru!
Instalacija servisa bezservernih funkcija na sopstvenoj infrastrukturi
Hajde da brzo postavimo virtuelnu mašinu koristeći CLI Exoscale. Ako je još niste konfigurisali — možete se poslužiti . To je sjajan alat koji dodatno povećava vašu produktivnost. Ne zaboravite da postavite pravilo za otvaranje porta 8080 u Security Group! Sledeće komande pokrenuće čistu virtuelnu mašinu, spremnu za smeštaj 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-securitygroupZatim se možete ulogovati putem ssh na virtuelnu mašinu i instalirati udaljeni server Fn:
$ exo ssh fn-server
Autentičnost hosta '185.19.30.175 (185.19.30.175)' ne može biti utvrđena.
ECDSA ključni otisak je SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Da li ste sigurni da želite da nastavite povezivanje (da/ne)? da
Upozorenje: Trajno je dodat '185.19.30.175' (ECDSA) na listu poznatih hostova.
Dobrodošli u Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)Zatim instaliramo Docker i server Fn, kao što je već urađeno na lokalnoj mašini, pokrećemo 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.643Fn je spreman za primanje funkcija! Za ciljani prenos funkcija na udaljeni server koristićemo komandu deploy sa lokalnog računara, preskočivši flag --local.
Pored toga, Fn zahteva da se navedu adrese servera Fn i Docker registra. Ovi parametri mogu biti postavljeni putem promenljivih okruženja FN_API_URL i FN_REGISTRY odgovarajuće, ali se takođe predlaže i jednostavniji način za lako upravljanje kreiranjem i upravljanjem konfiguracijama za razmeštanje.
U terminima Fn, konfiguracija za razmeštanje naziva se kontekst. Sledeća komanda će kreirati kontekst:
$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankelMožete pregledati dostupne kontekste ovako:
$ fn list contexts
CURRENT NAME PROVIDER API URL REGISTRY
default default http://localhost:8080/
exoscale default http://185.19.30.175:8080 nfrankel
A da se prebacite na kontekst koji je upravo kreiran, ovako:
$ fn use context exoscale
Sada se koristi kontekst: exoscaleOd ovog mjesta, isporuka Fn funkcija će učitati Docker slike koristeći odabrani račun na DockerHubu (u mom slučaju — nfrankel), nakon čega će obavijestiti udaljeni poslužitelj (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 . # izvodi se na lokalnoj mašini iz direktorija hellonode
Implementacija funkcije na: /.
Implementacija hellonode u aplikaciju: fnexo
Povećana verzija na 0.0.5
Gradnja slike nfrankel/hellonode:0.0.5 .Na kraju:
$ curl http://185.19.30.175:8080/t/fnexo/hellonode
{"message":"Hello World"}
Životni ciklus funkcije u serverless računanju temeljenom na Fn
Prednosti serverless računalstva na vlastitim resursima
Serverless računarstvo je praktično rješenje za brzo implementiranje neovisnih dijelova aplikacija koji interagiraju s složenijim aplikacijama ili mikroservisima.
Često je to povezano s skrivenim troškovima vezivanja za odabranog pružatelja, što, ovisno o specifičnom slučaju korištenja i volumenu, može dovesti do viših troškova i smanjene fleksibilnosti u budućnosti.
Višekratna i hibridna cloud arhitektura također trpe u takvim slučajevima, jer lako može doći do situacije kada bi se htjela koristiti serverless računarstva, ali zbog korporativne politike to može biti nemoguće.
Fn je dovoljno jednostavan za korištenje, može pružiti gotovo isti FaaS sučelje, s malim troškovima. Oslobađa se svih veza s pružateljima, može se instalirati lokalno ili kod bilo kojeg povoljno odabranog pružatelja cloud rješenja. Također postoji sloboda u odabiru jezika programiranja.
U članku su predstavljeni samo temelji Fn, ali izrada vlastitog okruženja za izvršavanje je dovoljno jednostavna, a cjelokupnu arhitekturu je moguće proširiti korištenjem Fn ravnoteživača opterećenja ili smještanjem Fn iza proksija radi zaštite.
Izvor: habr.com
