ProHoster > Blog > uprava > 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,
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.
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:
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 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:
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:
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:
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 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 .
Ž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.