Konstruante nian propran senservilon bazitan sur Fn

Konstruante nian propran senservilon bazitan sur Fn

Senservila komputado estas unu el la plej elstaraj tendencoj en nuba komputado. La baza funkcia principo estas, ke infrastrukturo ne estas la zorgo de DevOps, sed de la servoprovizanto. Rimedo-skalado aŭtomate ĝustigas por ŝarĝi kaj havas altan rapidecon de ŝanĝo.

Alia komuna trajto estas la tendenco minimumigi kaj fokusigi kodon, tial senservila komputado foje estas nomita funkcio kiel servo (FaaS).

Historie, la unua nuba provizanto kiu ofertis FaaS kun AWS Lambda estis Amazon, tial la nomo. Aliaj nubaj servoprovizantoj ankaŭ ofertas similajn:

  • Nubaj Funkcioj de Google
  • Azure Funkcioj de Microsoft

Ĉiuj ĉi tiuj kompanioj disponigas senservilan komputadon, aŭtomatan skalon kaj nur pagas por tio, kion vi efektive uzas, sed ili ŝlosas klientojn en sian proprietan produkton. Tamen, ekzistas liberaj kaj malfermfontaj alternativoj por senservila komputado. Indas noti:

  • platformo Apache OpenWhisk, evoluigita en inkubatoro fare de IBM,
  • Printempaj Nubaj Funkcioj, kiel parto de sufiĉe riĉa Spring Framework-ekosistemo, kiu ankaŭ povas esti uzata kiel fasado por AWS Lambda, Azure Functions kaj OpenWhisk,
  • Projekto Fn, subtenata de Oracle.

Ĉiuj ili estas tute sendependaj de nuboj, tio estas, ili povas esti instalitaj en ajna nubo, inkluzive de via propra, publika aŭ privata, kaj kompreneble en Exoscale.

Kiel funkcias la projekto Fn

Fn estas tute bazita sur Docker, konsistas el du ĉefaj komponentoj:

  • CLI-programo dizajnita por administri ĉiujn aspektojn de la Fn-infrastrukturo, kaj interagas kun la Fn-servilo,
  • La Fn-servilo mem estas regula aplikaĵo pakita en Docker-ujo.

La funkcioj deplojitaj en Fn ankaŭ estas ekzekutitaj en apartaj ujoj, kio permesas vin subteni multajn programlingvojn, ekzemple... Clojure!

Funkciaj argumentoj estas pasigitaj al norma enigo (STDIN), rezultoj estas skribitaj al norma eligo (STDOUT). Se la argumentoj aŭ revenaj valoroj ne estas simplaj valoroj (kiel ekzemple JSON-objekto), ili povas esti konvertitaj per abstrakta tavolo provizita de Fn mem en la formo de Funkcia Disvolviĝo (FDK).

Por komforto, enkonstruitaj aroj de ŝablonoj estas ofertitaj por faciligi la disfaldiĝon de FaaS en ampleksa listo de malsamaj lingvoj kaj iliaj versioj (Go, malsamaj versioj de Java, Python, ktp.).

Krei FaaS estas facila sekvante ĉi tiun diagramon:

  • Deploji la funkcion uzante la Fn CLI: aplikaĵa agorda dosiero por Fn estas kreita surbaze de la elektita ŝablono.
  • Ni lanĉas nian propran funkcion, denove uzante CLI Fn: la ujo-bildo estas metita en certan deponejon, post kio la servilo estas sciigita pri la ekzisto kaj lokigo de ĉi tiu bildo.

Konstruante nian propran senservilon bazitan sur Fn
La principo de liverado de funkcioj al Fn

Loka instalado kaj testado de senservilaj funkcioj

Ni komencu instali Fn sur la loka maŝino. Unue, Docker estas instalita, kiel postulas Fn. Supozante ke ni estas sur Debian/Ubuntu:

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

Aŭ uzu pakaĵmanaĝeron/Docker-konstruaĵon laŭ via sistemo. Tiam vi povas iri rekte al instalo de la Fn CLI. Ekzemple, uzante buklon:

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

Se vi estas en OSX kun Homebrew instalita, vi povas iri la alian vojon:

$ 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

Ni nun pretas komence deploji nian funkcion uzante la CLI. Por simpleco, ni uzos enkonstruitan lanĉan medion, kiel Node:

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

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

Nova dosierujo estos kreita hellonode por plue evoluigi nian Fn-funkcion kun kelkaj bazaj agordaj dosieroj. Ene de la lastatempe kreita dosierujo, vi povas krei vian aplikaĵon laŭ la normoj de via elektita lingvo aŭ rultempo:

# Каталог с 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 kreas la komencan projektostrukturon, kreas dosieron func.yaml, enhavanta la necesajn agordojn por Fn, kaj fiksas la ŝablonon por la kodo en la lingvo, kiun vi elektis.

En la kazo de la Node rultempo, tio signifas:

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

Nun ni rapide testos nian funkcion loke por vidi kiel ĉio funkcias.

Unue, ni komencos la Fn-servilon. Kiel jam menciite, la Fn-servilo estas Docker-ujo, do post ekfunkciigo, ĝi iros kaj prenos la bildon el la Docker-registro.

$ 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

Por ruli nian funkcion, ĝi devas esti "elvolvita". Ĉi tio postulas имя приложения: En Fn, ĉiuj aplikaĵoj devas esti specifitaj kiel nomspacoj por rilataj funkcioj.

Fn CLI serĉos la dosieron func.yaml en la nuna dosierujo, kiu estos uzata por agordi la funkcion. Do unue vi devas iri al nia dosierujo 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

Kiel vi povas vidi el la komanda eligo, nova Docker-ujo-bildo estas kreita enhavanta nian funkcion. La funkcio estas preta por esti vokita, kaj ni havas du manierojn fari ĝin:

  • uzante la komandon Fn invoke
  • voki rekte per http

Defio invoke per Fn ĝi simple imitas laboron per HTTP por testoj, kio estas oportuna por rapida testado:

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

{"message":"Hello World"}

Por voki funkcion rekte, vi devas scii la plenan URL:

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

{"message":"Hello World"}

La Fn-servilo elmontras siajn funkciojn sur haveno 8080 kaj la funkcio URL ŝajnas kongrui kun la ŝablono t/app/function, sed ne tute. Per HTTP, funkcio ne estas vokita rekte, sed per tiel nomata ellasilo, kiu, laŭ sia nomo, "komencas" la funkciovokon. ellasiloj estas difinitaj en `func.yml projekto:

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

Ni povas ŝanĝi la ellasilnomon por kongrui kun la funkcionomo, ĉi tio simpligos ĉion:

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

Tiam ni denove rulas la funkcion liveron kaj vokas ĝin de nova ellasilo:

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

{"message":"Hello World"}

Ĉio funkcias! Estas tempo pluiri al plenskalaj eksperimentoj kaj publikigi nian FaaS sur la servilo!

Instalante senservilajn funkcioservojn sur via propra infrastrukturo

Ni rapide instalu virtualan maŝinon uzante la Exoscale CLI. Se vi ankoraŭ ne agordis ĝin, vi povas uzi nia rapida komenca gvidilo. Ĉi tio estas bonega ilo, kiu eĉ pli pliigos vian produktivecon. Ne forgesu, ke vi devas agordi regulon por malfermi la havenon 8080 en la Sekureca Grupo! La sekvaj komandoj lanĉos puran virtualan maŝinon, pretan por gastigi niajn funkciojn:

$ 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

Tiam vi povas ssh en la virtualan maŝinon kaj instali la foran Fn-servilon:

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

Poste instalu Docker kaj la Fn-servilon en la sama maniero kiel estis jam farita sur la loka maŝino, lanĉu la servilon:

$ 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 pretas ricevi funkciojn! Por celita translokigo de funkcioj al fora servilo, ni uzos la komandon deploy de la loka komputilo preterlasante la flagon --local.

Krome, Fn postulas, ke vi specifu la lokon de la Fn-servilo kaj Docker-registro. Ĉi tiuj opcioj povas esti agorditaj per medio-variabloj FN_API_URL и FN_REGISTRY respektive, sed ankaŭ ofertas pli oportunan manieron facile administri la kreadon kaj administradon de agordoj por deplojo.

En Fn terminoj, la agordo por deplojo estas nomita context. La sekva komando kreos la kuntekston:

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

Vi povas vidi la disponeblajn kuntekstojn tiel:

$ fn list contexts

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

Kaj ŝanĝu al la kunteksto ĵus kreita tiel:

 $ fn use context exoscale

 Now using context: exoscale

De ĉi tie, la livero de la funkcio Fn elŝutos Docker-bildojn uzante la elektitan DockerHub-konton (en mia kazo - nfrankel), kaj poste sciigu la foran servilon (en ĉi tiu ekzemplo - http://185.19.30.175:8080) pri la loko kaj versio de la plej nova bildo enhavanta vian funkcion.

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

Fine:

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

{"message":"Hello World"}

Konstruante nian propran senservilon bazitan sur Fn
Funkcia Vivciklo en Fn-Bazita Senservila Komputado

Avantaĝoj de senservila komputado laŭ via propra kapablo

Senservila komputado estas oportuna solvo por rapide efektivigi sendependajn partojn de aplikaĵo, kiuj interagas kun pli kompleksaj aplikoj aŭ mikroservoj.

Ĉi tio ofte estas pro la kaŝita kosto de enŝlosado al la elektita vendisto, kiu, depende de la specifa uzkazo kaj volumeno, povas konduki al pli altaj kostoj kaj reduktita fleksebleco en la estonteco.

Multnubaj kaj hibridaj nubaj arkitekturoj ankaŭ suferas ĉi-kaze, ĉar vi povas facile trovi vin en situacio, kie vi ŝatus uzi senservilan komputadon, sed pro kompaniaj politikoj eble ne eblas.

Fn estas sufiĉe facile uzebla kaj povas disponigi preskaŭ la saman FaaS-interfacon, kun malmulte da superkosto. Ĝi forigas ajnan enŝlosadon de vendisto kaj povas esti instalita loke aŭ en iu ajn oportuna nuba solvprovizanto de via elekto. Ankaŭ estas libereco en la elekto de programlingvo.

Ĉi tiu artikolo nur kovras la bazaĵojn de Fn, sed krei vian propran rultempon estas sufiĉe simpla, kaj la ĝenerala arkitekturo povas esti deplojita pli vaste uzante Fn-ŝarĝbalancilon aŭ metante Fn malantaŭ prokurilon por protekto.

fonto: www.habr.com

Aldoni komenton