Fn əsasında öz serverimizi qurmaq

Fn əsasında öz serverimizi qurmaq

Serversiz hesablama bulud hesablamasında ən görkəmli tendensiyalardan biridir. Əsas iş prinsipi odur ki, infrastruktur DevOps-un deyil, xidmət provayderinin qayğısıdır. Resurs miqyası avtomatik olaraq yüklənməyə uyğunlaşır və yüksək dəyişiklik sürətinə malikdir.

Digər ümumi xüsusiyyət kodun minimuma endirilməsi və fokuslanması tendensiyasıdır, buna görə də serversiz hesablama bəzən xidmət kimi funksiya (FaaS) adlanır.

Tarixən, AWS Lambda ilə FaaS təklif edən ilk bulud provayderi Amazon idi, buna görə də ad. Digər bulud xidməti təminatçıları da oxşar təkliflər təklif edirlər:

  • Google-dan Bulud Funksiyaları
  • Microsoft-dan Azure Funksiyaları

Bütün bu şirkətlər serversiz hesablamalar, avtomatik miqyaslama təmin edir və yalnız həqiqətən istifadə etdiyiniz şey üçün ödəyir, lakin müştəriləri öz məhsullarında kilidləyirlər. Bununla belə, serversiz hesablamalar üçün pulsuz və açıq mənbə alternativləri var. Qeyd etmək lazımdır:

  • Platforma Apache OpenWhiskIBM tərəfindən inkubatorda hazırlanmış,
  • Bahar bulud funksiyalarıAWS Lambda, Azure Functions və OpenWhisk üçün fasad kimi də istifadə edilə bilən kifayət qədər zəngin Spring Framework ekosisteminin bir hissəsi kimi,
  • Layihə Fn, Oracle tərəfindən dəstəklənir.

Onların hamısı buludlardan tamamilə müstəqildir, yəni onlar istənilən buludda, o cümlədən öz, ictimai və ya özəl, və əlbəttə ki, Exoscale-də quraşdırıla bilər.

Fn layihəsi necə işləyir

Fn tamamilə Docker-ə əsaslanır, iki əsas komponentdən ibarətdir:

  • Fn infrastrukturunun bütün aspektlərini idarə etmək üçün nəzərdə tutulmuş CLI proqramı və Fn serveri ilə qarşılıqlı əlaqədə,
  • Fn serverinin özü Docker konteynerində qablaşdırılan adi proqramdır.

Fn-də yerləşdirilmiş funksiyalar da ayrıca konteynerlərdə yerinə yetirilir ki, bu da sizə bir çox proqramlaşdırma dillərini dəstəkləməyə imkan verir, məsələn... Clojure!

Funksiya arqumentləri standart girişə (STDIN) ötürülür, nəticələr standart çıxışa (STDOUT) yazılır. Arqumentlər və ya qaytarılan dəyərlər sadə dəyərlər deyilsə (məsələn, JSON obyekti), onlar Fn-nin özü tərəfindən Funksiya İnkişafı Dəsti (FDK) şəklində təqdim olunan abstraksiya qatından istifadə etməklə çevrilə bilər.

Rahatlıq üçün, müxtəlif dillərin və onların versiyalarının (Go, Java, Python-un müxtəlif versiyaları və s.) geniş siyahısında FaaS-in yerləşdirilməsini asanlaşdırmaq üçün daxili şablon dəstləri təklif olunur.

Bu diaqrama əməl etməklə FaaS yaratmaq asandır:

  • Fn CLI istifadə edərək funksiyanın yerləşdirilməsi: seçilmiş şablon əsasında Fn üçün proqram konfiqurasiya faylı yaradılır.
  • Yenidən CLI Fn istifadə edərək öz funksiyamızı yayırıq: konteyner şəkli müəyyən bir depoya yerləşdirilir, bundan sonra serverə bu təsvirin mövcudluğu və yerləşdirilməsi barədə məlumat verilir.

Fn əsasında öz serverimizi qurmaq
Funksiyaların Fn-ə çatdırılması prinsipi

Serversiz funksiyaların yerli quraşdırılması və sınaqdan keçirilməsi

Fn-i yerli maşında quraşdırmağa başlayaq. Birincisi, Fn tələb etdiyi kimi Docker quraşdırılır. Debian/Ubuntu-da olduğumuzu fərz etsək:

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

Və ya sisteminizə uyğun olaraq paket meneceri/Docker quruluşundan istifadə edin. Sonra birbaşa Fn CLI-nin quraşdırılmasına keçə bilərsiniz. Məsələn, curl istifadə edərək:

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

Homebrew quraşdırılmış OSX-dəsinizsə, başqa yolla gedə bilərsiniz:

$ 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

İndi CLI-dən istifadə edərək funksiyamızı ilkin olaraq yerləşdirməyə hazırıq. Sadəlik üçün Node kimi daxili işə salma mühitindən istifadə edəcəyik:

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

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

Yeni kataloq yaradılacaq hellonode bəzi əsas konfiqurasiya faylları ilə Fn funksiyamızı daha da inkişaf etdirmək üçün. Yeni yaradılmış kataloq daxilində siz seçdiyiniz dil və ya iş vaxtının standartlarına uyğun olaraq tətbiqinizi yarada bilərsiniz:

# Каталог с 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 ilkin layihə strukturunu yaradır, fayl yaradır func.yaml, Fn üçün lazımi parametrləri ehtiva edir və seçdiyiniz dildə kod üçün şablon təyin edir.

Node iş vaxtı vəziyyətində bu o deməkdir:

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

İndi hər şeyin necə işlədiyini görmək üçün funksiyamızı tez bir zamanda yerli olaraq test edəcəyik.

Əvvəlcə Fn serverini işə salacağıq. Artıq qeyd edildiyi kimi, Fn serveri Docker konteyneridir, ona görə də işə salındıqdan sonra o gedib Docker reyestrindən şəkli götürəcək.

$ 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

Funksiyamızı işə salmaq üçün o, “çıxarılmış” olmalıdır. Bu tələb edir имя приложения: Fn-də bütün proqramlar əlaqəli funksiyalar üçün ad boşluqları kimi göstərilməlidir.

Fn CLI faylı axtaracaq func.yaml funksiyanı konfiqurasiya etmək üçün istifadə olunacaq cari kataloqda. Beləliklə, əvvəlcə kataloqumuza getməlisiniz 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

Komanda çıxışından göründüyü kimi, funksiyamızı ehtiva edən yeni Docker konteyner şəkli yaradılır. Funksiya çağırılmağa hazırdır və bunu etmək üçün iki yolumuz var:

  • Fn əmrindən istifadə edərək invoke
  • vasitəsilə birbaşa zəng http

Çağırış invoke Fn vasitəsilə o, sadəcə tez sınaq üçün əlverişli olan testlər üçün HTTP vasitəsilə işi emulyasiya edir:

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

{"message":"Hello World"}

Bir funksiyaya birbaşa zəng etmək üçün tam URL-i bilməlisiniz:

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

{"message":"Hello World"}

Fn serveri öz funksiyalarını 8080 portunda nümayiş etdirir və funksiyanın URL-i nümunəyə uyğun görünür t/app/function, lakin tamamilə deyil. HTTP vasitəsilə funksiya birbaşa deyil, adına uyğun olaraq funksiya çağırışına “başladan” sözdə tətik vasitəsilə çağırılır. Tətiklər müəyyən edilmişdir `func.yml layihə:

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

Tətik adını funksiya adına uyğunlaşdırmaq üçün dəyişə bilərik, bu, hər şeyi sadələşdirəcək:

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

Sonra funksiyanın çatdırılmasını yenidən işə salırıq və onu yeni bir tətikdən çağırırıq:

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

{"message":"Hello World"}

Hər şey işləyir! Tam miqyaslı təcrübələrə keçməyin və FaaS-imizi serverdə dərc etməyin vaxtıdır!

Öz infrastrukturunuzda serversiz funksiya xidmətlərinin quraşdırılması

Exoscale CLI-dən istifadə edərək virtual maşını tez quraşdıraq. Hələ quraşdırmamısınızsa, istifadə edə bilərsiniz sürətli başlanğıc bələdçimiz. Bu, məhsuldarlığınızı daha da artıracaq gözəl bir vasitədir. Unutmayın ki, Təhlükəsizlik Qrupunda 8080 portunu açmaq üçün bir qayda konfiqurasiya etməlisiniz! Aşağıdakı əmrlər funksiyalarımızı qəbul etməyə hazır olan təmiz virtual maşını işə salacaq:

$ 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

Sonra virtual maşına ssh-ni daxil edə və uzaq Fn serverini quraşdıra bilərsiniz:

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

Sonra Docker və Fn serverini yerli maşında olduğu kimi quraşdırın, serveri işə salın:

$ 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 funksiyaları qəbul etməyə hazırdır! Funksiyaların uzaq bir serverə məqsədyönlü ötürülməsi üçün əmrdən istifadə edəcəyik deploy bayrağı atmaqla yerli kompüterdən --local.

Bundan əlavə, Fn sizdən Fn serverinin və Docker reyestrinin yerini təyin etməyi tələb edir. Bu seçimlər mühit dəyişənləri vasitəsilə təyin edilə bilər FN_API_URL и FN_REGISTRY müvafiq olaraq, həm də yerləşdirmə üçün konfiqurasiyaların yaradılması və idarə edilməsini asanlıqla idarə etmək üçün daha rahat üsul təklif edir.

Fn baxımından, yerləşdirmə üçün konfiqurasiya deyilir context. Aşağıdakı əmr kontekst yaradacaq:

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

Mövcud kontekstlərə belə baxa bilərsiniz:

$ fn list contexts

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

Və bu kimi yaradılmış kontekstə keçin:

 $ fn use context exoscale

 Now using context: exoscale

Bundan sonra Fn funksiyasının çatdırılması seçilmiş DockerHub hesabından istifadə edərək Docker şəkillərini endirəcək (mənim vəziyyətimdə - nfrankel) və sonra uzaq serverə bildirin (bu nümunədə - http://185.19.30.175:8080) funksiyanızı ehtiva edən ən son şəklin yeri və versiyası haqqında.

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

Nəhayət:

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

{"message":"Hello World"}

Fn əsasında öz serverimizi qurmaq
Fn əsaslı serversiz hesablamada funksiyanın həyat dövrü

Öz imkanlarınızla serversiz hesablamanın üstünlükləri

Serversiz hesablama daha mürəkkəb proqramlar və ya mikroservislərlə qarşılıqlı əlaqədə olan proqramın müstəqil hissələrini tez bir zamanda həyata keçirmək üçün əlverişli həll yoludur.

Bu, çox vaxt seçilmiş satıcıya bağlanmağın gizli xərcləri ilə bağlıdır ki, bu da konkret istifadə vəziyyətindən və həcmdən asılı olaraq gələcəkdə daha yüksək xərclərə və çevikliyin azalmasına səbəb ola bilər.

Çox buludlu və hibrid bulud arxitekturaları da bu vəziyyətdə əziyyət çəkir, çünki siz serversiz hesablamadan istifadə etmək istədiyiniz vəziyyətdə özünüzü asanlıqla tapa bilərsiniz, lakin korporativ siyasətlərə görə bu mümkün olmaya bilər.

Fn istifadə etmək olduqca asandır və az yüklə demək olar ki, eyni FaaS interfeysini təmin edə bilər. O, hər hansı satıcı kilidini aradan qaldırır və yerli olaraq və ya seçdiyiniz istənilən rahat bulud həlli provayderində quraşdırıla bilər. Proqramlaşdırma dilini seçməkdə də sərbəstlik var.

Bu məqalə yalnız Fn-in əsaslarını əhatə edir, lakin öz iş vaxtınızı yaratmaq olduqca sadədir və ümumi arxitektura Fn yük balanslaşdırıcısından istifadə etməklə və ya Fn-i qorunmaq üçün proksi arxasına yerləşdirməklə daha geniş şəkildə tətbiq oluna bilər.

Mənbə: www.habr.com

Добавить комментарий