Oman palvelimettoman rakentaminen Fn:n perusteella

Oman palvelimettoman rakentaminen Fn:n perusteella

Palvelimeton laskenta on yksi pilvitekniikan näkyvimmistä trendeistä. Toimintaperiaate on, että infrastruktuuri ei ole DevOpsin vaan palveluntarjoajan huolen. Resurssien skaalaus mukautuu automaattisesti kuormitukseen, ja sen muutosnopeus on suuri.

Toinen yleinen piirre on pyrkimys minimoida ja tarkentaa koodia, minkä vuoksi palvelimetonta tietojenkäsittelyä kutsutaan joskus palveluksi (FaaS).

Historiallisesti ensimmäinen pilvipalveluntarjoaja, joka tarjosi FaaS:n AWS Lambdan kanssa, oli Amazon, mistä myös nimi. Myös muut pilvipalveluntarjoajat tarjoavat samanlaisia:

  • Googlen pilvitoiminnot
  • Azure Functions Microsoftilta

Kaikki nämä yritykset tarjoavat palvelimetonta tietojenkäsittelyä, automaattista skaalausta ja maksavat vain siitä, mitä todella käytät, mutta ne lukitsevat asiakkaat omiin tuotteisiinsa. Palvelimettomaan tietokoneeseen on kuitenkin olemassa ilmaisia ​​ja avoimen lähdekoodin vaihtoehtoja. On syytä huomata:

  • Alusta Apache OpenWhiskIBM:n hautomossa kehittämä,
  • Kevään pilvitoiminnot, osana melko rikasta Spring Framework -ekosysteemiä, jota voidaan käyttää myös AWS Lambdan, Azure Functionsin ja OpenWhiskin julkisivuna,
  • Projekti Fn, jota Oracle tukee.

Ne kaikki ovat täysin pilvistä riippumattomia, eli ne voidaan asentaa mihin tahansa pilveen, mukaan lukien omasi, julkiset tai yksityiset, ja tietysti Exoscale-sovellukseen.

Kuinka Fn-projekti toimii

Fn perustuu täysin Dockeriin, ja se koostuu kahdesta pääkomponentista:

  • CLI-ohjelma, joka on suunniteltu hallitsemaan kaikkia Fn-infrastruktuurin osa-alueita ja on vuorovaikutuksessa Fn-palvelimen kanssa,
  • Itse Fn-palvelin on tavallinen sovellus, joka on pakattu Docker-säilöön.

Fn:ssä käyttöönotetut toiminnot suoritetaan myös erillisissä konteissa, jolloin voit tukea monia ohjelmointikieliä, esimerkiksi... Clojure!

Funktioargumentit välitetään standardituloon (STDIN), tulokset kirjoitetaan standardilähtöön (STDOUT). Jos argumentit tai palautusarvot eivät ole yksinkertaisia ​​arvoja (kuten JSON-objekti), ne voidaan muuntaa käyttämällä Fn:n itsensä tarjoamaa abstraktiokerrosta Function Development Kitin (FDK) muodossa.

Mukavuussyistä tarjotaan sisäänrakennettuja mallisarjoja, jotka helpottavat FaaS:n käyttöönottoa laajalla luettelolla eri kielistä ja niiden versioista (Go, Java-, Python-versiot jne.).

FaaS:n luominen on helppoa seuraamalla tätä kaaviota:

  • Toiminnon käyttöönotto Fn CLI:n avulla: Fn:lle luodaan sovelluksen määritystiedosto valitun mallin perusteella.
  • Otamme käyttöön oman toimintomme, jälleen CLI Fn:n avulla: konttikuva sijoitetaan tiettyyn arkistoon, jonka jälkeen palvelimelle ilmoitetaan tämän kuvan olemassaolosta ja sijainnista.

Oman palvelimettoman rakentaminen Fn:n perusteella
Periaate funktioiden toimittamisesta Fn:lle

Palvelimettomien toimintojen paikallinen asennus ja testaus

Aloitetaan Fn:n asentaminen paikalliselle koneelle. Ensin asennetaan Docker, kuten Fn vaatii. Olettaen, että olemme Debianissa/Ubuntussa:

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

Tai käytä paketinhallintaa/Docker-koontiversiota järjestelmäsi mukaan. Sitten voit siirtyä suoraan Fn CLI:n asentamiseen. Esimerkiksi curl-toiminnolla:

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

Jos käytät OSX:ää ja Homebrew on asennettuna, voit toimia toisin:

$ 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

Olemme nyt valmiita ottamaan toimintomme käyttöön CLI:n avulla. Yksinkertaisuuden vuoksi käytämme sisäänrakennettua käynnistysympäristöä, kuten Node:

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

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

Uusi hakemisto luodaan hellonode kehittääksemme edelleen Fn-toimintoamme joidenkin perusasetustiedostojen avulla. Äskettäin luodun hakemiston sisällä voit luoda sovelluksesi valitsemasi kielen tai ajonaikaisten standardien mukaisesti:

# Каталог с 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 luo alkuperäisen projektin rakenteen, luo tiedoston func.yaml, joka sisältää tarvittavat Fn-asetukset, ja asettaa mallin koodille valitsemallasi kielellä.

Solmun suoritusajan tapauksessa tämä tarkoittaa:

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

Nyt testaamme nopeasti toimintaamme paikallisesti nähdäksemme, kuinka kaikki toimii.

Ensin käynnistämme Fn-palvelimen. Kuten jo mainittiin, Fn-palvelin on Docker-säiliö, joten käynnistyksen jälkeen se menee ja ottaa kuvan Docker-rekisteristä.

$ 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

Toimintomme suorittamiseksi se on "käännettävä". Tämä vaatii имя приложения: Fn:ssä kaikki sovellukset on määritettävä nimiavaruuksiksi toisiinsa liittyville funktioille.

Fn CLI etsii tiedostoa func.yaml nykyisessä hakemistossa, jota käytetään toiminnon määrittämiseen. Joten ensin sinun täytyy mennä hakemistoomme 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

Kuten näet komennon lähdöstä, luodaan uusi Docker-säiliökuva, joka sisältää funktiomme. Funktio on valmis kutsuttavaksi, ja meillä on kaksi tapaa tehdä se:

  • käyttämällä Fn-komentoa invoke
  • soittamalla suoraan kautta http

puhelu invoke Fn:n kautta se yksinkertaisesti emuloi työtä HTTP:n kautta testeihin, mikä on kätevää nopeaan testaukseen:

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

{"message":"Hello World"}

Jotta voit kutsua funktiota suoraan, sinun on tiedettävä koko URL-osoite:

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

{"message":"Hello World"}

Fn-palvelin paljastaa toimintonsa portissa 8080 ja funktion URL näyttää vastaavan mallia t/app/function, mutta ei kokonaan. HTTP:n kautta funktiota ei kutsuta suoraan, vaan ns. triggerin kautta, joka nimensä mukaan "aloittaa" funktiokutsun. Triggerit on määritelty kohdassa `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 триггера

Voimme muuttaa triggerin nimen vastaamaan funktion nimeä, tämä yksinkertaistaa kaikkea:

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

Sitten suoritamme funktion toimituksen uudelleen ja kutsumme sitä uudesta triggeristä:

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

{"message":"Hello World"}

Kaikki toimii! On aika siirtyä täysimittaisiin kokeiluihin ja julkaista FaaS palvelimella!

Palvelimettomien toimintopalvelujen asentaminen omaan infrastruktuuriin

Asennataan nopeasti virtuaalikone Exoscale CLI:n avulla. Jos et ole vielä määrittänyt sitä, voit käyttää sitä pika-aloitusoppaamme. Tämä on hieno työkalu, joka lisää tuottavuuttasi entisestään. Älä unohda, että sinun on määritettävä sääntö portin 8080 avaamiseksi suojausryhmässä! Seuraavat komennot käynnistävät puhtaan virtuaalikoneen, joka on valmis isännöimään toimintojamme:

$ 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

Sitten voit siirtää ssh:n virtuaalikoneeseen ja asentaa Fn-etäpalvelimen:

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

Asenna sitten Docker ja Fn-palvelin samalla tavalla kuin jo tehtiin paikalliselle koneelle, käynnistä palvelin:

$ 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 vastaanottamaan toimintoja! Kohdennettuun toimintojen siirtoon etäpalvelimelle käytämme komentoa deploy paikalliselta tietokoneelta jättämällä pois lipun --local.

Lisäksi Fn edellyttää, että määrität Fn-palvelimen ja Docker-rekisterin sijainnin. Nämä asetukset voidaan asettaa ympäristömuuttujien kautta FN_API_URL и FN_REGISTRY mutta tarjoaa myös kätevämmän tavan hallita helposti käyttöönoton kokoonpanojen luomista ja hallintaa.

Fn-termeillä käyttöönoton konfiguraatiota kutsutaan context. Seuraava komento luo kontekstin:

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

Voit tarkastella käytettävissä olevia konteksteja seuraavasti:

$ fn list contexts

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

Ja vaihda juuri luotuun kontekstiin näin:

 $ fn use context exoscale

 Now using context: exoscale

Tästä eteenpäin Fn-ominaisuuden toimitus lataa Docker-kuvat valitulla DockerHub-tilillä (minun tapauksessani - nfrankel) ja ilmoita sitten etäpalvelimelle (tässä esimerkissä - http://185.19.30.175:8080) toimintosi sisältävän uusimman kuvan sijainnista ja versiosta.

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

Lopuksi:

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

{"message":"Hello World"}

Oman palvelimettoman rakentaminen Fn:n perusteella
Toiminnan elinkaari Fn-pohjaisessa palvelimettomassa tietojenkäsittelyssä

Palvelittoman tietojenkäsittelyn edut omalla kapasiteetillasi

Palvelimeton tietojenkäsittely on kätevä ratkaisu sovelluksen itsenäisten osien nopeaan toteuttamiseen, jotka ovat vuorovaikutuksessa monimutkaisempien sovellusten tai mikropalvelujen kanssa.

Tämä johtuu usein piilokustannuksista, joita aiheutuu valittuun toimittajaan kiinnittymisestä, mikä voi erityisestä käyttötapauksesta ja määrästä riippuen johtaa korkeampiin kustannuksiin ja joustavuuden vähenemiseen tulevaisuudessa.

Myös monipilvi- ja hybridipilviarkkitehtuurit kärsivät tässä tapauksessa, koska voit helposti joutua tilanteeseen, jossa haluaisit käyttää palvelimetonta laskemista, mutta yrityskäytäntöjen vuoksi se ei välttämättä ole mahdollista.

Fn on melko helppokäyttöinen ja voi tarjota lähes saman FaaS-rajapinnan pienellä lisäkululla. Se eliminoi toimittajan lukkiutumisen, ja se voidaan asentaa paikallisesti tai mihin tahansa sopivaan valitsemaasi pilviratkaisujen tarjoajaan. Ohjelmointikielen valinnassa on myös vapautta.

Tämä artikkeli kattaa vain Fn:n perusteet, mutta oman suoritusajan luominen on melko yksinkertaista, ja yleistä arkkitehtuuria voidaan ottaa käyttöön laajemmin käyttämällä Fn-kuormitustasainta tai sijoittamalla Fn suojauksen välityspalvelimen taakse.

Lähde: will.com

Lisää kommentti