Fn негізінде өзіміздің серверсіз құру

Fn негізінде өзіміздің серверсіз құру

Серверсіз есептеулер бұлтты есептеулердегі ең көрнекті трендтердің бірі болып табылады. Негізгі жұмыс принципі инфрақұрылым DevOps емес, қызмет провайдеріне қатысты. Ресурстарды масштабтау жүктеуге автоматты түрде реттеледі және өзгеру жылдамдығы жоғары.

Тағы бір жалпы мүмкіндік - кодты азайту және фокустау үрдісі, сондықтан серверсіз есептеулер кейде қызмет ретінде функция (FaaS) деп аталады.

Тарихи түрде, AWS Lambda көмегімен FaaS ұсынатын бірінші бұлттық провайдер Amazon болды, сондықтан аты. Басқа бұлттық қызмет провайдерлері де ұқсас қызметтерді ұсынады:

  • Google ұсынған бұлт функциялары
  • Microsoft корпорациясының Azure функциялары

Бұл компаниялардың барлығы серверсіз есептеулерді, автоматты масштабтауды қамтамасыз етеді және сіз нақты пайдаланатын нәрсе үшін ғана төлейді, бірақ олар тұтынушыларды өздерінің жеке өніміне құлыптайды. Дегенмен, серверсіз есептеулер үшін тегін және ашық бастапқы коды бар баламалар бар. Айта кету керек:

  • Платформа Apache OpenWhisk, IBM инкубаторында әзірленген,
  • Көктемгі бұлт функциялары, жеткілікті бай Spring Framework экожүйесінің бөлігі ретінде, оны AWS Lambda, Azure Functions және OpenWhisk үшін қасбет ретінде де пайдалануға болады,
  • Жоба Fn, Oracle қолдауымен.

Олардың барлығы бұлттардан толығымен тәуелсіз, яғни оларды кез келген бұлтқа, соның ішінде жеке, жалпыға ортақ немесе жеке және, әрине, Exoscale-де орнатуға болады.

Fn жобасы қалай жұмыс істейді

Fn толығымен Docker-ге негізделген, екі негізгі компоненттен тұрады:

  • CLI бағдарламасы Fn инфрақұрылымының барлық аспектілерін басқаруға арналған және Fn серверімен өзара әрекеттеседі,
  • Fn серверінің өзі Docker контейнерінде жинақталған кәдімгі қолданба.

Fn-де орналастырылған функциялар да бөлек контейнерлерде орындалады, бұл көптеген бағдарламалау тілдерін қолдауға мүмкіндік береді, мысалы... Clojure!

Функция аргументтері стандартты кіріске (STDIN) беріледі, нәтижелер стандартты шығысқа (STDOUT) жазылады. Егер аргументтер немесе қайтарылатын мәндер қарапайым мәндер болмаса (мысалы, JSON нысаны), оларды функцияларды әзірлеу жинағы (FDK) түрінде Fn өзі ұсынған абстракциялық қабат арқылы түрлендіруге болады.

Ыңғайлы болу үшін әртүрлі тілдер мен олардың нұсқаларының (Go, Java, Python әртүрлі нұсқалары және т.

Мына диаграмманы орындау арқылы FaaS құру оңай:

  • Fn CLI арқылы функцияны қолдану: таңдалған үлгі негізінде Fn қолданбасының конфигурация файлы жасалады.
  • Біз CLI Fn көмегімен қайтадан өз функциямызды шығарамыз: контейнер кескіні белгілі бір репозиторийге орналастырылады, содан кейін серверге осы кескіннің бар екендігі және орналастырылуы туралы хабарланады.

Fn негізінде өзіміздің серверсіз құру
Функцияларды Fn-ге жеткізу принципі

Серверсіз функцияларды жергілікті орнату және сынау

Жергілікті компьютерде Fn орнатуды бастайық. Біріншіден, Fn талап еткендей Docker орнатылады. Біз 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

Homebrew орнатылған OSX жүйесінде болсаңыз, басқа жолмен жүре аласыз:

$ 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 үшін қажетті параметрлерді қамтиды және сіз таңдаған тілдегі код үлгісін орнатады.

Түйіннің орындалу уақыты жағдайында бұл мынаны білдіреді:

$ 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 CLI файлды іздейді 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 арқылы функция тікелей емес, атына сәйкес функция шақыруын «бастайтын» триггер деп аталатын арқылы шақырылады. Триггерлер ішінде анықталған `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 жариялау уақыты келді!

Өзіңіздің инфрақұрылымыңызда серверсіз функция қызметтерін орнату

Exoscale CLI көмегімен виртуалды машинаны жылдам орнатайық. Егер сіз оны әлі орнатпасаңыз, пайдалана аласыз біздің жылдам бастау нұсқаулығымыз. Бұл өнімділікті одан да арттыратын керемет құрал. Қауіпсіздік тобында 8080 портын ашу үшін ережені конфигурациялау қажет екенін ұмытпаңыз! Келесі пәрмендер біздің функцияларды орналастыруға дайын таза виртуалды машинаны іске қосады:

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

Fn негізінде өзіміздің серверсіз құру
Fn негізіндегі серверсіз есептеулердегі функцияның өмірлік циклі

Өз мүмкіндігіңізде серверсіз есептеудің артықшылықтары

Серверсіз есептеулер күрделірек қосымшалармен немесе микросервистермен әрекеттесетін қолданбаның тәуелсіз бөліктерін жылдам іске асыруға арналған ыңғайлы шешім болып табылады.

Бұл көбінесе таңдалған жеткізушіге құлыптаудың жасырын құнына байланысты, ол нақты пайдалану жағдайы мен көлеміне байланысты болашақта жоғары шығындарға және икемділіктің төмендеуіне әкелуі мүмкін.

Бұл жағдайда көп бұлтты және гибридті бұлт архитектуралары да зардап шегеді, өйткені сіз серверсіз есептеулерді пайдаланғыңыз келетін жағдайда оңай таба аласыз, бірақ корпоративтік саясатқа байланысты бұл мүмкін болмауы мүмкін.

Fn пайдалану өте оңай және аз шығынмен бірдей дерлік FaaS интерфейсін қамтамасыз ете алады. Ол кез келген жеткізушінің құлыпталуын болдырмайды және жергілікті жерде немесе сіз таңдаған кез келген ыңғайлы бұлттық шешім провайдерінде орнатылуы мүмкін. Бағдарламалау тілін таңдауда да еркіндік бар.

Бұл мақала тек Fn негіздерін қамтиды, бірақ өзіңіздің жұмыс уақытыңызды жасау өте қарапайым және жалпы архитектураны Fn жүктеме теңестірушісі арқылы немесе Fn проксиін қорғау үшін проксидің артына орналастыру арқылы кеңінен қолдануға болады.

Ақпарат көзі: www.habr.com

пікір қалдыру