Fn-ga asoslangan o'z serversiz tizimimizni yaratish

Fn-ga asoslangan o'z serversiz tizimimizni yaratish

Serversiz hisoblash bulutli hisoblashning eng mashhur tendentsiyalaridan biridir. Asosiy ishlash printsipi shundaki, infratuzilma DevOpsni emas, balki xizmat ko'rsatuvchi provayderni tashvishga soladi. Resurs miqyosi yuklanishga avtomatik moslashtiriladi va yuqori o'zgarish tezligiga ega.

Yana bir umumiy xususiyat - kodni minimallashtirish va fokuslash tendentsiyasidir, shuning uchun serversiz hisoblash ba'zan xizmat sifatida funktsiya (FaaS) deb ataladi.

Tarixiy jihatdan, AWS Lambda bilan FaaS-ni taklif qilgan birinchi bulutli provayder Amazon bo'lgan, shuning uchun bu nom. Boshqa bulutli xizmat ko'rsatuvchi provayderlar ham shunga o'xshashlarni taklif qilishadi:

  • Google'dan bulutli funksiyalar
  • Microsoft-dan Azure funktsiyalari

Bu kompaniyalarning barchasi serversiz hisob-kitoblarni, avtomatik masshtablashni ta'minlaydi va faqat siz foydalanadigan narsa uchun to'laydi, lekin ular mijozlarni o'zlarining mulkiy mahsulotiga qulflaydilar. Biroq, serversiz hisoblash uchun bepul va ochiq manbali alternativalar mavjud. Shuni ta'kidlash kerak:

  • Platforma Apache OpenWhisk, IBM tomonidan inkubatorda ishlab chiqilgan,
  • Bahor buluti funktsiyalari, AWS Lambda, Azure Functions va OpenWhisk uchun fasad sifatida ham foydalanish mumkin bo'lgan juda boy Spring Framework ekotizimining bir qismi sifatida,
  • Loyiha Fn, Oracle tomonidan qo'llab-quvvatlanadi.

Ularning barchasi bulutlardan mutlaqo mustaqildir, ya'ni ularni istalgan bulutga, shu jumladan o'zingizning, umumiy yoki shaxsiy bulutlarga va albatta Exoscale-ga o'rnatish mumkin.

Fn loyihasi qanday ishlaydi

Fn butunlay Docker-ga asoslangan, ikkita asosiy komponentdan iborat:

  • Fn infratuzilmasining barcha jihatlarini boshqarish uchun mo'ljallangan CLI dasturi va Fn serveri bilan o'zaro ta'sir qiladi,
  • Fn serverining o'zi Docker konteyneriga joylashtirilgan oddiy dasturdir.

Fn-da o'rnatilgan funksiyalar ham alohida konteynerlarda bajariladi, bu sizga ko'plab dasturlash tillarini qo'llab-quvvatlash imkonini beradi, masalan... Clojure!

Funktsiya argumentlari standart kirishga (STDIN) uzatiladi, natijalar standart chiqishga (STDOUT) yoziladi. Agar argumentlar yoki qaytarish qiymatlari oddiy qiymatlar bo'lmasa (masalan, JSON ob'ekti), ular Fn tomonidan Funktsiyalarni ishlab chiqish to'plami (FDK) ko'rinishida taqdim etilgan abstraktsiya qatlami yordamida o'zgartirilishi mumkin.

Qulaylik uchun, FaaS-ni turli tillar va ularning versiyalarining (Go, Java, Python-ning turli versiyalari va boshqalar) keng ro'yxatida joylashtirishni osonlashtirish uchun o'rnatilgan andozalar to'plami taklif etiladi.

Ushbu diagrammaga rioya qilish orqali FaaS yaratish oson:

  • Funktsiyani Fn CLI yordamida o'rnatish: tanlangan shablon asosida Fn uchun dastur konfiguratsiya fayli yaratiladi.
  • Biz yana CLI Fn-dan foydalanib, o'z funksiyamizni ishga tushiramiz: konteyner tasviri ma'lum bir omborga joylashtiriladi, shundan so'ng serverga ushbu rasmning mavjudligi va joylashuvi haqida xabar beriladi.

Fn-ga asoslangan o'z serversiz tizimimizni yaratish
Fn ga funktsiyalarni etkazib berish printsipi

Serversiz funktsiyalarni mahalliy o'rnatish va sinovdan o'tkazish

Fn-ni mahalliy kompyuterga o'rnatishni boshlaylik. Birinchidan, Fn talab qilganidek, Docker o'rnatiladi. Biz Debian/Ubuntudamiz deb faraz qilsak:

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

Yoki tizimingizga muvofiq paket menejeri/Docker tuzilmasidan foydalaning. Keyin siz to'g'ridan-to'g'ri Fn CLI-ni o'rnatishga o'tishingiz mumkin. Masalan, curl yordamida:

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

Agar siz Homebrew o'rnatilgan OSX da bo'lsangiz, boshqa yo'l bilan borishingiz mumkin:

$ 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

Endi biz CLI yordamida o'z funktsiyamizni ishga tushirishga tayyormiz. Oddiylik uchun biz o'rnatilgan ishga tushirish muhitidan foydalanamiz, masalan, Node:

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

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

Yangi katalog yaratiladi hellonode ba'zi asosiy konfiguratsiya fayllari bilan Fn funksiyamizni yanada rivojlantirish uchun. Yangi yaratilgan katalog ichida siz tanlagan til yoki ish vaqti standartlari asosida ilovangizni yaratishingiz mumkin:

# Каталог с 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 dastlabki loyiha strukturasini yaratadi, faylni yaratadi func.yaml, Fn uchun kerakli sozlamalarni o'z ichiga oladi va siz tanlagan tildagi kod uchun shablonni o'rnatadi.

Tugun ish vaqti holatida bu quyidagilarni anglatadi:

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

Endi biz hamma narsa qanday ishlashini ko'rish uchun funktsiyamizni tezda sinab ko'ramiz.

Birinchidan, biz Fn serverini ishga tushiramiz. Yuqorida aytib o'tilganidek, Fn serveri Docker konteyneridir, shuning uchun ishga tushirilgandan so'ng, u boradi va Docker registridan tasvirni oladi.

$ 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

Funksiyamizni ishga tushirish uchun uni "tashqariga chiqarish" kerak. Bu talab qiladi имя приложения: Fn-da barcha ilovalar tegishli funktsiyalar uchun nomlar maydoni sifatida ko'rsatilishi kerak.

Fn CLI faylni qidiradi func.yaml funktsiyani sozlash uchun foydalaniladigan joriy katalogda. Shunday qilib, avval siz bizning katalogimizga kirishingiz kerak 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

Buyruqning chiqishidan ko'rinib turibdiki, bizning funktsiyamizni o'z ichiga olgan yangi Docker konteyner tasviri yaratilgan. Funktsiya chaqirishga tayyor va bizda buni amalga oshirishning ikkita usuli bor:

  • Fn buyrug'i yordamida invoke
  • orqali to'g'ridan-to'g'ri qo'ng'iroq qilish http

Qiyinchilik invoke Fn orqali u tezda sinov uchun qulay bo'lgan testlar uchun HTTP orqali ishni taqlid qiladi:

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

{"message":"Hello World"}

Funktsiyani to'g'ridan-to'g'ri chaqirish uchun siz to'liq URL manzilini bilishingiz kerak:

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

{"message":"Hello World"}

Fn serveri o'z funksiyalarini 8080 portda ochadi va funksiya URL manzili naqshga mos keladigan ko'rinadi t/app/function, lekin to'liq emas. HTTP orqali funktsiya to'g'ridan-to'g'ri chaqirilmaydi, balki o'z nomiga ko'ra funktsiya chaqiruvini "boshlaydigan" trigger orqali chaqiriladi. Triggerlar ichida aniqlanadi `func.yml loyiha:

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

Biz trigger nomini funktsiya nomiga mos keladigan tarzda o'zgartirishimiz mumkin, bu hamma narsani soddalashtiradi:

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

Keyin biz funktsiyani etkazib berishni qayta ishga tushiramiz va uni yangi triggerdan chaqiramiz:

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

{"message":"Hello World"}

Hammasi ishlayapti! To'liq miqyosli tajribalarga o'tish va FaaS-ni serverda nashr qilish vaqti keldi!

O'z infratuzilmangizda serversiz funksiya xizmatlarini o'rnatish

Exoscale CLI yordamida virtual mashinani tezda o'rnatamiz. Agar siz hali o'rnatmagan bo'lsangiz, foydalanishingiz mumkin bizning tezkor boshlash qo'llanmamiz. Bu sizning mahsuldorligingizni yanada oshiradigan ajoyib vositadir. Xavfsizlik guruhida 8080 portni ochish uchun qoidani sozlashingiz kerakligini unutmang! Quyidagi buyruqlar bizning funktsiyalarimizni joylashtirishga tayyor bo'lgan toza virtual mashinani ishga tushiradi:

$ 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

Keyin virtual mashinaga ssh-ni kiritishingiz va masofaviy Fn serverini o'rnatishingiz mumkin:

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

Keyin Docker va Fn serverini mahalliy kompyuterda bo'lgani kabi o'rnating, serverni ishga tushiring:

$ 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 funksiyalarni qabul qilishga tayyor! Funktsiyalarni masofaviy serverga maqsadli o'tkazish uchun biz buyruqdan foydalanamiz deploy bayroqni tashlab, mahalliy kompyuterdan --local.

Bundan tashqari, Fn sizdan Fn serveri va Docker registrining joylashuvini ko'rsatishingizni talab qiladi. Ushbu parametrlar muhit o'zgaruvchilari orqali o'rnatilishi mumkin FN_API_URL и FN_REGISTRY mos ravishda, balki joylashtirish uchun konfiguratsiyalarni yaratish va boshqarishni oson boshqarishning qulayroq usulini ham taklif etadi.

Fn so'zlarida joylashtirish uchun konfiguratsiya deyiladi context. Quyidagi buyruq kontekstni yaratadi:

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

Mavjud kontekstlarni quyidagi kabi ko'rishingiz mumkin:

$ fn list contexts

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

Va hozirgina yaratilgan kontekstga o'ting:

 $ fn use context exoscale

 Now using context: exoscale

Bu yerdan boshlab, Fn xususiyati yetkazib berish tanlangan DockerHub hisob qaydnomasi yordamida Docker tasvirlarini yuklab oladi (mening holimda - nfrankel) va keyin masofaviy serverga xabar bering (ushbu misolda - http://185.19.30.175:8080) funksiyangizni o'z ichiga olgan so'nggi rasmning joylashuvi va versiyasi haqida.

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

Nihoyat:

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

{"message":"Hello World"}

Fn-ga asoslangan o'z serversiz tizimimizni yaratish
Fn-ga asoslangan serversiz hisoblashda funktsiyaning hayot aylanishi

O'z imkoniyatlaringiz bo'yicha serversiz hisoblashning afzalliklari

Serversiz hisoblash - bu murakkabroq ilovalar yoki mikroservislar bilan o'zaro aloqada bo'lgan dasturning mustaqil qismlarini tezda amalga oshirish uchun qulay echimdir.

Bu ko'pincha tanlangan sotuvchiga kirishning yashirin narxiga bog'liq bo'lib, bu muayyan foydalanish holati va hajmiga qarab, kelajakda yuqori xarajatlarga va moslashuvchanlikni pasayishiga olib kelishi mumkin.

Ko'p bulutli va gibrid bulutli arxitekturalar ham bu holatda zarar ko'radi, chunki siz serversiz hisoblashdan foydalanmoqchi bo'lgan vaziyatga osongina tushib qolishingiz mumkin, ammo korporativ siyosat tufayli bu mumkin bo'lmasligi mumkin.

Fn-dan foydalanish juda oson va deyarli bir xil FaaS interfeysi bilan ta'minlay oladi, ozgina yuk. U har qanday sotuvchining bloklanishini yo'q qiladi va mahalliy yoki siz tanlagan istalgan qulay bulutli yechim provayderiga o'rnatilishi mumkin. Dasturlash tilini tanlashda ham erkinlik mavjud.

Ushbu maqola faqat Fn asoslarini qamrab oladi, lekin o'z ish vaqtingizni yaratish juda oddiy va umumiy arxitekturani Fn yuk muvozanatlashtiruvchisi yordamida yoki himoya qilish uchun proksi-server orqasiga Fn ni joylashtirish orqali kengroq o'rnatish mumkin.

Manba: www.habr.com

a Izoh qo'shish