Veidojam savu serverless risinājumu, balstoties uz Fn

Veidojam savu serverless risinājumu, balstoties uz Fn

Serverless skaitļoÅ”ana — viena no izteiktākajām tendencēm mākoņskaitļoÅ”anā. Pamata darbÄ«bas princips ir tāds, ka infrastruktÅ«ra ir pakalpojumu sniedzēju rÅ«pe, nevis DevOps speciālistu. Resursu mērogoÅ”ana automātiski pielāgojas slodzei un ir ar augstu izmaiņu ātrumu.

Vēl viena kopÄ«ga iezÄ«me ir tendence minimizēt un koncentrēt kodu, tāpēc serverless skaitļoÅ”anu reizēm sauc par "funkcija kā pakalpojumu" (FaaS).

Vēsturiskā ziņā pirmais mākoņpakalpojumu sniedzējs, kurÅ” piedāvāja FaaS ar AWS Lambda, bija Amazon, no kurienes arÄ« radies Å”is nosaukums. Citi mākoņpakalpojumu sniedzēji piedāvā lÄ«dzÄ«gas alternatÄ«vas:

  • Google Cloud Functions
  • Microsoft Azure Functions

Visas Ŕīs kompānijas piedāvā serverless skaitļoÅ”anu, automātisku mērogoÅ”anu un maksāŔanu tikai par faktiski izmantotajiem resursiem, bet tajā paŔā laikā piesaista klientus savam patentētajam produktam. Tomēr pastāv bezmaksas alternatÄ«vas ar atvērtā koda risinājumiem serverless skaitļoÅ”anai. Vērts pieminēt:

  • Platformu Apache OpenWhisk, kuru izstrādā IBM inkubators,
  • Spring Cloud Functions, kā daļu no diezgan bagātÄ«gas Spring Framework ekosistēmas, kuru var izmantot arÄ« kā AWS Lambda, Azure Functions un OpenWhisk saskarni,
  • Projektu Fn, kuru atbalsta Oracle.

Visi tie ir pilnÄ«gi neatkarÄ«gi no mākoņiem, t.i., tos var uzstādÄ«t jebkurā mākoņos, tostarp jÅ«su paÅ”u, publiskajā vai privātajā, un protams, Exoscale.

Kā ir izveidots projekts Fn

Fn pilnībā balstās uz Docker, sastāv no diviem galvenajiem komponentiem:

  • CLI programma, kas paredzēta, lai pārvaldÄ«tu visus Fn infrastruktÅ«ras aspektus, un mijiedarbojas ar Fn serveri,
  • Pats Fn servers, parasts lietojums, iepakots Docker konteinerā.

Funkcijas, kas izvietotas Fn, tiek izpildÄ«tas arÄ« atseviŔķos konteineros, kas ļauj atbalstÄ«t daudzus programmēŔanas valodas, piemēram… Clojure!

Funkciju argumenti tiek nodoti standarta ievadā (STDIN), rezultāti tiek rakstÄ«ti standarta izvadā (STDOUT). Ja argumenti vai atgriezamās vērtÄ«bas nav vienkārÅ”i vērtÄ«bas (piemēram, JSON objekts) — tās var tikt pārveidotas, izmantojot abstrahēŔanas slāni, ko nodroÅ”ina Fn kā funkciju izstrādes komplektu (FDK).

Lai atvieglotu darbu, tiek piedāvāti iebÅ«vēti veidņu komplekti, kas atvieglo FaaS izvērÅ”anu plaŔā dažādu valodu un to versiju sarakstā (Go, dažādas Java versijas, Python u.c.).

FaaS izveide ir vienkārÅ”a, sekojot Å”ai shēmai:

  • Izvietot funkciju, izmantojot CLI Fn: tiek izveidots lietojumprogrammas konfigurācijas fails Fn, pamatojoties uz izvēlēto veidni.
  • Izdojam savu funkciju, atkal izmantojot CLI Fn: konteineru attēls tiek ievietots kādā krātuvē, pēc tam serveris tiek informēts par attēla esamÄ«bu un izvietojumu.

Veidojam savu serverless risinājumu, balstoties uz Fn
Funkciju piegādes princips Fn

Lokālā uzstādīŔana un bezserveru funkciju testēŔana

Sāksim ar Fn uzstādīŔanu vietējā datorā. Vispirms ir jāinstalē Docker, kā to prasa Fn. Pieņemam, ka esam Debian/Ubuntu:

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

Vai nu izmantojiet pakotņu pārvaldnieku / Docker bÅ«vniecÄ«bu atbilstoÅ”i jÅ«su sistēmai. Pēc tam varat tieÅ”i pāriet uz Fn CLI uzstādīŔanu. Piemēram, izmantojot curl:

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

Ja strādājat ar OSX, kur ir uzstādīts Homebrew, varat doties citu ceļu:

$ brew install fn

==> Lejupielādē https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Lejupielādē no https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Tiek ielejots fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 faili, 16.7MB

Tagad viss ir gatavs, lai sākotnēji izvērstu mÅ«su funkciju, izmantojot CLI. Lai atvieglotu, mēs izmantosim iebÅ«vēto vidi palaiÅ”anai, piemēram, Node:

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

Izveido funkciju: /hellonode
Funkciju paraugs ģenerēts.
func.yaml izveidots.

Tiks izveidots jauns katalogs hellonode turpmākai mÅ«su Fn funkcijas attÄ«stÄ«bai ar dažiem pamatkonfigurācijas failiem. IekÅ” jaunizveidotā kataloga jÅ«s varat izveidot savu lietojumprogrammu, ievērojot izvēlētā valodas vai izpildes vides standartu:

# ŠšŠ°Ń‚Š°Š»Š¾Š³ с 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 izveido projekta sākotnējo struktÅ«ru, izveidojot failu func.yaml, kas satur nepiecieÅ”amās iestatīŔanas fn un nosaka veidni kodam valodā, kuru izvēlējāties.

Ja runājam par Node izpildlaiku, tas nozīmē:

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

Tagad mēs ātri pārbaudīsim mūsu funkciju lokāli, lai redzētu, kā viss darbojas.

Vispirms mēs palaidÄ«sim Fn serveri. Kā jau tika teikts, Fn servers ir Docker konteiners, tāpēc pēc palaiÅ”anas tas ņems attēlu no Docker reÄ£istra.

$ fn start -d                    # palaidīsim lokālo serveri fonā

Image 'fnproject/fnserver:latest' nav atrasts lokāli
latest: Velk no fnproject/fnserver
ff3a5c916c92: Velk pabeigts
1a649ea86bca: Velk pabeigts
ce35f4d5f86a: Velk pabeigts

...

Status: Lejupielādēts jaunāks attēls kā fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5

Lai palaistu mūsu funkciju, tai jābūt "izlaistai". Tam nepiecieŔams lietoŔanas nosaukums: Fn visām lietojumprogrammām jābūt noteiktām kā nosaukumu telpām saistītām funkcijām.

Fn CLI meklēs failu func.yaml paÅ”reizējā katalogā, kas tiks izmantots funkcijas konfigurēŔanai. Tāpēc vispirms jāpārslēdzas uz mÅ«su katalogu hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # izlaidīsim funkciju lokāli, lietojumprogrammas nosaukums - fnexo.
                                 # vietējais parametrs neieliek attēlu attālinātajā reģistrā,
                                 # palaidīsim to tieŔi

Izlaižot hellonode lietojumprogrammā: fnexo
Palielināts līdz versijai 0.0.2
Veido attēlu nfrankel/hellonode:0.0.3 .
Atjaunojam funkciju hellonode, izmantojot attēlu nfrankel/hellonode:0.0.3...
Veiksmīgi izveidota lietojumprogramma:  fnexo
Veiksmīgi izveidota funkcija: hellonode ar nfrankel/hellonode:0.0.3
Veiksmīgi izveidots triggers: hellonode-trigger

Kā var redzēt no komandas izvadē, tiek izveidots jauns Docker konteinera attēls, kas satur mūsu funkciju. Funkcija ir gatava vārdus saukt, un mums ir divi veidi, kā to izdarīt:

  • izmantojot Fn komandu invoke
  • izsaucot tieÅ”i caur http

Izsaukt invoke izmantojot Fn, vienkārÅ”i emulē HTTP darbu testiem, kas ir ērti ātrai pārbaudei:

$ fn invoke fnexo hellonode      # izsaucam funkciju hellonode lietojumprogrammā fnexo

{"message":"Hello World"}

Lai izsauktu funkciju tieŔi, jāzina pilns URL:

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

{"message":"Hello World"}

Fn servers piedāvā savas funkcijas caur 8080 portu, un, kā Ŕķiet, funkcijas URL atbilst shēmai t/app/function, bet ne pilnÄ«bā. Caur HTTP funkcija netiek izsaukta tieÅ”i, bet caur saukto izsistēju, kas, kā norāda nosaukums, "izsauc" funkciju. Izsistēji tiek noteikti `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    # Trigeru URL

Mēs varam mainīt trigeru nosaukumu, lai tas atbilstu funkcijas nosaukumam, tas atvieglos procesu:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # atbilst funkcijas nosaukumam

Pēc tam mēs vēlreiz palaižam funkcijas piegādi un izsaucam to no jauna trigera:

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

{"message":"Hello World"}

Viss strādā! Tagad ir īstais laiks veikt reālus eksperimentus un publicēt mūsu FaaS serverī!

Serverless funkciju pakalpojumu uzstādīŔana uz savas infrastruktūras

Ātri uzstādÄ«sim virtuālo maŔīnu, izmantojot Exoscale CLI. Ja jÅ«s to vēl neesat konfigurējis — varat izmantot mÅ«su ātrā palaiÅ”anas rokasgrāmatu. Tas ir lielisks rÄ«ks, kas vēl vairāk palielinās jÅ«su produktivitāti. Neaizmirstiet iestatÄ«t noteikumu, lai atvērtu 8080 portu droŔības grupā! Å ie komandas palaidÄ«s tÄ«ru virtuālo maŔīnu, kas gatava mÅ«su funkciju izvietoÅ”anai:

$ 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

Pēc tam varat piekļūt virtuālajai maŔīnai, izmantojot ssh, un uzstādÄ«t Fn atālināto serveri:

$ exo ssh fn-server

Hosta '185.19.30.175 (185.19.30.175)' autentiskums nevar tikt noteikts.
ECDSA atslēgas pirksta nospiedums ir SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Vai esat pārliecināts, ka vēlaties turpināt savienojumu (jā/nē)? jā
Brīdinājums: uz visiem laikiem pievienots '185.19.30.175' (ECDSA) zināmo hostu sarakstam.
Laipni lūdzam Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

Pēc tam uzstādām Docker un Fn serveri tāpat kā tas tika darÄ«ts uz vietējās maŔīnas, palaižam serveri:

$ 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 ir gatavs funkciju saņemÅ”anai! Lai funkcijas mērÄ·tiecÄ«gi nolasÄ«tu no attālinātā servera, izmantosim komandu deploy no vietējā datora, izslēdzot eglÄ«tes --local.

Turklāt Fn prasa norādÄ«t Fn servera un Docker reÄ£istra atraÅ”anās vietu. Å ie parametri var tikt iestatÄ«ti, izmantojot vides mainÄ«gos FN_API_URL un FN_REGISTRY atbilstoÅ”i, taču tiek piedāvāts arÄ« ērtāks veids, kā viegli pārvaldÄ«t konfigurāciju izveidi un pārvaldÄ«bu izvietoÅ”anai.

Fn terminoloģijā kontekstu izvietoŔanai sauc par context. Nākamā komanda izveidos kontekstu:

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

Jūs varat apskatīt pieejamos kontekstus Ŕādi:

$ fn list contexts

PAŠREIZĒJAIS NOSAUKUMS  PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

Un pārslēgties uz tikko izveidoto kontekstu ir Ŕādi:

 $ fn use context exoscale

 Tagad izmantojam kontekstu: exoscale

Sākot no Ŕīs vietas, Fn funkciju piegāde tiks ielādējusi Docker attēlus, izmantojot izvēlēto kontu DockerHub (manā gadÄ«jumā — nfrankel), pēc tam paziņojot attālinātajam serverim (Å”ajā piemērā — http://185.19.30.175:8080) par pēdējā attēla, kas satur jÅ«su funkciju, atraÅ”anās vietu un versiju.

$ fn deploy --app fnexo .   # izpildāms uz lokālās maŔīnas no hellonode direktorijas

Piegādā funkciju: /.
Piegāde hellonode uz lietotni: fnexo
Jums pieŔķirta versija 0.0.5
Būvējot attēlu nfrankel/hellonode:0.0.5 .

Visbeidzot:

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

{"message":"Hello World"}

Veidojam savu serverless risinājumu, balstoties uz Fn
Funkcijas dzīves cikls bezserveru skaitīŔanā, balstoties uz Fn

Bezserveru skaitīŔanas priekÅ”rocÄ«bas uz jÅ«su iespējām

Bezserveru skaitīŔana — ērts risinājums, lai ātri ieviestu neatkarÄ«gas lietojumprogrammas daļas, kas sadarbojas ar sarežģītākām lietojumprogrammām vai mikropakalpojumiem.

Bieži tas saistīts ar slēptām izmaksām, piesaistot izvēlētajam pakalpojumu sniedzējam, kas atkarībā no konkrētā pielietojuma un apjoma var novest pie augstākām izmaksām un samazinātas elastības nākotnē.

Multicloud un hibrÄ«das mākoņu arhitektÅ«ras arÄ« cieÅ” Ŕādā gadÄ«jumā, jo var viegli nonākt situācijā, kad vēlētos izmantot bezserveru skaitīŔanu, bet korporatÄ«vās politikas dēļ tas varētu bÅ«t neiespējami.

Fn ir pietiekami vienkārÅ”s lietoÅ”anā, var sniegt gandrÄ«z tādu paÅ”u FaaS interfeisu, ar nelielām izmaksām. Tas atbrÄ«vos no jebkādām piesaistēm pakalpojumu sniedzējiem, to var uzstādÄ«t lokāli vai pie jebkura ērtā mākoņu pakalpojumu sniedzēja pēc jÅ«su izvēles. Tāpat ir brÄ«vÄ«ba izvēlēties programmēŔanas valodu.

Rakstā ir aplÅ«kotas tikai Fn pamati, taču paÅ”a izpildes vides izveide ir diezgan vienkārÅ”a, un vispārējo arhitektÅ«ru var izplatÄ«t plaŔāk, izmantojot Fn slodzes balansētāju vai izvietojot Fn aiz proksi aizsardzÄ«bai.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster