Які будуецца ўласны serverless на аснове Fn

Які будуецца ўласны serverless на аснове Fn

Бессерверныя вылічэнні - Адна з найбольш прыкметных тэндэнцый у хмарных вылічэннях. Асноўны прынцып працы складаецца ў тым, што інфраструктура – ​​клопат не DevOps'аў, а пастаўшчыка паслуг. Маштабаванне рэсурсаў аўтаматычна падладжваецца пад нагрузку і валодае высокай хуткасцю змены.

Іншая агульная рыса – тэндэнцыя да мінімізацыі і факусаванні кода, таму бессерверныя вылічэнні часам завуць «функцыя як паслуга» (FaaS).

Гістарычна першым пастаўшчыком хмарных паслуг, які прапанаваў FaaS з AWS Lambda, быў Amazon, адкуль і пайшла гэта назва. Іншыя хмарныя пастаўшчыкі паслуг таксама прапануюць аналагі:

  • Cloud Functions ад кампаніі Google
  • Azure Functions ад Microsoft

Усе гэтыя кампаніі падаюць бессерверныя вылічэнні, аўтаматычнае маштабаванне і аплату толькі фактычна скарыстаных рэсурсаў, але пры гэтым яны прывязваюць кліентаў да свайго прапрыетарнага прадукта. Тым не менш, існуюць бясплатныя альтэрнатывы з адкрытым зыходным кодам для арганізацыі бессерверных вылічэнняў. Варта адзначыць:

  • Платформа Apache OpenWhisk, якая распрацоўваецца ў інкубатары кампаніяй IBM,
  • Spring Cloud Functions, як частка дастаткова багатай экасістэмы Spring Framework, якая таксама можа быць выкарыстана як фасад AWS Lambda, Azure Functions і OpenWhisk,
  • Праект Fn, які падтрымліваецца кампаніяй Oracle.

Усе яны цалкам незалежныя ад аблокаў, гэта значыць усталёўваюцца ў любое воблака, у тым ліку ваша ўласнае, публічнае або прыватнае, і вядома ж у Exoscale.

Як праект Fn уладкованы

Fn цалкам заснаваны на Docker, складаецца з двух асноўных кампанентаў:

  • CLI праграмы, прызначанай для кіравання ўсімі аспектамі інфраструктуры Fn, і якая ўзаемадзейнічае з серверам Fn,
  • Уласна сервер Fn, звычайнае прыкладанне, запакаваная ў кантэйнер для Docker.

Функцыі, якія разгортваюцца ў Fn, гэтак жа выконваюцца ў асобных кантэйнерах, што дазваляе падтрымліваць вельмі шмат моў для праграмавання, напрыклад… Clojure!

Аргументы функцый перадаюцца на стандартны ўвод (STDIN), вынікі пішуцца на стандартную выснову (STDOUT). Елі аргументы або якія вяртаюцца значэнні не з'яўляюцца простымі значэннямі (напрыклад, аб'ект JSON) - яны могуць быць пераўтвораны з дапамогай пласта абстракцыі, які прадстаўляецца самім Fn у выглядзе камплекта распрацоўкі функцый (FDK).

Для зручнасці прапануюцца ўбудаваныя наборы шаблонаў, якія палягчаюць разгортванне FaaS на шырокім спісе розных моў і іх версій (Go, розныя версіі Java, Python і г.д.).

Стварыць FaaS проста, прытрымліваючыся гэтай схеме:

  • Разгортваем функцыю з дапамогай CLI Fn: ствараецца канфігурацыйны файл прыкладання для Fn, заснаваны на абраным шаблоне.
  • Выкочваем уласную функцыю, ізноў жа з дапамогай CLI Fn: выява кантэйнера змяшчаецца ў нейкі рэпазітар, пасля чаго сервер паведамляецца аб існаванні і размяшчэнні гэтай выявы.

Які будуецца ўласны serverless на аснове Fn
Прынцып пастаўкі функцый у Fn

Лакальная ўстаноўка і тэсціраванне бессерверных функцый

Прыступім да ўсталёўкі Fn на лакальнай машыне. Спачатку усталёўваецца Docker, як таго патрабуе Fn. Мяркуецца, што мы на Debian/Ubuntu:

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

Ну або выкарыстоўвайце менеджэр пакетаў / зборку Docker згодна з вашай сістэме. Затым можна перайсці наўпрост да ўсталёўкі Fn CLI. Напрыклад, з дапамогай curl:

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

Калі вы працуеце на OSX з усталяваным Homebrew, можна пайсці іншым шляхам:

$ 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

Цяпер усё гатова для першапачатковага разгортвання нашай функцыі з выкарыстаннем CLI. Для прастаты мы будзем выкарыстоўваць убудаванае асяроддзе для запуску, да прыкладу Node:

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

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

Будзе створаны новы каталог hellonode для далейшай распрацоўкі нашай функцыі Fn з некаторымі асноўнымі канфігурацыйнымі файламі. Усярэдзіне новастворанага каталога вы можаце стварыць ваша прыкладанне, наступнае стандартам абранай вамі мовы ці асяроддзі выканання:

# Каталог с 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 стварае пачатковую структуру праекту, стварае файл func.yaml, які змяшчае неабходныя ўстаноўкі для Fn, і ўстанаўлівае шаблон для кода на мове, які вы выбралі.

У выпадку асяроддзя выканання Node гэта азначае:

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

Цяпер мы па-хуткаму праверым нашу функцыю лакальна, каб убачыць як усё працуе.

Для пачатку мы запусцім сервер Fn. Як ужо было сказанае, сервер Fn уяўляе сабой Docker кантэйнер, такім чынам ён пасля запуску пайдзе і возьме выяву з рэестра Docker.

$ 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

Для запуску нашай функцыі яе трэба "выкаціць". Для гэтага патрабуецца имя приложения: у Fn усе прыкладанні павінны быць зададзены ў выглядзе прастор імёнаў для звязаных функцый.

Fn СLI будзе шукаць файл func.yaml у бягучым каталогу, які будзе прымяняцца для налады функцыі. Так што спачатку трэба перайсці ў наш каталог 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

Як можна ўбачыць з вываду каманды, ствараецца новы вобраз кантэйнера для Docker, які змяшчае нашу функцыю. Функцыя гатова для выкліку, а ў нас ёсць два спосабу зрабіць гэта:

  • выкарыстоўваючы каманду Fn invoke
  • выклікаючы напрамую праз http

выклік invoke праз Fn проста эмулюе працу па HTTP для тэстаў, што зручна для хуткай праверкі:

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

{"message":"Hello World"}

Для таго каб выклікаць функцыю напрамую, трэба ведаць поўны URL:

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

{"message":"Hello World"}

Сервер Fn падае свае функцыі праз порт 8080, і, як здаецца, URL функцыі адпавядае схеме t/app/function, але не цалкам. Праз HTTP функцыя выклікаецца не наўпрост, а праз так званы trigger, які паводле сваёй назвы "запускае" выклік функцыі. Трыгеры вызначаюцца ў `func.yml праекта:

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

Можам памяняць імя трыгера, каб яно адпавядала імю функцыі, гэта ўсё спросціць:

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

Затым запускаем пастаўку функцыі яшчэ раз і выкліканы яе з новага трыгера:

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

{"message":"Hello World"}

Усё працуе! Самы час перайсці да натурных эксперыментаў і апублікаваць наш FaaS на сэрвэры!

Устаноўка сэрвісаў бессерверных функцый на ўласнай інфраструктуры

Давайце па-хуткаму ўсталюем віртуальную машыну выкарыстоўваючы CLI Exoscale. Калі вы яе яшчэ не наладзілі - можна скарыстацца нашым кіраўніцтвам для хуткага запуску. Гэта круты інструмент, які яшчэ больш павысіць вашу прадуктыўнасць. Не забывайце аб тым, што трэба наладзіць правіла для адкрыцця порта 8080 у Security Group! Наступныя каманды запусцяць чыстую віртуальную машыну, гатовую для размяшчэння нашых функцый:

$ 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

Затым можна зайсці па ssh на віртуальную машыну і ўсталяваць выдалены сервер Fn:

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

Затым усталёўваны Docker і сервер Fn таксама, як гэта ўжо рабілася на лакальнай машыне, запускаем сервер:

$ 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 гатовы для атрымання функцый! Для мэтавай перадачы функцый на выдалены сервер будзем выкарыстоўваць каманду deploy з лакальнага кампутара, апускаючы сцяг --local.

Акрамя гэтага, Fn патрабуе паказаць размяшчэнне сервера Fn і рэестра Docker. Гэтыя параметры могуць быць устаноўлены праз зменныя асяроддзі FN_API_URL и FN_REGISTRY адпаведна, але прапануецца і зручнейшы спосаб для лёгкага кіравання стварэннем і кіраваннем канфігурацый для разгортвання.

У тэрмінах Fn канфігурацыя для разгортвання завецца context. Наступная каманда створыць кантэкст:

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

Вы можаце прагледзець даступныя кантэксты так:

$ fn list contexts

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

А пераключыцца на кантэкст, які толькі што быў створаны, так:

 $ fn use context exoscale

 Now using context: exoscale

Пачынаючы з гэтага месца пастаўка функцый Fn будзе загружаць выявы Docker, выкарыстаючы абраны ўліковы запіс на DockerHub (у маім выпадку — nfrankel), пасля чаго апавяшчаць выдалены сервер (у гэтым прыкладзе — http://185.19.30.175:8080) аб месцазнаходжанні і версіі апошняй выявы, які змяшчае вашу функцыю.

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

Урэшце:

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

{"message":"Hello World"}

Які будуецца ўласны serverless на аснове Fn
Жыццёвы цыкл функцыі ў бессерверных вылічэннях на аснове Fn

Перавагі бессерверных вылічэнняў на сваіх магутнасцях

Бессерверныя вылічэнні - зручнае рашэнне для хуткага ўкаранення незалежных частак прыкладання, якія ўзаемадзейнічаюць з больш складанымі прыкладаннямі або мікрасэрвісамі.

Часта гэта злучана з утоеным коштам прывязкі да абранага пастаўшчыка, што, у залежнасці ад пэўнага варыянту выкарыстання і аб'ёму, можа прывесці да больш высокіх выдаткаў і зніжэнню гнуткасці ў будучыні.

Шматвоблачныя і гібрыдныя хмарныя архітэктуры таксама пакутуюць у такім выпадку, бо можна проста апынуцца ў сітуацыі, калі хацелася б выкарыстоўваць бессерверныя вылічэнні, але з-за карпаратыўнай палітыкі гэта можа быць немагчыма.

Fn дастаткова просты ў працы, можа даць амаль такі ж інтэрфейс FaaS, з невялікімі выдаткамі. Ён пазбавіць ад любых прывязак да пастаўшчыка, можна ўсталяваць яго лакальна ці ў любым зручным пастаўшчыку хмарных рашэнняў па свайму выбару. Таксама ёсць свабода ў выбары мовы праграмавання.

У артыкуле прадстаўлены толькі асновы Fn, але стварэнне ўласнага асяроддзя выканання досыць проста, а агульную архітэктуру можна разгарнуць шырэй з выкарыстаннем балансавальніка нагрузкі Fn, ці размяшчаючы Fn за проксі для абароны.

Крыніца: habr.com

Купіць надзейны хостынг для сайтаў з абаронай ад DDoS, VPS VDS серверы 🔥 Купіць надзейны хостынг для сайтаў з абаронай ад DDoS, VPS VDS серверы | ProHoster