بناء منطقتنا بدون خادم على أساس Fn

بناء منطقتنا بدون خادم على أساس Fn

الحوسبة بدون خادم يعد من أبرز التوجهات في مجال الحوسبة السحابية. مبدأ التشغيل الأساسي هو أن البنية التحتية ليست من اختصاص DevOps، بل من اختصاص مزود الخدمة. يتم ضبط تحجيم الموارد تلقائيًا حسب التحميل وله معدل تغيير مرتفع.

ميزة أخرى شائعة هي الميل إلى تقليل التعليمات البرمجية والتركيز عليها، وهذا هو السبب في أن الحوسبة بدون خادم تسمى أحيانًا الوظيفة كخدمة (FaaS).

تاريخيًا، كان أول مزود سحابي يقدم FaaS مع AWS Lambda هو Amazon، ومن هنا جاء الاسم. يقدم مقدمو الخدمات السحابية الآخرون أيضًا خدمات مماثلة:

  • وظائف السحابة من جوجل
  • وظائف Azure من Microsoft

توفر جميع هذه الشركات حوسبة بدون خادم، وإمكانية التوسع التلقائي، وتدفع فقط مقابل ما تستخدمه فعليًا، ولكنها تقيد العملاء بمنتجاتها الخاصة. ومع ذلك، هناك بدائل مجانية ومفتوحة المصدر للحوسبة بدون خادم. لا تساوي شيئا:

جميعها مستقلة تمامًا عن السحابة، أي أنه يمكن تثبيتها في أي سحابة، بما في ذلك السحابة الخاصة بك، العامة أو الخاصة، وبالطبع في Exoscale.

كيف يعمل مشروع Fn

يعتمد Fn بالكامل على Docker، ويتكون من مكونين رئيسيين:

  • برنامج CLI مصمم لإدارة كافة جوانب البنية التحتية لـ Fn، ويتفاعل مع خادم Fn،
  • خادم Fn نفسه هو تطبيق عادي معبأ في حاوية Docker.

يتم أيضًا تنفيذ الوظائف المنشورة في Fn في حاويات منفصلة، ​​مما يسمح لك بدعم الكثير من لغات البرمجة، على سبيل المثال... Clojure!

يتم تمرير وسيطات الدالة إلى الإدخال القياسي (STDIN)، وتتم كتابة النتائج إلى الإخراج القياسي (STDOUT). إذا لم تكن الوسيطات أو قيم الإرجاع قيمًا بسيطة (مثل كائن JSON)، فيمكن تحويلها باستخدام طبقة تجريد توفرها Fn نفسها في شكل مجموعة تطوير الوظائف (FDK).

للراحة، يتم تقديم مجموعات من القوالب المضمنة لتسهيل نشر FaaS في قائمة واسعة من اللغات المختلفة وإصداراتها (Go، إصدارات مختلفة من Java وPython وما إلى ذلك).

يعد إنشاء FaaS أمرًا سهلاً باتباع هذا المخطط:

  • نشر الوظيفة باستخدام Fn CLI: يتم إنشاء ملف تكوين تطبيق لـ Fn بناءً على القالب المحدد.
  • نحن نطرح وظيفتنا الخاصة، مرة أخرى باستخدام CLI Fn: يتم وضع صورة الحاوية في مستودع معين، وبعد ذلك يتم إخطار الخادم بوجود هذه الصورة وموضعها.

بناء منطقتنا بدون خادم على أساس Fn
مبدأ تسليم الوظائف إلى Fn

التثبيت المحلي واختبار الوظائف بدون خادم

لنبدأ بتثبيت Fn على الجهاز المحلي. أولاً، تم تثبيت Docker، كما هو مطلوب بواسطة Fn. بافتراض أننا على Debian/Ubuntu:

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

أو استخدم إصدار مدير الحزم/Docker وفقًا لنظامك. ثم يمكنك الانتقال مباشرة إلى تثبيت 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، ويقوم بتعيين قالب الكود باللغة التي اخترتها.

في حالة وقت تشغيل العقدة، فهذا يعني:

$ 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

بعد ذلك يمكنك الدخول إلى الجهاز الظاهري وتثبيت خادم 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 على التوالي، ولكنه يوفر أيضًا طريقة أكثر ملاءمة لإدارة إنشاء وإدارة التكوينات للنشر بسهولة.

من حيث الجبهة الوطنية، يتم استدعاء التكوين للنشر 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

إضافة تعليق