Oma serverita ehitamine Fn-i põhjal

Oma serverita ehitamine Fn-i põhjal

Serverita andmetöötlus on pilvandmetöötluse üks silmapaistvamaid suundi. Põhiline toimimispõhimõte on, et infrastruktuur ei ole DevOpsi, vaid teenusepakkuja mure. Ressursi skaleerimine kohandub automaatselt koormusega ja sellel on suur muutuste määr.

Teine levinud tunnus on kalduvus koodi minimeerida ja fokuseerida, mistõttu serverita andmetöötlust nimetatakse mõnikord ka funktsiooniks teenusena (FaaS).

Ajalooliselt oli esimene pilveteenuse pakkuja, kes pakkus FaaS-i koos AWS Lambdaga, Amazon, sellest ka nimi. Sarnaseid teenuseid pakuvad ka teised pilveteenuse pakkujad:

  • Google'i pilvefunktsioonid
  • Microsofti Azure'i funktsioonid

Kõik need ettevõtted pakuvad serverita andmetöötlust, automaatset skaleerimist ja maksavad ainult selle eest, mida tegelikult kasutate, kuid nad lukustavad kliendid oma patenteeritud toote juurde. Siiski on serverita arvutite jaoks tasuta ja avatud lähtekoodiga alternatiive. Tasub märkida:

  • Platvorm Apache OpenWhisk, mille on välja töötanud IBM inkubaatoris,
  • Kevadpilve funktsioonid, osana üsna rikkalikust Spring Frameworki ökosüsteemist, mida saab kasutada ka AWS Lambda, Azure Functionsi ja OpenWhiski fassaadina,
  • Projekt Fn, mida toetab Oracle.

Kõik need on pilvedest täiesti sõltumatud, st neid saab installida igasse pilve, sealhulgas teie enda, avalikku või privaatsesse pilve ja loomulikult Exoscale'i.

Kuidas Fn projekt töötab

Fn põhineb täielikult Dockeril, koosneb kahest põhikomponendist:

  • CLI programm, mis on loodud Fn-infrastruktuuri kõigi aspektide haldamiseks ja suhtleb Fn-serveriga,
  • Fn-server ise on tavaline rakendus, mis on pakitud Dockeri konteinerisse.

Fn-s juurutatud funktsioone täidetakse ka eraldi konteinerites, mis võimaldab toetada paljusid programmeerimiskeeli, näiteks... Clojure!

Funktsiooni argumendid edastatakse standardsisendisse (STDIN), tulemused kirjutatakse standardväljundisse (STDOUT). Kui argumendid või tagastatavad väärtused ei ole lihtsad väärtused (nt JSON-objekt), saab neid teisendada, kasutades abstraktsioonikihti, mille Fn ise pakub funktsioonide arenduskomplekti (FDK) kujul.

Mugavuse huvides pakutakse FaaS-i juurutamise hõlbustamiseks sisseehitatud mallide komplekte erinevates keeltes ja nende versioonides (Go, Java, Python jne erinevad versioonid).

FaaS-i loomine on lihtne, järgides seda diagrammi:

  • Funktsiooni juurutamine Fn CLI abil: valitud malli alusel luuakse Fn jaoks rakenduse konfiguratsioonifail.
  • Käivitame oma funktsiooni, kasutades jällegi CLI Fn: konteineri pilt paigutatakse teatud hoidlasse, misjärel teavitatakse serverit selle pildi olemasolust ja paigutusest.

Oma serverita ehitamine Fn-i põhjal
Funktsioonide Fn-ile edastamise põhimõte

Serverita funktsioonide lokaalne installimine ja testimine

Alustame Fn installimist kohalikku masinasse. Esiteks installitakse Docker, nagu nõuab Fn. Eeldusel, et kasutame Debianit/Ubuntu:

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

Või kasutage oma süsteemile vastavat paketihaldurit/Dockeri konstruktsiooni. Seejärel saate minna otse Fn CLI installimise juurde. Näiteks curl'i kasutamine:

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

Kui kasutate OSX-i ja Homebrew on installitud, võite minna muul viisil.

$ 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

Oleme nüüd valmis oma funktsiooni CLI abil esmalt juurutama. Lihtsuse huvides kasutame sisseehitatud käivituskeskkonda, näiteks Node:

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

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

Luuakse uus kataloog hellonode meie Fn-funktsiooni edasiarendamiseks mõne põhikonfiguratsioonifailiga. Uues kataloogis saate luua oma rakenduse, järgides valitud keele või käitusaja 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 esialgse projekti struktuuri, loob faili func.yaml, mis sisaldab Fn jaoks vajalikke sätteid, ja määrab koodi malli teie valitud keeles.

Sõlme käitusaja puhul tähendab see järgmist:

$ 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 testime oma funktsiooni kiiresti kohapeal, et näha, kuidas kõik töötab.

Esiteks käivitame Fn-serveri. Nagu juba mainitud, on Fn-server Dockeri konteiner, seetõttu läheb see pärast käivitamist ja võtab pildi Dockeri registrist.

$ 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

Meie funktsiooni käivitamiseks tuleb see "välja tõmmata". See nõuab имя приложения: Fn-s tuleb kõik rakendused määrata seotud funktsioonide nimeruumidena.

Fn CLI otsib faili func.yaml praeguses kataloogis, mida funktsiooni konfigureerimiseks kasutatakse. Nii et kõigepealt peate minema meie kataloogi 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

Nagu näete käsu väljundist, luuakse uus Dockeri konteineri pilt, mis sisaldab meie funktsiooni. Funktsioon on kutsumiseks valmis ja meil on selleks kaks võimalust:

  • kasutades käsku Fn invoke
  • otse helistades http

Väljakutse invoke Fn-i kaudu emuleerib see testide jaoks lihtsalt tööd HTTP kaudu, mis on kiireks testimiseks mugav:

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

{"message":"Hello World"}

Funktsiooni otse kutsumiseks peate teadma täielikku URL-i:

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

{"message":"Hello World"}

Fn-server paljastab oma funktsioonid pordis 8080 ja funktsiooni URL näib vastavat mustrile t/app/function, kuid mitte täielikult. HTTP kaudu ei kutsuta funktsiooni otse välja, vaid läbi nn triggeri, mis oma nime järgi funktsioonikutset “käivitab”. Päästikud on määratletud `func.yml projekt:

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

Saame muuta päästiku nime, et see vastaks funktsiooni nimele, see lihtsustab kõike:

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

Seejärel käivitame funktsiooni edastamise uuesti ja kutsume selle uuelt käivitajalt:

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

{"message":"Hello World"}

Kõik töötab! On aeg liikuda täiemahuliste katsete juurde ja avaldada meie FaaS serveris!

Serverita funktsiooniteenuste installimine oma infrastruktuuri

Installime kiiresti virtuaalse masina Exoscale CLI abil. Kui te pole seda veel seadistanud, saate seda kasutada meie kiirjuhend. See on lahe tööriist, mis suurendab teie tootlikkust veelgi. Ärge unustage, et turvarühmas pordi 8080 avamiseks peate konfigureerima reegli! Järgmised käsud käivitavad puhta virtuaalmasina, 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 saate ssh-i virtuaalmasinasse installida ja installida kaug-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)

Seejärel installige Docker ja Fn-server samamoodi nagu kohalikus masinas juba tehti, käivitage server:

$ 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 funktsioonide vastuvõtmiseks valmis! Funktsioonide sihipäraseks ülekandmiseks kaugserverisse kasutame käsku deploy kohalikust arvutist, jättes lipu välja --local.

Lisaks nõuab Fn, et määraksite Fn-serveri ja Dockeri registri asukoha. Neid valikuid saab määrata keskkonnamuutujate kaudu FN_API_URL и FN_REGISTRY vastavalt, vaid pakub ka mugavamat viisi juurutamiseks mõeldud konfiguratsioonide loomise ja haldamise hõlpsaks haldamiseks.

Fn-terminites nimetatakse juurutamise konfiguratsiooni 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 saadaolevaid kontekste järgmiselt:

$ 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ülituge äsja loodud kontekstile järgmiselt:

 $ fn use context exoscale

 Now using context: exoscale

Siit edasi laadib Fn-funktsiooni tarnimine valitud DockerHubi konto abil alla Dockeri pildid (minu puhul - nfrankel) ja teavitage seejärel kaugserverit (selles näites - http://185.19.30.175:8080) teie funktsiooni sisaldava uusima pildi asukoha ja versiooni kohta.

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

Lõpuks:

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

{"message":"Hello World"}

Oma serverita ehitamine Fn-i põhjal
Funktsiooni elutsükkel Fn-põhises serverita andmetöötluses

Serverita andmetöötluse eelised teie enda võimsusel

Serverita andmetöötlus on mugav lahendus rakenduse iseseisvate osade kiireks juurutamiseks, mis suhtlevad keerukamate rakenduste või mikroteenustega.

Selle põhjuseks on sageli valitud müüjaga lukustumise varjatud kulu, mis sõltuvalt konkreetsest kasutusjuhtumist ja mahust võib tulevikus kaasa tuua suuremaid kulusid ja vähenenud paindlikkust.

Antud juhul kannatavad ka mitme pilve- ja hübriidpilvearhitektuurid, sest võid kergesti sattuda olukorda, kus tahaks kasutada serverita andmetöötlust, kuid ettevõtte poliitika tõttu ei pruugi see võimalik olla.

Fn-i on üsna lihtne kasutada ja see võib pakkuda peaaegu sama FaaS-i liidest, vähese üldkuluga. See välistab igasuguse tarnija lukustumise ja selle saab installida kohapeal või teie valitud mugavasse pilvelahenduste pakkujasse. Vabadus on ka programmeerimiskeele valikul.

See artikkel hõlmab ainult Fn põhitõdesid, kuid oma käitusaja loomine on üsna lihtne ja üldist arhitektuuri saab laiemalt juurutada, kasutades Fn koormuse tasakaalustajat või asetades Fn kaitseks puhverserveri taha.

Allikas: www.habr.com

Lisa kommentaar