Fn дээр суурилсан өөрийн сервергүй системийг бий болгох

Fn дээр суурилсан өөрийн сервергүй системийг бий болгох

Сервергүй тооцоолол нь үүлэн тооцооллын хамгийн алдартай чиг хандлагын нэг юм. Үйл ажиллагааны үндсэн зарчим бол дэд бүтэц нь DevOps-ийн асуудал биш, харин үйлчилгээ үзүүлэгчийн асуудал юм. Нөөцийн масштаб нь ачааллыг автоматаар тохируулдаг бөгөөд өөрчлөлтийн өндөр хурдтай байдаг.

Өөр нэг нийтлэг шинж чанар бол кодыг багасгах, анхаарлаа төвлөрүүлэх хандлага юм, иймээс сервергүй тооцооллыг заримдаа үйлчилгээ (FaaS) гэж нэрлэдэг.

Түүхээс харахад AWS Lambda-тай FaaS-ийг санал болгосон анхны үүл үйлчилгээ үзүүлэгч нь Амазон байсан тул нэрээ авчээ. Бусад үүл үйлчилгээ үзүүлэгчид мөн ижил төстэй үйлчилгээг санал болгодог:

  • Google-ийн үүлэн функцууд
  • Microsoft-ын Azure функцууд

Эдгээр бүх компаниуд сервергүй тооцоолол, автомат масштабаар хангадаг бөгөөд зөвхөн таны ашиглаж байгаа зүйлийнхээ төлбөрийг төлдөг боловч үйлчлүүлэгчдийг өөрсдийн өмчлөлийн бүтээгдэхүүнд түгждэг. Гэсэн хэдий ч сервергүй тооцоолох үнэгүй, нээлттэй эхийн хувилбарууд байдаг. Үүнийг тэмдэглэх нь зүйтэй:

  • Платформ Apache OpenWhiskIBM-ийн инкубаторт бүтээгдсэн,
  • Хаврын үүлний функцууд, AWS Lambda, Azure Functions болон OpenWhisk-ийн фасад болгон ашиглаж болох нэлээд баялаг Spring Framework экосистемийн нэг хэсэг болгон,
  • Project Fn, Oracle дэмждэг.

Тэд бүгд үүлнээс бүрэн хамааралгүй, өөрөөр хэлбэл өөрийн, нийтийн болон хувийн гэх мэт ямар ч үүлэнд суулгаж болно, мэдээжийн хэрэг Exoscale-д суулгаж болно.

Fn төсөл хэрхэн ажилладаг

Fn нь бүрэн Docker дээр суурилсан бөгөөд хоёр үндсэн бүрэлдэхүүн хэсгээс бүрдэнэ.

  • CLI програм нь Fn дэд бүтцийн бүх талыг удирдахад зориулагдсан бөгөөд Fn сервертэй харилцах,
  • Fn сервер нь өөрөө Docker контейнерт савлагдсан ердийн программ юм.

Fn-д байршуулсан функцууд нь тусдаа саванд хийгддэг бөгөөд энэ нь танд маш олон програмчлалын хэлийг дэмжих боломжийг олгодог, жишээ нь... Clojure!

Функцийн аргументуудыг стандарт оролт (STDIN) руу дамжуулж, үр дүнг стандарт гаралт (STDOUT) руу бичдэг. Хэрэв аргументууд эсвэл буцаах утгууд нь энгийн утгууд биш бол (JSON объект гэх мэт) тэдгээрийг Fn өөрөө Функц хөгжүүлэх багц (FDK) хэлбэрээр өгсөн хийсвэр давхаргыг ашиглан хөрвүүлж болно.

Тохиромжтой болгохын тулд өөр өөр хэл, тэдгээрийн хувилбаруудын (Go, Java, Python-ийн өөр хувилбарууд гэх мэт) өргөн жагсаалтад FaaS-ийг ашиглахад хялбар болгох зорилгоор суурилуулсан загваруудыг санал болгож байна.

Энэ диаграммыг дагаж FaaS үүсгэх нь хялбар байдаг.

  • Fn CLI ашиглан функцийг ашиглах: сонгосон загвар дээр үндэслэн Fn-д зориулсан програмын тохиргооны файлыг үүсгэнэ.
  • Бид CLI Fn-ийг ашиглан өөрийн функцийг дахин ажиллуулж байна: контейнерийн зургийг тодорхой агуулахад байрлуулж, дараа нь серверт энэ зураг байгаа эсэх, байрлуулсан тухай мэдэгдэнэ.

Fn дээр суурилсан өөрийн сервергүй системийг бий болгох
Fn-д функцийг хүргэх зарчим

Сервергүй функцуудыг локал суулгах, турших

Орон нутгийн машин дээр Fn суулгаж эхэлцгээе. Эхлээд Fn-ийн шаардлагын дагуу Docker суулгасан. Бид Debian/Ubuntu дээр байгаа гэж үзвэл:

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

Эсвэл өөрийн системд тохируулан багц менежер/Докер бүтээцийг ашиглана уу. Дараа нь та шууд 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 функцийн хүргэлт нь сонгосон DockerHub бүртгэлийг ашиглан Docker зургуудыг татаж авах болно (миний хувьд - 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

сэтгэгдэл нэмэх