ساختن بدون سرور خودمان بر اساس Fn

ساختن بدون سرور خودمان بر اساس Fn

محاسبات بدون سرور یکی از برجسته ترین گرایش ها در رایانش ابری است. اصل عملیاتی اصلی این است که زیرساخت ها دغدغه DevOps نیست، بلکه مربوط به ارائه دهنده خدمات است. مقیاس بندی منابع به طور خودکار با بارگذاری تنظیم می شود و نرخ تغییر بالایی دارد.

یکی دیگر از ویژگی های رایج تمایل به کوچک سازی و تمرکز کد است، به همین دلیل است که محاسبات بدون سرور گاهی اوقات تابع به عنوان یک سرویس (FaaS) نامیده می شود.

از لحاظ تاریخی، اولین ارائه‌دهنده ابری که FaaS را با AWS Lambda ارائه می‌کرد، آمازون بود، از این رو این نام را به خود اختصاص داد. سایر ارائه دهندگان خدمات ابری نیز موارد مشابهی را ارائه می دهند:

  • توابع ابری از گوگل
  • توابع Azure از مایکروسافت

همه این شرکت‌ها محاسبات بدون سرور، مقیاس‌بندی خودکار را ارائه می‌کنند و فقط برای آنچه واقعاً استفاده می‌کنید پرداخت می‌کنند، اما مشتریان را در محصول اختصاصی خود قفل می‌کنند. با این حال، جایگزین های رایگان و منبع باز برای محاسبات بدون سرور وجود دارد. شایان ذکر است:

  • سکو آپاچی 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)، می توان آنها را با استفاده از یک لایه انتزاعی ارائه شده توسط خود Fn در قالب یک کیت توسعه عملکرد (FDK) تبدیل کرد.

برای راحتی، مجموعه‌های داخلی قالب‌ها برای تسهیل استقرار FaaS در فهرست گسترده‌ای از زبان‌های مختلف و نسخه‌های آنها (برو، نسخه‌های مختلف جاوا، پایتون و غیره) ارائه می‌شوند.

ایجاد یک FaaS با دنبال کردن این نمودار آسان است:

  • استقرار تابع با استفاده از Fn CLI: یک فایل پیکربندی برنامه برای Fn بر اساس الگوی انتخاب شده ایجاد می شود.
  • ما عملکرد خود را با استفاده از CLI Fn باز می کنیم: تصویر ظرف در یک مخزن خاص قرار می گیرد و پس از آن سرور از وجود و قرار دادن این تصویر مطلع می شود.

ساختن بدون سرور خودمان بر اساس Fn
اصل ارائه توابع به Fn

نصب و آزمایش محلی توابع بدون سرور

بیایید شروع به نصب Fn در ماشین محلی کنیم. ابتدا Docker نصب می شود، همانطور که Fn نیاز دارد. با فرض اینکه ما در Debian/Ubuntu هستیم:

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

یا از یک Package Manager/Docker build با توجه به سیستم خود استفاده کنید. سپس می توانید مستقیماً به نصب Fn CLI بروید. به عنوان مثال، استفاده از حلقه:

$ 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

برای اجرای تابع ما، باید آن را "roll out" کنیم. این نیاز دارد имя приложения: در 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

سپس می توانید وارد ماشین مجازی شوید و سرور 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

اضافه کردن نظر