Vi bygger vÄr egen serverless basert pÄ Fn

Vi bygger vÄr egen serverless basert pÄ Fn

Serverlþse beregninger — en av de mest bemerkelsesverdige trendene innen skyberegninger. Hovedprinsippet er at infrastrukturen ikke er et ansvar for DevOps, men for tjenesteleverandþren. Ressursene skaleres automatisk til belastningen og har en hþy grad av endringshastighet.

En annen vanlig egenskap er trenden mot minimalisering og fokusering av koden, derfor blir serverlÞse beregninger noen ganger kalt «funksjon som tjeneste» (FaaS).

Historisk sett var Amazon den fÞrste leverandÞren av skybaserte tjenester som tilbÞd FaaS med AWS Lambda, og det er her navnet stammer fra. Andre skybaserte tjenesteleverandÞrer tilbyr ogsÄ sine egne varianter:

  • Cloud Functions fra Google
  • Azure Functions fra Microsoft

Alle disse selskapene tilbyr serverlÞse beregninger, automatisk skalering og betaling for faktisk brukte ressurser, men de binder ogsÄ kundene til sitt proprietÊre produkt. Det finnes imidlertid gratis alternativer med Äpen kildekode for Ä organisere serverlÞse beregninger. Det er verdt Ä merke seg:

  • Plattformen Apache OpenWhisk, utviklet av IBM i et inkubatorprogram,
  • Spring Cloud Functions, som en del av det ganske rike Ăžkosystemet til Spring Framework, som ogsĂ„ kan brukes som et fasade pĂ„ AWS Lambda, Azure Functions og OpenWhisk,
  • Prosjekt Fn, stĂžttet av Oracle.

Alle disse er helt uavhengige av skyer, det vil si at de kan installeres i hvilken som helst sky, inkludert din egen, offentlig eller privat, og selvfĂžlgelig i Exoscale.

Hvordan Fn prosjektet fungerer

Fn er helt basert pÄ Docker og bestÄr av to hovedkomponenter:

  • CLI-programmet, som er ment Ă„ administrere alle aspekter av Fn-infrastrukturen, og som interagerer med Fn-serveren,
  • Selve Fn-serveren, et vanlig program pakket i en Docker-kontainer.

Funksjoner som distribueres i Fn kjÞres ogsÄ i separate beholdere, noe som gjÞr det mulig Ä stÞtte en rekke programmeringssprÄk, for eksempel
 Clojure!

Funksjonsargumenter blir sendt til standard input (STDIN), resultatene skrives til standard output (STDOUT). Hvis argumentene eller returverdiene ikke er enkle verdier (for eksempel JSON-objekter) — kan de bli konvertert ved hjelp av et abstraksjonslag som tilbys av Fn i form av et funksjonsutviklingssett (FDK).

For brukervennlighet tilbys innebygde malsett som forenkler distribusjonen av FaaS pÄ en omfattende liste over forskjellige sprÄk og deres versjoner (Go, forskjellige versjoner av Java, Python osv.).

Å opprette FaaS er enkelt, fþlg denne planen:

  • Distribuer funksjonen ved hjelp av CLI Fn: En konfigurasjonsfil for applikasjonen opprettes for Fn, basert pĂ„ den valgte malen.
  • Distribuerer egen funksjon, igjen ved hjelp av CLI Fn: Docker-imaget plasseres i et lager, hvoretter serveren blir informert om eksistensen og plasseringen av dette imaget.

Vi bygger vÄr egen serverless basert pÄ Fn
Prinsipp for distribusjon av funksjoner i Fn

Lokal installasjon og testing av serverlĂžse funksjoner

La oss begynne Ä installere Fn pÄ den lokale maskinen. FÞrst installeres Docker, slik det kreves av Fn. Vi antar at vi bruker Debian/Ubuntu:

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

Eller bruk pakkeadministratoren/byggingen av Docker i henhold til systemet ditt. Deretter kan vi gÄ rett til installasjonen av Fn CLI. For eksempel, med curl:

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

Hvis du jobber pÄ OSX med installert Homebrew, kan du ta en annen rute:

$ brew install fn

==> Downloader https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloader fra https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Hellende fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 filer, 16.7MB

NÄ er alt klart for den fÞrste distribusjonen av funksjonen vÄr ved hjelp av CLI. For enkelhets skyld vil vi bruke det innebygde miljÞet for Ä kjÞre, for eksempel Node:

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

Oppretter funksjon i: /hellonode
Funksjonens mal er generert.
func.yaml er opprettet.

En ny katalog vil bli opprettet hellonode for videre utvikling av Fn-funksjonen vÄr med noen grunnleggende konfigurasjonsfiler. Inne i den nyskapte katalogen kan du lage applikasjonen din, i henhold til standardene for det valgte sprÄket eller kjÞringsmiljÞet:

# ĐšĐ°Ń‚Đ°Đ»ĐŸĐł с 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 oppretter en grunnleggende prosjektstruktur og lager filen func.yaml, som inneheld nÞdvendige installasjonar for Fn, og set opp mal for koden pÄ sprÄket du valde.

I tilfelle av Node-runtime, betyr dette:

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

No skal vi raskt sjekke funksjonen vÄr lokalt for Ä sjÄ korleis alt fungerer.

For Ä begynne med, skal vi starte Fn-serveren. Som tidlegare nemnt, er Fn-serveren ein Docker-container, sÄ den vil gÄ og ta bildet frÄ Docker-registeret etter at den er starta.

$ fn start -d                    # startar lokal server i bakgrunnen

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

For Ä rulle ut funksjonen vÄr, mÄ den «deployas». Dette krev namn pÄ applikasjonen: i Fn mÄ alle applikasjonar definerast som namnrom for tilknyttede funksjonar.

Fn CLI vil leita etter fila func.yaml i den gjeldande katalogen, som vil bli brukt til Ä konfigurere funksjonen. SÄ vi mÄ fÞrst gÄ til katalogen vÄr hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # ruller ut funksjonen lokalt, applikasjonsnavnet - fnexo.
                                 # parameteren local lastar ikkje opp bildet til fjernregisteret,
                                 # men kĂžyre det direkte

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

Som ein kan sjÄ frÄ utskrifta av komandoen, blir det laga eit nytt containerbilde for Docker som inneheld funksjonen vÄr. Funksjonen er klar til Ä bli kalla, og vi har to mÄtar Ä gjere dette pÄ:

  • ved Ă„ bruke kommandoen Fn invoke
  • ogsĂ„ ved Ă„ kalle direkte gjennom http

Kall invoke gjennom Fn simulerer eigentleg HTTP-arbeid for testing, noko som er praktisk for raske sjekkar:

$ fn invoke fnexo hellonode      # kallar funksjonen hellonode i applikasjonen fnexo

{"message":"Hello World"}

For Ä kalle funksjonen direkte, mÄ ein kjenne den fullstendige URL-en:

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

{"message":"Hello World"}

Fn-serveren gir funksjonane sine gjennom port 8080, og URL-en for funksjonen ser ut til Ä fÞlge mÞnsteret t/app/function, men ikkje heilt. Gjennom HTTP blir funksjonen ikkje kalla direkte, men gjennom det sÄkalla triggeret, som gjennom namnet sitt «utlÞysar» kall av funksjonen. Triggerar blir definert i `func.yml prosjektet:

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 til triggeren

Vi kan endre navnet pÄ triggeren for Ä samsvare med funksjonsnavnet, dette vil forenkle alt:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # samsvar med funksjonsnavnet

SĂ„ starter vi distribusjonen av funksjonen igjen og kaller den fra den nye triggeren:

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

{"message":"Hello World"}

Alt fungerer! Det er pÄ tide Ä gÄ videre med eksperimentene og publisere vÄr FaaS pÄ serveren!

Installerer serverlÞse funksjoner pÄ din egen infrastruktur

La oss raskt sette opp en virtuell maskin ved hjelp av Exoscale CLI. Hvis du ikke har satt det opp ennĂ„ – kan du bruke vĂ„r guide for rask oppstart. Dette er et flott verktĂžy som vil Ăžke produktiviteten din ytterligere. Ikke glem Ă„ sette opp en regel for Ă„ Ă„pne port 8080 i sikkerhetsgruppen! FĂžlgende kommandoer vil starte en ren virtuell maskin, klar for hosting av funksjonene vĂ„re:

$ 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

Deretter kan du logge inn via ssh pÄ den virtuelle maskinen og installere Fn-serveren:

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

Deretter installerer vi Docker og Fn-serveren pÄ samme mÄte som vi gjorde pÄ den lokale maskinen, og starter serveren:

$ 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 er klart til Ä motta funksjoner! For Ä mÄlrette funksjoner til den eksterne serveren, vil vi bruke kommandoen deploy fra den lokale datamaskinen, og hopper over flagget --local.

I tillegg krever Fn at du angir plasseringen av Fn-serveren og Docker-registeret. Disse parameterne kan settes via miljÞvariabler FN_API_URL og FN_REGISTRY henholdsvis, men det tilbys ogsÄ en mer praktisk mÄte for enkel administrasjon av konfigurasjoner for distribusjon.

I Fn-termer er konfigurasjonen for distribusjon kalt context. Den fĂžlgende kommandoen vil opprette konteksten:

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

Du kan se tilgjengelige kontekster slik:

$ fn list contexts

NÅVÆRENDE NAVN      LEVERANDØR      API URL                      REGISTER
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

For Ă„ bytte til konteksten som nettopp ble opprettet, gjĂžr du slik:

 $ fn use context exoscale

 NĂ„ bruker vi konteksten: exoscale

Fra dette punktet vil Fn-funksjonsleveransen laste ned Docker-bilder ved Ă„ bruke den valgte kontoen pĂ„ DockerHub (i mitt tilfelle — nfrankel), hvoretter den vil varsle den eksterne serveren (i dette eksemplet — http://185.19.30.175:8080) om plasseringen og versjonen av det siste bildet som inneholder funksjonen din.

$ fn deploy --app fnexo .   # kjÞres pÄ lokal maskin fra mappen hellonode

Distribuerer funksjonen til: /.
Distribuerer hellonode til app: fnexo
Oppgradert til versjon 0.0.5
Bygger bilde nfrankel/hellonode:0.0.5 .

Til slutt:

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

{"message":"Hello World"}

Vi bygger vÄr egen serverless basert pÄ Fn
Livssyklus for funksjoner i serverlÞs beregning basert pÄ Fn

Fordeler med serverlÞs beregning pÄ egne ressurser

ServerlĂžs beregning er en praktisk lĂžsning for rask implementering av uavhengige deler av applikasjonen, som samhandler med mer komplekse applikasjoner eller mikrotjenester.

Ofte er dette knyttet til skjulte kostnader ved Ä forplikte seg til en valgt leverandÞr, noe som, avhengig av spesifikke bruksomrÄder og volum, kan fÞre til hÞyere kostnader og lavere fleksibilitet i fremtiden.

Multisky- og hybridcloud-arkitekturer lider ogsÄ i slike tilfeller, da man gjerne kan finne seg i en situasjon der man Þnsker Ä bruke serverlÞs beregning, men pÄ grunn av bedriftspolitikk kan dette vÊre umulig.

Fn er ganske enkelt Ä bruke, kan gi nesten samme FaaS-grensesnitt, med smÄ kostnader. Det fjerner alle forpliktelser til leverandÞrer, og kan installeres lokalt eller hos hvilken som helst Þnsket leverandÞr av skybaserte lÞsninger. Det finnes ogsÄ frihet til Ä velge programmeringssprÄk.

Artikkelen presenterer bare grunnlagene for Fn, men Ă„ lage ditt eget kjĂžringsmiljĂž er ganske enkelt, og den generelle arkitekturen kan utvides med bruk av en Fn-lastbalanserer, eller ved Ă„ plassere Fn bak en proxy for beskyttelse.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster