Fn'ye dayalı kendi sunucusuz sistemimizi oluşturma

Fn'ye dayalı kendi sunucusuz sistemimizi oluşturma

Sunucusuz bilgi işlem bulut bilişimdeki en belirgin trendlerden biridir. Temel çalışma prensibi, altyapının DevOps'un değil, hizmet sağlayıcının meselesi olmasıdır. Kaynak ölçeklendirme, yüke göre otomatik olarak ayarlanır ve yüksek bir değişim oranına sahiptir.

Diğer bir ortak özellik, kodu en aza indirme ve odaklanma eğilimidir; bu nedenle sunucusuz bilişime bazen hizmet olarak işlev (FaaS) adı verilir.

Tarihsel olarak AWS Lambda ile FaaS sunan ilk bulut sağlayıcı Amazon'du, dolayısıyla adı da buradan geliyordu. Diğer bulut hizmeti sağlayıcıları da benzer hizmetler sunmaktadır:

  • Google'dan Bulut İşlevleri
  • Microsoft'tan Azure İşlevleri

Bu şirketlerin tümü sunucusuz bilgi işlem, otomatik ölçeklendirme sağlıyor ve yalnızca gerçekte kullandığınız kadar ödeme yapıyor, ancak müşterileri kendi özel ürünlerine kilitliyorlar. Ancak sunucusuz bilgi işlem için ücretsiz ve açık kaynaklı alternatifler mevcuttur. Şunu belirtmekte yarar var:

  • platformu Apache OpenWhiskIBM tarafından bir kuluçka makinesinde geliştirilen,
  • Bahar Bulutu İşlevleriAWS Lambda, Azure Functions ve OpenWhisk için de cephe olarak kullanılabilen oldukça zengin Spring Framework ekosisteminin bir parçası olarak,
  • Proje FnOracle tarafından desteklenmektedir.

Hepsi bulutlardan tamamen bağımsızdır, yani kendi bulutunuz da dahil olmak üzere, genel veya özel herhangi bir buluta ve elbette Exoscale'e kurulabilirler.

Fn projesi nasıl çalışır?

Fn tamamen Docker'ı temel alır ve iki ana bileşenden oluşur:

  • Fn altyapısının tüm yönlerini yönetmek için tasarlanmış ve Fn sunucusuyla etkileşime giren CLI programı,
  • Fn sunucusunun kendisi Docker kapsayıcısında paketlenmiş normal bir uygulamadır.

Fn'de konuşlandırılan işlevler ayrıca ayrı kapsayıcılarda yürütülür; bu da birçok programlama dilini desteklemenize olanak tanır, örneğin... Clojure!

Fonksiyon argümanları standart girişe (STDIN) iletilir, sonuçlar standart çıkışa (STDOUT) yazılır. Bağımsız değişkenler veya dönüş değerleri basit değerler değilse (JSON nesnesi gibi), Fn'nin kendisi tarafından Fonksiyon Geliştirme Kiti (FDK) biçiminde sağlanan bir soyutlama katmanı kullanılarak dönüştürülebilir.

Kolaylık sağlamak için, FaaS'ın farklı dillerden ve sürümlerinden (Go, Java'nın farklı sürümleri, Python vb.) oluşan kapsamlı bir listede dağıtımını kolaylaştırmak için yerleşik şablon setleri sunulmaktadır.

Bu şemayı takip ederek FaaS oluşturmak kolaydır:

  • İşlevin Fn CLI'yi kullanarak dağıtılması: Seçilen şablona göre Fn için bir uygulama yapılandırma dosyası oluşturulur.
  • Yine CLI Fn kullanarak kendi fonksiyonumuzu devreye alıyoruz: kapsayıcı görüntüsü belirli bir depoya yerleştirilir, ardından sunucuya bu görüntünün varlığı ve yerleşimi bildirilir.

Fn'ye dayalı kendi sunucusuz sistemimizi oluşturma
Fn'ye fonksiyon teslim etme prensibi

Sunucusuz işlevlerin yerel kurulumu ve test edilmesi

Öncelikle Fn'yi yerel makineye kurmaya başlayalım. İlk olarak, Fn'nin gerektirdiği Docker'ı kuruyoruz. Bunun için Docker'da olduğumuzu varsayıyoruz. Debian/Ubuntu:

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

Veya sisteminize göre bir paket yöneticisi/Docker yapısı kullanın. Daha sonra doğrudan Fn CLI'yi yüklemeye geçebilirsiniz. Örneğin, kıvrılma kullanarak:

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

Homebrew'un yüklü olduğu OSX kullanıyorsanız, diğer tarafa gidebilirsiniz:

$ 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

Artık fonksiyonumuzu başlangıçta CLI kullanarak dağıtmaya hazırız. Basit olması açısından Node gibi yerleşik bir başlatma ortamı kullanacağız:

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

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

Yeni bir dizin oluşturulacak hellonode Fn işlevimizi bazı temel yapılandırma dosyalarıyla daha da geliştirmek için. Yeni oluşturulan dizinin içinde, uygulamanızı seçtiğiniz dilin veya çalışma zamanının standartlarını takip ederek oluşturabilirsiniz:

# Каталог с 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 ilk proje yapısını oluşturur, bir dosya oluşturur func.yamlFn için gerekli ayarları içerir ve kodun şablonunu seçtiğiniz dilde ayarlar.

Düğüm çalışma zamanı durumunda bu şu anlama gelir:

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

Şimdi her şeyin nasıl çalıştığını görmek için işlevimizi hızlı bir şekilde yerel olarak test edeceğiz.

İlk olarak Fn sunucusunu başlatacağız. Daha önce de belirtildiği gibi, Fn sunucusu bir Docker konteyneridir, bu nedenle başlangıçtan sonra gidip görüntüyü Docker kayıt defterinden alacaktır.

$ 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

Fonksiyonumuzu çalıştırmak için "yayılması" gerekir. Bu gerektirir имя приложения: Fn'de tüm uygulamaların ilgili işlevler için ad alanları olarak belirtilmesi gerekir.

Fn CLI dosyayı arayacaktır func.yaml işlevi yapılandırmak için kullanılacak geçerli dizinde. Bu yüzden önce rehberimize gitmeniz gerekiyor 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

Komut çıktısından da görebileceğiniz gibi fonksiyonumuzu içeren yeni bir Docker konteyner imajı yaratılıyor. İşlev çağrılmaya hazır ve bunu yapmanın iki yolu var:

  • Fn komutunu kullanarak invoke
  • aracılığıyla doğrudan arama http

Вызов invoke Fn aracılığıyla, hızlı test için uygun olan testler için HTTP üzerinden çalışmayı taklit eder:

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

{"message":"Hello World"}

Bir işlevi doğrudan çağırmak için tam URL'yi bilmeniz gerekir:

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

{"message":"Hello World"}

Fn sunucusu, işlevlerini 8080 numaralı bağlantı noktasında gösterir ve işlev URL'si, kalıpla eşleşiyor gibi görünür t/app/function, ama tamamen değil. HTTP aracılığıyla, bir işlev doğrudan çağrılmaz, ancak adına göre işlev çağrısını "başlatan" sözde tetikleyici aracılığıyla çağrılır. Tetikleyiciler şurada tanımlanır: `func.yml proje:

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

Tetikleyici adını işlev adıyla eşleşecek şekilde değiştirebiliriz, bu her şeyi basitleştirecektir:

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

Daha sonra işlevi tekrar sunmaya başlarız ve onu yeni bir tetikleyiciden çağırırız:

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

{"message":"Hello World"}

Her şey çalışıyor! Tam ölçekli deneylere geçmenin ve FaaS'ımızı sunucuda yayınlamanın zamanı geldi!

Sunucusuz işlev hizmetlerini kendi altyapınıza kurma

Exoscale CLI'yi kullanarak hızlı bir şekilde sanal makine yükleyelim. Henüz ayarlamadıysanız, kullanabilirsiniz hızlı başlangıç ​​kılavuzumuz. Bu, üretkenliğinizi daha da artıracak harika bir araçtır. Güvenlik Grubunda 8080 numaralı bağlantı noktasını açmak için bir kural yapılandırmanız gerektiğini unutmayın! Aşağıdaki komutlar, işlevlerimizi barındırmaya hazır, temiz bir sanal makine başlatacaktır:

$ 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

Daha sonra sanal makineye ssh gönderebilir ve uzak Fn sunucusunu kurabilirsiniz:

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

Ardından Docker'ı ve Fn sunucusunu, yerel makinede yapıldığı gibi yükleyin, sunucuyu başlatı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 fonksiyonları almaya hazır! İşlevlerin uzak bir sunucuya hedefli aktarımı için şu komutu kullanacağız: deploy bayrağı atlayarak yerel bilgisayardan --local.

Ayrıca Fn, Fn sunucusunun ve Docker kayıt defterinin konumunu belirtmenizi gerektirir. Bu seçenekler ortam değişkenleri aracılığıyla ayarlanabilir FN_API_URL и FN_REGISTRY sırasıyla, ancak aynı zamanda dağıtım için yapılandırmaların oluşturulmasını ve yönetimini kolayca yönetmenin daha uygun bir yolunu da sunar.

Fn terimleriyle dağıtım için yapılandırmaya denir context. Aşağıdaki komut bağlamı yaratacaktır:

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

Mevcut bağlamları şu şekilde görüntüleyebilirsiniz:

$ fn list contexts

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

Ve şu şekilde oluşturulan bağlama geçin:

 $ fn use context exoscale

 Now using context: exoscale

Bundan sonra, Fn özellik sunumu, seçilen DockerHub hesabını kullanarak Docker görüntülerini indirecektir (benim durumumda - nfrankel) ve ardından uzak sunucuya bildirimde bulunun (bu örnekte - http://185.19.30.175:8080) işlevinizi içeren en son görüntünün konumu ve sürümü hakkı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 .

sonunda:

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

{"message":"Hello World"}

Fn'ye dayalı kendi sunucusuz sistemimizi oluşturma
Fn Tabanlı Sunucusuz Bilgi İşlemde İşlev Yaşam Döngüsü

Kendi kapasitenizde sunucusuz bilgi işlemin avantajları

Sunucusuz bilgi işlem, bir uygulamanın daha karmaşık uygulamalarla veya mikro hizmetlerle etkileşime giren bağımsız bölümlerini hızlı bir şekilde uygulamaya koymak için kullanışlı bir çözümdür.

Bunun nedeni genellikle seçilen satıcıya bağlı kalmanın gizli maliyetidir; bu, belirli kullanım durumu ve hacmine bağlı olarak gelecekte daha yüksek maliyetlere ve daha az esnekliğe yol açabilir.

Çoklu bulut ve hibrit bulut mimarileri de bu durumda sıkıntı yaşıyor çünkü kendinizi kolaylıkla sunucusuz bilgi işlem kullanmak isteyeceğiniz bir durumda bulabilirsiniz, ancak kurumsal politikalar nedeniyle bu mümkün olmayabilir.

Fn'nin kullanımı oldukça kolaydır ve çok az ek yük ile hemen hemen aynı FaaS arayüzünü sağlayabilir. Satıcıya bağlılığı ortadan kaldırır ve yerel olarak veya seçtiğiniz herhangi bir uygun bulut çözümü sağlayıcısına kurulabilir. Programlama dili seçiminde de özgürlük vardır.

Bu makale yalnızca Fn'nin temellerini kapsar, ancak kendi çalışma zamanınızı oluşturmak oldukça basittir ve genel mimari, bir Fn yük dengeleyici kullanılarak veya koruma için Fn'yi bir proxy arkasına yerleştirerek daha geniş bir şekilde dağıtılabilir.

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster