
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 , razvijen u inkubatoru od strane IBM-a,
- , kao dio prilično bogatog Spring Framework ekosistema, koji se može koristiti i kao fasada za AWS Lambda, Azure Functions i OpenWhisk,
- , 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.

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.ioIli 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 | shAko 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.7MBSada 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.javaFn 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
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5Da 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-triggerKao š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 . 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-securitygroupZatim 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.643Fn 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 nfrankelDostupne 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: exoscaleOd 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"}
Ž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
