Ndërtimi ynë pa server bazuar në Fn

Ndërtimi ynë pa server bazuar në Fn

Informatikë pa server është një nga tendencat më të spikatura në kompjuterin cloud. Parimi bazë i funksionimit është se infrastruktura nuk është shqetësimi i DevOps, por i ofruesit të shërbimit. Shkallëzimi i burimeve përshtatet automatikisht me ngarkesën dhe ka një shkallë të lartë ndryshimi.

Një tipar tjetër i zakonshëm është tendenca për të minimizuar dhe fokusuar kodin, kjo është arsyeja pse llogaritja pa server ndonjëherë quhet funksion si shërbim (FaaS).

Historikisht, ofruesi i parë i cloud që ofroi FaaS me AWS Lambda ishte Amazon, prandaj emri. Ofruesit e tjerë të shërbimeve cloud ofrojnë gjithashtu të ngjashme:

  • Funksionet e resë kompjuterike nga Google
  • Funksionet Azure nga Microsoft

Të gjitha këto kompani ofrojnë llogaritje pa server, shkallëzim automatik dhe paguajnë vetëm për atë që ju përdorni në të vërtetë, por ata i mbyllin klientët në produktin e tyre të pronarit. Sidoqoftë, ekzistojnë alternativa falas dhe me burim të hapur për llogaritjen pa server. Vlen të theksohet:

  • Platforma Apache OpenWhisk, i zhvilluar në një inkubator nga IBM,
  • Funksionet e resë së pranverës, si pjesë e një ekosistemi mjaft të pasur Spring Framework, i cili mund të përdoret gjithashtu si fasadë për AWS Lambda, Azure Functions dhe OpenWhisk,
  • Projekti Fn, i mbështetur nga Oracle.

Të gjitha ato janë plotësisht të pavarura nga retë, domethënë mund të instalohen në çdo re, përfshirë tuajën, publike ose private, dhe natyrisht në Exoscale.

Si funksionon projekti Fn

Fn bazohet plotësisht në Docker, përbëhet nga dy komponentë kryesorë:

  • Programi CLI i krijuar për të menaxhuar të gjitha aspektet e infrastrukturës Fn dhe ndërvepron me serverin Fn,
  • Vetë serveri Fn është një aplikacion i rregullt i paketuar në një kontejner Docker.

Funksionet e vendosura në Fn ekzekutohen gjithashtu në kontejnerë të veçantë, gjë që ju lejon të mbështesni shumë gjuhë programimi, për shembull... Clojure!

Argumentet e funksionit kalohen në hyrjen standarde (STDIN), rezultatet shkruhen në daljen standarde (STDOUT). Nëse argumentet ose vlerat e kthyera nuk janë vlera të thjeshta (siç është një objekt JSON), ato mund të konvertohen duke përdorur një shtresë abstraksioni të ofruar nga vetë Fn në formën e një Kit për Zhvillimin e Funksionit (FDK).

Për lehtësi, ofrohen grupe modelesh të integruara për të lehtësuar vendosjen e FaaS në një listë të gjerë të gjuhëve të ndryshme dhe versioneve të tyre (Go, versione të ndryshme të Java, Python, etj.).

Krijimi i një FaaS është i lehtë duke ndjekur këtë diagram:

  • Vendosja e funksionit duke përdorur Fn CLI: krijohet një skedar konfigurimi i aplikacionit për Fn bazuar në shabllonin e zgjedhur.
  • Ne hapim funksionin tonë, përsëri duke përdorur CLI Fn: imazhi i kontejnerit vendoset në një depo të caktuar, pas së cilës serveri njoftohet për ekzistencën dhe vendosjen e këtij imazhi.

Ndërtimi ynë pa server bazuar në Fn
Parimi i dhënies së funksioneve në Fn

Instalimi lokal dhe testimi i funksioneve pa server

Le të fillojmë instalimin e Fn në makinën lokale. Së pari, instalohet Docker, siç kërkohet nga Fn. Duke supozuar se jemi në Debian/Ubuntu:

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

Ose përdorni një ndërtim të menaxherit të paketave/Docker sipas sistemit tuaj. Pastaj mund të shkoni direkt në instalimin e Fn CLI. Për shembull, duke përdorur curl:

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

Nëse jeni në OSX me Homebrew të instaluar, mund të shkoni në anën tjetër:

$ 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

Tani jemi gati të vendosim fillimisht funksionin tonë duke përdorur CLI. Për thjeshtësi, ne do të përdorim një mjedis nisjeje të integruar, si Node:

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

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

Do të krijohet një direktori e re hellonode për të zhvilluar më tej funksionin tonë Fn me disa skedarë bazë të konfigurimit. Brenda direktoriumit të krijuar rishtazi, mund të krijoni aplikacionin tuaj duke ndjekur standardet e gjuhës ose të kohës së funksionimit të zgjedhur:

# Каталог с 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 krijon strukturën fillestare të projektit, krijon një skedar func.yaml, që përmban cilësimet e nevojshme për Fn dhe vendos shabllonin për kodin në gjuhën që keni zgjedhur.

Në rastin e kohës së funksionimit Node, kjo do të thotë:

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

Tani do të testojmë shpejt funksionin tonë në nivel lokal për të parë se si funksionon gjithçka.

Së pari, ne do të fillojmë serverin Fn. Siç u përmend tashmë, serveri Fn është një kontejner Docker, prandaj, pas fillimit, ai do të shkojë dhe do të marrë imazhin nga regjistri Docker.

$ 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

Për të ekzekutuar funksionin tonë, ai duhet të "përfundohet". Kjo kërkon имя приложения: Në Fn, të gjitha aplikacionet duhet të specifikohen si hapësira emrash për funksionet përkatëse.

Fn CLI do të kërkojë për skedarin func.yaml në drejtorinë aktuale që do të përdoret për të konfiguruar funksionin. Pra, së pari ju duhet të shkoni në drejtorinë tonë 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

Siç mund ta shihni nga dalja e komandës, krijohet një imazh i ri i kontejnerit Docker që përmban funksionin tonë. Funksioni është gati për t'u thirrur dhe ne kemi dy mënyra për ta bërë atë:

  • duke përdorur komandën Fn invoke
  • duke telefonuar drejtpërdrejt nëpërmjet http

Вызов invoke nëpërmjet Fn thjesht emulon punën përmes HTTP për teste, gjë që është e përshtatshme për testim të shpejtë:

$ fn invoke fnexo hellonode      # вызываем функцию hellonode приложения fnexo

{"message":"Hello World"}

Për të thirrur drejtpërdrejt një funksion, duhet të dini URL-në e plotë:

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

{"message":"Hello World"}

Serveri Fn ekspozon funksionet e tij në portën 8080 dhe URL-ja e funksionit duket se përputhet me modelin t/app/function, por jo plotësisht. Nëpërmjet HTTP, një funksion nuk thirret drejtpërdrejt, por përmes një të ashtuquajturi trigger, i cili, sipas emrit të tij, "fillon" thirrjen e funksionit. Shkaktarët janë përcaktuar në `func.yml projekti:

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 триггера

Ne mund të ndryshojmë emrin e këmbëzës që të përputhet me emrin e funksionit, kjo do të thjeshtojë gjithçka:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # совпадает с именем функции

Pastaj ne ekzekutojmë përsëri dorëzimin e funksionit dhe e thërrasim atë nga një shkas i ri:

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

{"message":"Hello World"}

Gjithçka po funksionon! Është koha për të kaluar në eksperimente në shkallë të plotë dhe për të publikuar FaaS-në tonë në server!

Instalimi i shërbimeve të funksionit pa server në infrastrukturën tuaj

Le të instalojmë shpejt një makinë virtuale duke përdorur Exoscale CLI. Nëse nuk e keni konfiguruar ende, mund ta përdorni udhëzuesi ynë i fillimit të shpejtë. Ky është një mjet i mrekullueshëm që do të rrisë produktivitetin tuaj edhe më shumë. Mos harroni se duhet të konfiguroni një rregull për të hapur portin 8080 në Grupin e Sigurisë! Komandat e mëposhtme do të lëshojnë një makinë virtuale të pastër, të gatshme për të pritur funksionet tona:

$ 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

Pastaj mund të futni ssh në makinën virtuale dhe të instaloni serverin Fn në distancë:

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

Pastaj instaloni Docker dhe serverin Fn në të njëjtën mënyrë siç është bërë tashmë në makinën lokale, filloni serverin:

$ 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 është gati për të marrë funksione! Për transferimin e synuar të funksioneve në një server të largët, ne do të përdorim komandën deploy nga kompjuteri lokal duke lënë jashtë flamurin --local.

Përveç kësaj, Fn kërkon që ju të specifikoni vendndodhjen e serverit Fn dhe regjistrit Docker. Këto opsione mund të vendosen nëpërmjet variablave të mjedisit FN_API_URL и FN_REGISTRY përkatësisht, por gjithashtu ofron një mënyrë më të përshtatshme për të menaxhuar lehtësisht krijimin dhe menaxhimin e konfigurimeve për vendosje.

Në terma Fn, quhet konfigurimi për vendosje context. Komanda e mëposhtme do të krijojë kontekstin:

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

Ju mund t'i shikoni kontekstet e disponueshme si kjo:

$ fn list contexts

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

Dhe kaloni në kontekstin që sapo u krijua si kjo:

 $ fn use context exoscale

 Now using context: exoscale

Nga këtu e tutje, shpërndarja e veçorive Fn do të shkarkojë imazhet e Docker duke përdorur llogarinë e zgjedhur DockerHub (në rastin tim - nfrankel), dhe më pas njoftoni serverin në distancë (në këtë shembull - http://185.19.30.175:8080) në lidhje me vendndodhjen dhe versionin e imazhit më të fundit që përmban funksionin tuaj.

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

Së fundi:

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

{"message":"Hello World"}

Ndërtimi ynë pa server bazuar në Fn
Cikli i jetës së funksionit në llogaritjen pa server të bazuar në Fn

Avantazhet e llogaritjes pa server me kapacitetin tuaj

Llogaritja pa server është një zgjidhje e përshtatshme për zbatimin e shpejtë të pjesëve të pavarura të një aplikacioni që ndërveprojnë me aplikacione ose mikroshërbime më komplekse.

Kjo është shpesh për shkak të kostos së fshehur të mbylljes me shitësin e zgjedhur, i cili, në varësi të rastit specifik të përdorimit dhe vëllimit, mund të çojë në kosto më të larta dhe fleksibilitet të reduktuar në të ardhmen.

Arkitekturat multi-cloud dhe hibride të cloud gjithashtu vuajnë në këtë rast, sepse mund të gjendeni lehtësisht në një situatë ku dëshironi të përdorni kompjuterin pa server, por për shkak të politikave të korporatës mund të mos jetë e mundur.

Fn është mjaft i lehtë për t'u përdorur dhe mund të sigurojë pothuajse të njëjtën ndërfaqe FaaS, me pak shpenzime. Ai eliminon çdo bllokim të shitësit dhe mund të instalohet në nivel lokal ose në çdo ofrues të përshtatshëm zgjidhjeje cloud sipas zgjedhjes suaj. Ekziston edhe liri në zgjedhjen e një gjuhe programimi.

Ky artikull mbulon vetëm bazat e Fn, por krijimi i kohës tuaj të ekzekutimit është mjaft i thjeshtë dhe arkitektura e përgjithshme mund të vendoset më gjerësisht duke përdorur një balancues të ngarkesës Fn, ose duke vendosur Fn pas një përfaqësuesi për mbrojtje.

Burimi: www.habr.com

Shto një koment