Membangun serverless Anda sendiri berdasarkan Fn


Komputasi tanpa server adalah salah satu tren yang paling terlihat dalam komputasi awan. Prinsip dasar kerja adalah bahwa infrastruktur bukan urusan DevOps, tetapi penyedia layanan. Penskalaan sumber daya secara otomatis beradaptasi dengan beban dan memiliki tingkat perubahan yang tinggi.


Fitur umum lainnya adalah kecenderungan untuk meminimalkan dan memfokuskan kode, sehingga komputasi tanpa server terkadang disebut "berfungsi sebagai layanan" (FaaS).


Secara historis, penyedia layanan cloud pertama yang menawarkan FaaS dengan AWS Lambda adalah Amazon, dari mana asalnya. Penyedia layanan cloud lainnya juga menawarkan analog:


  • Fungsi Google Cloud
  • Fungsi Azure dari Microsoft

Semua perusahaan ini menyediakan komputasi tanpa server, penskalaan otomatis, dan membayar hanya untuk sumber daya yang benar-benar digunakan, tetapi pada saat yang sama mereka mengikat pelanggan ke produk eksklusif mereka. Namun, ada alternatif open source gratis untuk komputasi tanpa server. Perlu dicatat:



Semuanya sepenuhnya independen dari awan, yaitu, mereka dipasang di cloud apa pun, termasuk milik Anda, publik atau pribadi, dan tentu saja di Exoscale.


Bagaimana proyek Fn bekerja


Fn sepenuhnya berdasarkan pada Docker, terdiri dari dua komponen utama:


  • Program CLI dirancang untuk mengelola semua aspek infrastruktur Fn, dan berinteraksi dengan server Fn,
  • Sebenarnya server Fn, aplikasi yang biasa dikemas dalam wadah untuk Docker.

Fungsi yang digunakan dalam Fn juga dilakukan dalam wadah terpisah, yang memungkinkan Anda untuk mendukung banyak bahasa pemrograman, misalnya ... Clojure!


Argumen fungsi ditransfer ke input standar (STDIN), hasilnya ditulis ke output standar (STDOUT). Jika argumen atau nilai kembali bukan nilai sederhana (misalnya, objek JSON), mereka dapat ditransformasikan menggunakan lapisan abstraksi yang disediakan oleh Fn sendiri sebagai kit pengembangan fungsi (FDK).


Untuk kenyamanan, templat bawaan tersedia untuk memfasilitasi penyebaran FaaS dalam daftar lengkap berbagai bahasa dan versinya (Go, berbagai versi Java, Python, dll.).


Membuat FaaS mudah dengan mengikuti pola ini:


  • Kami menyebarkan fungsi menggunakan CLI Fn: file konfigurasi aplikasi untuk Fn dibuat, berdasarkan pada templat yang dipilih.
  • Kami meluncurkan fungsi kami sendiri, lagi-lagi menggunakan CLI Fn: gambar kontainer ditempatkan di repositori tertentu, setelah itu server diberitahu tentang keberadaan dan penempatan gambar ini.


Prinsip Pengiriman Fungsi di Fn


Instalasi lokal dan pengujian fungsi tanpa server


Kami melanjutkan untuk menginstal Fn di mesin lokal. Docker diinstal terlebih dahulu, seperti yang diminta oleh Fn. Kita seharusnya menggunakan Debian / Ubuntu:


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

Baik, atau gunakan paket manager / Docker build sesuai dengan sistem Anda. Kemudian Anda dapat langsung menuju instalasi Fn CLI. Misalnya, menggunakan ikal:


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

Jika Anda menjalankan OSX dengan Homebrew terinstal, Anda dapat memilih cara lain:


 $ 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 

Sekarang semuanya siap untuk penyebaran awal fungsi kita menggunakan CLI. Untuk kesederhanaan, kami akan menggunakan lingkungan bawaan untuk menjalankan, misalnya, Node:


 $ fn init --runtime node --trigger http hellonode Creating function at: /hellonode Function boilerplate generated. func.yaml created. 

Direktori hellonode baru akan dibuat untuk lebih mengembangkan fungsi Fn kami dengan beberapa file konfigurasi dasar. Di dalam direktori yang baru dibuat, Anda dapat membuat aplikasi yang mengikuti standar bahasa atau runtime yang Anda pilih:


 #   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 membuat struktur proyek awal, membuat file func.yaml berisi pengaturan yang diperlukan untuk Fn, dan menginstal templat untuk kode dalam bahasa yang Anda pilih.


Dalam kasus runtime Node, ini berarti:


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

Sekarang kita akan cepat memeriksa fungsi kita secara lokal untuk melihat bagaimana semuanya bekerja


Pertama, kita akan memulai server Fn. Seperti yang telah disebutkan, server Fn adalah wadah Docker, oleh karena itu, setelah memulainya akan pergi dan mengambil gambar dari registri 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 

Untuk menjalankan fungsi kami, Anda harus menjalankannya. Ini membutuhkan : di Fn, semua aplikasi harus didefinisikan sebagai ruang nama untuk fungsi terkait.


Fn CLI akan mencari file func.yaml di direktori saat ini, yang akan digunakan untuk mengkonfigurasi fungsi. Jadi pertama-tama Anda harus pergi ke direktori hellonode kami.


 $ 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 

Seperti yang dapat Anda lihat dari output perintah, gambar kontainer baru untuk Docker dibuat yang berisi fungsi kami. Fungsi siap dipanggil, dan kami memiliki dua cara untuk melakukan ini:


  • menggunakan perintah fn invoke
  • menelepon langsung melalui http

Memanggil invoke melalui Fn hanya mengemulasi pekerjaan HTTP untuk tes, yang nyaman untuk verifikasi cepat:


 $ fn invoke fnexo hellonode #   hellonode  fnexo {"message":"Hello World"} 

Untuk memanggil fungsi secara langsung, Anda perlu mengetahui URL lengkap:


 $ curl http://localhost:8080/t/fnexo/hellonode-trigger {"message":"Hello World"} 

Server Fn menyediakan fungsinya melalui port 8080, dan tampaknya URL fungsi tersebut cocok dengan skema t/app/function , tetapi tidak sepenuhnya. Melalui HTTP, fungsi tidak dipanggil secara langsung, tetapi melalui pemicu yang disebut, yang, sesuai namanya, "meluncurkan" panggilan fungsi. Pemicu didefinisikan dalam proyek `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  

Kami dapat mengubah nama pemicu sehingga cocok dengan nama fungsi, ini akan menyederhanakan semuanya:


 triggers: - name: hellonode-trigger type: http source: /hellonode #     

Kemudian kami memulai pengiriman fungsi lagi dan menyebutnya dari pemicu baru:


 $ fn deploy --app fnexo hellonode --local $ curl http://localhost:8080/t/fnexo/hellonode {"message":"Hello World"} 

Semuanya bekerja! Sudah waktunya untuk pergi ke percobaan skala penuh dan menerbitkan FaaS kami di server!


Menginstal layanan fungsi tanpa server pada infrastruktur Anda sendiri


Mari kita cepat menginstal mesin virtual menggunakan CLI Exoscale. Jika Anda belum mengaturnya, Anda dapat menggunakan panduan kami untuk meluncurkannya dengan cepat . Ini adalah alat keren yang selanjutnya akan meningkatkan produktivitas Anda. Jangan lupa bahwa Anda perlu mengonfigurasi aturan untuk membuka port 8080 di Grup Keamanan! Perintah berikut akan meluncurkan mesin virtual bersih, siap untuk meng-host fitur kami:


 $ 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 

Kemudian Anda dapat ssh ke mesin virtual dan menginstal server Fn jarak jauh:


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

Kemudian instal Docker dan server Fn dengan cara yang sama seperti yang kami lakukan pada mesin lokal, mulai server:


 $ 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 siap untuk fitur! Untuk transfer fungsi yang ditargetkan ke server jarak jauh, kami akan menggunakan perintah deploy dari komputer lokal, menghilangkan flag --local .


Selain itu, Fn mengharuskan Anda untuk menentukan lokasi server Fn dan registri Docker. Parameter ini dapat diatur melalui variabel lingkungan FN_API_URL dan FN_REGISTRY masing-masing, tetapi ditawarkan cara yang lebih mudah untuk mengelola pembuatan dan pengelolaan konfigurasi untuk penempatan dengan mudah.


Dalam hal Fn, konfigurasi untuk penyebaran disebut context . Perintah berikut akan membuat konteks:


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

Anda dapat melihat konteks yang tersedia seperti ini:


 $ fn list contexts CURRENT NAME PROVIDER API URL REGISTRY default default http://localhost:8080/ exoscale default http://185.19.30.175:8080 nfrankel 

Dan beralihlah ke konteks yang baru saja dibuat, seperti ini:


  $ fn use context exoscale Now using context: exoscale 

Mulai saat ini, memasok fungsi Fn akan mengunggah gambar Docker menggunakan akun yang dipilih di DockerHub (dalam kasus saya, nfrankel ), dan kemudian memberi tahu server jarak jauh (dalam contoh ini, http://185.19.30.175:8080 ) tentang lokasi dan versi Gambar terakhir berisi fungsi Anda.


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

Akhirnya:


 $ curl http://185.19.30.175:8080/t/fnexo/hellonode {"message":"Hello World"} 


Fungsi siklus hidup dalam komputasi tanpa server berdasarkan Fn


Keuntungan dari komputasi tanpa server di fasilitasnya


Komputasi tanpa server adalah solusi yang mudah untuk mengimplementasikan bagian aplikasi independen yang berinteraksi dengan aplikasi atau layanan mikro yang lebih kompleks.


Seringkali ini disebabkan oleh biaya tersembunyi dari pengikatan ke pemasok yang dipilih, yang, tergantung pada kasus penggunaan dan volume tertentu, dapat menyebabkan biaya lebih tinggi dan mengurangi fleksibilitas di masa depan.


Arsitektur multi-cloud dan hybrid cloud juga menderita dalam kasus ini, karena Anda dapat dengan mudah menemukan diri Anda dalam situasi di mana Anda ingin menggunakan komputasi tanpa server, tetapi karena kebijakan perusahaan ini tidak mungkin.


Fn cukup sederhana untuk bekerja, ia dapat memberikan antarmuka FaaS yang hampir sama, dengan biaya rendah. Ini menghilangkan ikatan apa pun kepada penyedia, Anda dapat menginstalnya secara lokal atau di penyedia solusi cloud yang nyaman pilihan Anda. Ada juga kebebasan dalam memilih bahasa pemrograman.


Hanya dasar-dasar Fn yang disajikan dalam artikel, tetapi membuat runtime Anda sendiri cukup sederhana, dan arsitektur umum dapat diperluas lebih luas menggunakan penyeimbang beban Fn, atau dengan menempatkan Fn di belakang proxy untuk perlindungan.

Source: https://habr.com/ru/post/id475044/


All Articles