Ehitus oma serverless'i pÔhjal Fn

Ehitus oma serverless'i pÔhjal Fn

Serverivabad arvutused — on ĂŒks silmapaistvamaid suundi pilvandmetöötluses. Peamine tööpĂ”himĂ”te on see, et infrastruktuuri haldamine ei kuulu DevOps'ide, vaid teenusepakkujate ĂŒlesanne. Ressursside skaleerimine kohandub automaatselt koormuse jĂ€rgi ja omab suurt muutmiskiirus.

Teine ĂŒhine joon on tendents koodi minimeerimiseks ja fokusseerimiseks, mistĂ”ttu nimetatakse serverivabu arvutusi mĂ”nikord "funktsioon kui teenus" (FaaS).

Ajalooliselt oli esimene pilveteenuste pakkuja, kes pakkus FaaS-i AWS Lambda kaudu, Amazon, kust see nimi pÀrineb. Ka teised pilveteenuste pakkujad pakuvad analooge:

  • Google'i Cloud Functions
  • Microsofti Azure Functions

KÔik need ettevÔtted pakuvad serverivabu arvutusi, automaatset skaleerimist ja tasu ainult tegelikult kasutatud ressursside eest, kuid nad seovad kliente oma patenteeritud toote juurde. Siiski on olemas tasuta avatud lÀhtekoodiga alternatiive serverivabade arvutuste korraldamiseks. Tasub mÀrkida:

  • Platvormi Apache OpenWhisk, mida arendab IBM-i inkubaator,
  • Spring Cloud Functions, mis on osa piisavalt rikkalikust Spring Frameworki ökosĂŒsteemist, mida saab kasutada ka AWS Lambda, Azure Functions ja OpenWhiski fasadina,
  • Fn projekt, mida toetab Oracle.

KÔik need on tÀielikult sÔltumatud pilvedest, st need on installitavad igas pilves, sealhulgas teie enda, avalikus vÔi erapilves, ja muidugi ka Exoscale'is.

Kuidas Fn projekt on ĂŒles ehitatud

Fn pÔhineb tÀielikult Docker'il, koosnedes kahest pÔhikomponendist:

  • CLI programmist, mis on mĂ”eldud Fn infrastruktuuri kĂ”igi aspektide haldamiseks ja koostööks Fn serveriga,
  • Ise Fn server, tavaline rakendus, mis on pakitud Docker konteinerisse.

Fn'is juurutatud funktsioonid töötavad samuti eraldi konteinerites, mis vĂ”imaldab toetada vĂ€ga mitmeid programmeerimiskeeli, nĂ€iteks
 Clojure!

Funktsioonide argumendid edastatakse standardse sisendi (STDIN) kaudu, tulemused kirjutatakse standardsele vÀljundile (STDOUT). Kui argumendid vÔi tagastatavad vÀÀrtused ei ole lihtsad vÀÀrtused (nÀiteks JSON objekt), saavad need olla muudetud abistava kihi kaudu, mille Fn pakub funktsioonide arendamise komplektina (FDK).

Kasutamiseks on saadaval sisseehitatud mallide komplektid, mis lihtsustavad FaaSi juurutamist erinevatel keeltes ja nende versioonides (Go, erinevad Java versioonid, Python jne).

FaaSi loomine on lihtne, jÀrgides seda skeemi:

  • Jurutame funktsiooni CLI Fn abil: loodakse rakenduse konfigureerimisfail Fn jaoks, mis pĂ”hineb valitud mallil.
  • VĂ€ljastame oma funktsiooni, taas CLI Fn abil: konteineripilt paigutatakse mingisse registrisse, pĂ€rast mida serverit teavitakse selle pildi olemasolust ja asukohast.

Ehitus oma serverless'i pÔhjal Fn
Funktsioonide kohaletoimetamise pÔhimÔte Fn-s

Kohalik installatsioon ja serverivaba funktsioonide testimine

Alustame Fn-i installimist kohalikus masinas. Esiteks installitakse Docker, nagu Fn nĂ”uab. Eeldame, et oleme Debian/Ubuntu sĂŒsteemil:

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

VĂ”i kasutage oma sĂŒsteemi jaoks pakihaldurit/ Dockerit. SeejĂ€rel saame otse jĂ€tkata Fn CLI installimisega. NĂ€iteks curl abil:

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

Kui töötate OSX-il koos Homebrew'ga, vÔib minna teist teed:

$ brew install fn

==> Laadimine https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Laadimine aadressilt 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 failid, 16.7MB

NĂŒĂŒd on kĂ”ik valmis meie funktsiooni esmaseks juurutamiseks CLI abil. Lihtsuse huvides kasutame sisseehitatud keskkonda, nĂ€iteks Node'i:

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

Funktsioon luuakse asukohas: /hellonode
Funktsiooni aluskood genereeritud.
func.yaml loodud.

Loodud saab uus kataloog hellonode edasi meie Fn funktsiooni arendamiseks koos mÔnede pÔhikonfigureerimisfailidega. Uues loodud kataloogis saate luua oma rakenduse, jÀrgides teie valitud keele vÔi kÀituskeskkonna standardeid:

# ĐšĐ°Ń‚Đ°Đ»ĐŸĐł с 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 loob projekti algstruktuuri ning loob faili func.yaml, mis sisaldab Fn-ile vajalikke seadistusi, ja seab valitud keeles koodimalli.

Node'i kÀituskeskkonna puhul tÀhendab see:

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

NĂŒĂŒd kontrollime kiiresti meie funktsiooni kohalikult, et nĂ€ha, kuidas kĂ”ik töötab.

KÔigepealt kÀivitame Fn serveri. Nagu juba mainitud, on Fn server Docker konteiner, seega peale kÀivitamist see lÀheb ja vÔtab pildi Docker registrist.

$ fn start -d                    # kÀivitame kohaliku serveri taustal

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

KÀivitamiseks tuleb meie funktsioon "vÀlja viia". Selleks on vajalik rakenduse nimi: Fn-is peavad kÔik rakendused olema mÀÀratud seotud funktsioonide nimedena.

Fn CLI otsib faili func.yaml praeguses kataloogis, mis rakendub funktsiooni seadistamiseks. Seega peame esmalt minema meie katalooge hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # vÀljastame funktsiooni kohalikult, rakenduse nimi - fnexo.
                                 # parameeter local ei lae pilti kaugregistrisse,
                                 # kÀivitades selle otse

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

Nagu nÀha kÀsu vÀljundist, luuakse uus Docker konteineri pilt, mis sisaldab meie funktsiooni. Funktsioon on kutsumiseks valmis ning meil on kaks vÔimalust selle tegemiseks:

  • kasutades kĂ€sku Fn invoke
  • kutsudes otse lĂ€bi http

Kutsumine invoke Fn emuleerib lihtsalt HTTP tööd testide jaoks, mis on kiire testimise jaoks mugav:

$ fn invoke fnexo hellonode      # kutsume fnexo rakenduse hellonode funktsiooni

{"message":"Hello World"}

Funktsiooni otse kutsumiseks tuleb teada tÀielikku URL-i:

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

{"message":"Hello World"}

Fn server pakub oma funktsioone porti 8080 kaudu ning nÀib, et funktsiooni URL vastab skeemile t/app/function, kuid mitte tÀielikult. HTTP kaudu kutsutakse funktsiooni mitte otse, vaid nn triggeri kaudu, mis oma nime kohaselt "kÀivitab" funktsiooni kutsumise. Triggerid on mÀÀratletud `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    # triggeri URL

Saame muuta triggeri nime, et see vastaks funktsiooni nimele, see lihtsustab kÔike:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # vastab funktsiooni nimele

SeejÀrel kÀivitame funktsiooni tarnimise veel kord ja kutsume selle uue triggeri kaudu:

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

{"message":"Tere, maailm"}

KÔik töötab! On just Ôige aeg minna reaalsesse katsetusse ja avaldada meie FaaS serveris!

Serverless funktsioonide teenuste seadistamine oma infrastruktuuris

Alustame kiiresti virtuaalse masina seadistamist Exoscale'i CLI abil. Kui te ei ole seda veel seadistanud — vĂ”ite kasutada meie kiire kĂ€ivitamise juhendit. See on suurepĂ€rane tööriist, mis tĂ”stab veelgi teie tootlikkust. Ärge unustage seadistada reeglit port 8080 avamiseks Security Group'is! JĂ€rgmised kĂ€sud kĂ€ivitavad puhta virtuaalse masina, mis on valmis meie funktsioonide majutamiseks:

$ 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

SeejÀrel saab SSH kaudu virtuaalsesse masinasse siseneda ja paigaldada kaugserveri Fn:

$ exo ssh fn-server

Hosti '185.19.30.175 (185.19.30.175)' autentsust ei saa kehtestada.
ECDSA vÔtme sÔrmejÀlg on SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Kas soovite jĂ€tkata ĂŒhenduse loomist (jah/ei)? jah
Hoiatus: '185.19.30.175' (ECDSA) on pĂŒsivalt lisatud tuntud hostide nimekirja.
Tere tulemast Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

SeejÀrel paigaldame Docker'i ja Fn serveri samuti nagu seda tehti kohalikul masinal ning kÀivitame 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 on valmis funktsioonide vastuvÔtmiseks! Funktsioonide sihtimise jaoks kaugserverisse kasutame kÀsku deploy kohalikust arvutist, jÀttes vÀlja flagi --local.

Lisaks peab Fn nÀitama Fn serveri ja Docker'i registri asukohta. Need parameetrid vÔivad olla mÀÀratud keskkonnamuutujate kaudu FN_API_URL ja FN_REGISTRY vastavalt, kuid pakutakse ka mugavamat viisi konfiguratsioonide loomise ja haldamise hÔlbustamiseks.

Fn kontekst, mida kasutatakse rakenduse juurutamiseks, nimetatakse context. JÀrgmine kÀsk loob konteksti:

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

Saate vaadata saadaval olevaid kontekste nii:

$ fn list contexts

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

Ja lĂŒlituda just loodud konteksti nii:

 $ fn use context exoscale

 NĂŒĂŒd kasutame konteksti: exoscale

Alates sellest kohast hakkab Fn funktsioonide tarnimine laadima Docker'i pilte, kasutades valitud kontot DockerHub'is (minu puhul — nfrankel), seejĂ€rel teavitab see kaugserverit (sel juhul — http://185.19.30.175:8080) viimase pildi asukohast ja versioonist, mis sisaldab teie funktsiooni.

$ fn deploy --app fnexo .   # kÀivitatakse lokaalselt hellonode kataloogist

Funktsiooni laadimine asukohas: /.
Laadimine hellonode rakendusse: fnexo
Versioon tÔstetud 0.0.5-ni
Pildi koostamine nfrankel/hellonode:0.0.5 .

LÔpuks:

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

{"message":"Tere, maailm"}

Ehitus oma serverless'i pÔhjal Fn
Fn baasil serverless arvutustes funktsiooni elutsĂŒkkel

Serverless arvutuste eelised oma infrastruktuuris

Serverless arvutused on mugav lahendus sÔltumatute rakenduse osade kiireks juurutamiseks, mis suhtlevad keerukamate rakenduste vÔi mikroteenustega.

Sageli on sellel peidetud kulu seondumine valitud teenusepakkujaga, mis sÔltuvalt konkreetsest kasutusjuhtumist ja mahust vÔib viia kÔrgemate kuludeni ja vÀhenenud paindlikkuseni tulevikus.

Multicloud ja hĂŒbriidsete pilvearhitektuuride korral tekivad samuti probleemid, kuna vĂ”ib lihtsalt sattuda olukorda, kus soovite kasutada serverless arvutusi, kuid ettevĂ”tte poliitika tĂ”ttu vĂ”ib see olla vĂ”imatu.

Fn on kasutajasÔbralik, see vÔib pakkuda peaaegu samasugust FaaS liidest, vÀikeste kuludega. See vabastab teid igasugustest teenusepakkuja sidemetest, seda saab installida lokaalselt vÔi valida sobivas pilveteenuse pakkujas. Samuti on vabade valikute osas programmeerimiskeeles.

Artiklis tutvustatakse vaid Fn pĂ”hialuseid, kuid oma tĂ€itmisvĂ”imekeskkonna loomine on piisavalt lihtne ning ĂŒldist arhitektuuri saab laiendada Fn tasakaalustaja kasutamisega vĂ”i paigutades Fn proksi taha kaitseks.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster