Veidojot savu bezserveru, pamatojoties uz Fn

Veidojot savu bezserveru, pamatojoties uz Fn

Bezservera skaitļoÅ”ana ir viena no redzamākajām mākoņdatoÅ”anas tendencēm. DarbÄ«bas pamatprincips ir tāds, ka infrastruktÅ«ra nav DevOps, bet pakalpojumu sniedzēja rÅ«pes. Resursu mērogoÅ”ana automātiski pielāgojas slodzei, un tai ir augsts izmaiņu ātrums.

Vēl viena izplatÄ«ta iezÄ«me ir tendence samazināt un fokusēt kodu, tāpēc bezservera skaitļoÅ”anu dažreiz sauc par funkciju kā pakalpojumu (FaaS).

Vēsturiski pirmais mākoņa pakalpojumu sniedzējs, kas piedāvāja FaaS ar AWS Lambda, bija Amazon, tāpēc arī nosaukums. Arī citi mākoņpakalpojumu sniedzēji piedāvā līdzīgus pakalpojumus:

  • Google mākoņfunkcijas
  • Azure Functions no Microsoft

Visi Å”ie uzņēmumi nodroÅ”ina skaitļoÅ”anu bez serveriem, automātisko mērogoÅ”anu un maksā tikai par to, ko jÅ«s faktiski izmantojat, taču tie piesaista klientus viņu patentētajam produktam. Tomēr bezservera skaitļoÅ”anai ir bezmaksas un atvērtā pirmkoda alternatÄ«vas. Ir vērts atzÄ«mēt:

  • Platforma Apache OpenWhisk, ko inkubatorā izstrādājis IBM,
  • Pavasara mākoņu funkcijas, kas ir daļa no diezgan bagātÄ«gas Spring Framework ekosistēmas, ko var izmantot arÄ« kā fasādi AWS Lambda, Azure Functions un OpenWhisk,
  • Projekts Fn, ko atbalsta Oracle.

Visi no tiem ir pilnīgi neatkarīgi no mākoņiem, tas ir, tos var instalēt jebkurā mākonī, tostarp jūsu, publiskajā vai privātajā, un, protams, Exoscale.

Kā darbojas Fn projekts

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

  • CLI programma, kas izstrādāta, lai pārvaldÄ«tu visus Fn infrastruktÅ«ras aspektus un mijiedarbojas ar Fn serveri,
  • Pats Fn serveris ir parasta lietojumprogramma, kas iepakota Docker konteinerā.

Fn izvietotās funkcijas tiek izpildÄ«tas arÄ« atseviŔķos konteineros, kas ļauj atbalstÄ«t daudzas programmÄ“Å”anas valodas, piemēram... Clojure!

Funkciju argumenti tiek nodoti standarta ievadei (STDIN), rezultāti tiek ierakstÄ«ti standarta izvadē (STDOUT). Ja argumenti vai atgrieÅ”anas vērtÄ«bas nav vienkārÅ”as vērtÄ«bas (piemēram, JSON objekts), tos var konvertēt, izmantojot abstrakcijas slāni, ko nodroÅ”ina pats Fn funkciju izstrādes komplekta (FDK) veidā.

ĒrtÄ«bas labad tiek piedāvāti iebÅ«vēti veidņu komplekti, kas atvieglo FaaS izvietoÅ”anu plaŔā dažādu valodu un to versiju sarakstā (Go, dažādas Java, Python versijas utt.).

FaaS izveidoŔana ir vienkārŔa, sekojot Ŕai diagrammai:

  • Funkcijas izvietoÅ”ana, izmantojot Fn CLI: tiek izveidots lietojumprogrammas konfigurācijas fails Fn, pamatojoties uz atlasÄ«to veidni.
  • Mēs izlaižam savu funkciju, atkal izmantojot CLI Fn: konteinera attēls tiek ievietots noteiktā repozitorijā, pēc kura serveris tiek informēts par Ŕī attēla esamÄ«bu un izvietojumu.

Veidojot savu bezserveru, pamatojoties uz Fn
Funkciju piegādes princips Fn

Bezserveru funkciju lokāla uzstādÄ«Å”ana un testÄ“Å”ana

Sāksim Fn instalÄ“Å”anu vietējā datorā. Pirmkārt, tiek instalēts Docker, kā to pieprasa Fn. Pieņemot, ka mēs izmantojam Debian/Ubuntu:

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

Vai arÄ« izmantojiet pakotņu pārvaldnieku/Docker bÅ«vējumu atbilstoÅ”i savai sistēmai. Pēc tam varat pāriet tieÅ”i uz Fn CLI instalÄ“Å”anu. Piemēram, izmantojot čokuroÅ”anās:

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

Ja izmantojat operētājsistēmu OSX ar instalētu Homebrew, varat izvēlēties citu ceļu:

$ 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

Tagad esam gatavi sākotnēji izvietot savu funkciju, izmantojot CLI. VienkārŔības labad mēs izmantosim iebÅ«vētu palaiÅ”anas vidi, piemēram, Node:

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

Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.

Tiks izveidots jauns direktorijs hellonode lai tālāk attīstītu mūsu Fn funkciju ar dažiem pamata konfigurācijas failiem. Jaunizveidotajā direktorijā varat izveidot savu lietojumprogrammu, ievērojot jūsu izvēlētās valodas vai izpildlaika standartus:

# ŠšŠ°Ń‚Š°Š»Š¾Š³ с 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 sākotnējo projekta struktÅ«ru, izveido failu func.yaml, kas satur nepiecieÅ”amos Fn iestatÄ«jumus, un iestata koda veidni jÅ«su izvēlētajā valodā.

Node izpildlaika gadījumā 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.

Pirmkārt, mēs sāksim Fn serveri. Kā jau minēts, Fn serveris ir Docker konteiners, tāpēc pēc palaiÅ”anas tas aizies un paņems attēlu no Docker reÄ£istra.

$ 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

Lai izpildÄ«tu mÅ«su funkciju, tai ir jābÅ«t ā€œizrullētaiā€. Tas prasa ŠøŠ¼Ń ŠæрŠøŠ»Š¾Š¶ŠµŠ½Šøя: Fn valodā visas lietojumprogrammas ir jānorāda kā saistÄ«to funkciju nosaukumvietas.

Fn CLI meklēs failu func.yaml paÅ”reizējā direktorijā, kas tiks izmantota funkcijas konfigurÄ“Å”anai. Tāpēc vispirms jums jāiet uz mÅ«su direktoriju 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

Kā redzat no komandas izvades, tiek izveidots jauns Docker konteinera attēls, kas satur mÅ«su funkciju. Funkcija ir gatava izsaukÅ”anai, un mums ir divi veidi, kā to izdarÄ«t:

  • izmantojot Fn komandu invoke
  • zvanot tieÅ”i pa http

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

$ fn invoke fnexo hellonode      # Š²Ń‹Š·Ń‹Š²Š°ŠµŠ¼ фуŠ½ŠŗцŠøю hellonode ŠæрŠøŠ»Š¾Š¶ŠµŠ½Šøя fnexo

{"message":"Hello World"}

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

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

{"message":"Hello World"}

Fn serveris atklāj savas funkcijas portā 8080, un Ŕķiet, ka funkcijas URL atbilst modelim t/app/function, bet ne pilnÄ«bā. Izmantojot HTTP, funkcija netiek izsaukta tieÅ”i, bet ar tā saukto trigeri, kas pēc nosaukuma ā€œsākā€ funkcijas izsaukumu. Trigeri ir definēti `func.yml projekts:

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 трŠøŠ³Š³ŠµŃ€Š°

Mēs varam mainÄ«t sprÅ«da nosaukumu, lai tas atbilstu funkcijas nosaukumam, tas visu vienkārÅ”os:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # сŠ¾Š²ŠæŠ°Š“Š°ŠµŃ‚ с ŠøŠ¼ŠµŠ½ŠµŠ¼ фуŠ½ŠŗцŠøŠø

Pēc tam vēlreiz palaižam funkcijas piegādi un izsaucam to no jauna aktivizētāja:

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

{"message":"Hello World"}

Viss darbojas! Ir pienācis laiks pāriet uz pilna mēroga eksperimentiem un publicēt mūsu FaaS serverī!

Bezserveru funkciju pakalpojumu instalÄ“Å”ana savā infrastruktÅ«rā

Ātri instalēsim virtuālo maŔīnu, izmantojot Exoscale CLI. Ja vēl neesat to iestatÄ«jis, varat to izmantot mÅ«su ātrā darba sākÅ”anas rokasgrāmata. Å is ir forÅ”s rÄ«ks, kas vēl vairāk palielinās jÅ«su produktivitāti. Neaizmirstiet, ka jums ir jākonfigurē noteikums, lai droŔības grupā atvērtu portu 8080! Å Ä«s komandas palaidÄ«s tÄ«ru virtuālo maŔīnu, kas ir gatava mitināt mÅ«su funkcijas:

$ 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 ssh virtuālajā maŔīnā un instalēt attālo Fn serveri:

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

Pēc tam instalējiet Docker un Fn serveri tādā paŔā veidā, kā tas jau tika darÄ«ts vietējā maŔīnā, startējiet 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 uztvert funkcijas! MērÄ·tiecÄ«gai funkciju pārsÅ«tÄ«Å”anai uz attālo serveri mēs izmantosim komandu deploy no vietējā datora, izlaižot karogu --local.

Turklāt Fn ir jānorāda Fn servera un Docker reÄ£istra atraÅ”anās vieta. Å Ä«s opcijas var iestatÄ«t, izmantojot vides mainÄ«gos FN_API_URL Šø FN_REGISTRY attiecÄ«gi, bet arÄ« piedāvā ērtāku veidu, kā viegli pārvaldÄ«t izvietoÅ”anai paredzēto konfigurāciju izveidi un pārvaldÄ«bu.

Fn izteiksmē tiek izsaukta izvietoÅ”anas konfigurācija context. Å Ä« komanda izveidos kontekstu:

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

Varat skatīt pieejamos kontekstus, piemēram:

$ fn list contexts

CURRENT NAME      PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

Un pārslēdzieties uz kontekstu, kas tikko tika izveidots Ŕādi:

 $ fn use context exoscale

 Now using context: exoscale

No Ŕī brīža Fn funkcijas piegāde lejupielādēs Docker attēlus, izmantojot atlasÄ«to DockerHub kontu (manā gadÄ«jumā - nfrankel), un pēc tam paziņojiet attālajam serverim (Å”ajā piemērā - http://185.19.30.175:8080) par jaunākā attēla, kurā ir jÅ«su funkcija, atraÅ”anās vietu un versiju.

$ 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 .

Visbeidzot:

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

{"message":"Hello World"}

Veidojot savu bezserveru, pamatojoties uz Fn
Funkcijas dzīves cikls uz Fn balstītā bezservera skaitļoŔanā

Bez servera skaitļoŔanas priekŔrocības ar jūsu paŔu jaudu

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

Tas bieži vien ir saistÄ«ts ar slēptajām izmaksām, kas saistÄ«tas ar piesaisti izvēlētajam pārdevējam, kas atkarÄ«bā no konkrētā lietoÅ”anas gadÄ«juma un apjoma var radÄ«t lielākas izmaksas un samazināt elastÄ«bu nākotnē.

Å ajā gadÄ«jumā cieÅ” arÄ« vairāku mākoņu un hibrÄ«dmākoņu arhitektÅ«ras, jo var viegli nonākt situācijā, kad gribētos izmantot bezserveru skaitļoÅ”anu, taču korporatÄ«vo politiku dēļ tas var nebÅ«t iespējams.

Fn ir diezgan viegli lietojams, un tas var nodroÅ”ināt gandrÄ«z tādu paÅ”u FaaS interfeisu ar nelielām izmaksām. Tas novērÅ” jebkādu pārdevēja bloÄ·Ä“Å”anu, un to var instalēt lokāli vai jebkurā ērtā mākoņa risinājumu nodroÅ”inātājā pēc jÅ«su izvēles. ProgrammÄ“Å”anas valodas izvēlē ir arÄ« brÄ«vÄ«ba.

Å ajā rakstā ir apskatÄ«ti tikai Fn pamati, taču sava izpildlaika izveide ir diezgan vienkārÅ”a, un vispārējo arhitektÅ«ru var izvietot plaŔāk, izmantojot Fn slodzes balansētāju vai novietojot Fn aiz starpniekservera aizsardzÄ«bai.

Avots: www.habr.com

Pievieno komentāru