Cos'è Fly?
Fly è un linguaggio di tipo Domain-Specific
che si pone come obiettivo quello di garantire lo sviluppo di applicativi per il calcolo scientifico su Multi-Cloud
.
Puoi dirmi di più?
Fly riesce a garantire la piena compatibilità con i diversi Cloud-Provider convertendo le proprie funzioni in linguaggio nativo Javascript
o Python
in modo totalmente trasparente e gestito.
Funzionalità di Fly
- Sfruttare automaticamente le risorse di computazione dell'ambiente di esecuzione
- Esecuzione di computazioni in modo concorrente
- Diversi ambienti di esecuzione utilizzabili
# Computazione del pi greco
var cloud= [type="azure", language="nodejs", threads=100]
var ch = [type="channel"] on cloud
func hit(i){
var r = [type="random"]
var x = r.nextDouble()
var y = r.nextDouble()
var msg=0
if((x*x)+(y*y)<1.0){msg=1}
ch!msg
}
func estimation(){
var sum = 0
var crt = 0
for i in [0:1000000] {
sum += ch? as Integer
crt += 1
}
println "pi estimation: "+ (sum*4.0)/crt
}
fly hit in [0:1000000] on cloud thenall estimation
Scalabile, veloce, funzionale
Fly sfrutta la potenza computazionale offerta dal Cloud Computing attraverso il paradigma FaaS, Function as a Service, che permette di ottenere alta scalabilità ed alte prestazioni.
Limitazioni del Serverless Computing 😔
- Tempi di esecuzione limitati (es. 15 minuti AWS)
- Dimensione della memoria limitata
- Mancanza di controllo sull'ambiente di esecuzione
Kubernetes in Fly
Cos'è Kubernetes?
Kubernetes è una piattaforma open-source che consente di gestire ed automatizzare applicazioni containerizzate.
Nasce nel 2013 dall'esigenza di alcuni ingegneri Google nel creare un'infrastuttura in grado di gestire i servizi Google in maniera più scalabile e performante. Nel 2015 il progetto viene donato alla Cloud Native Computing Foundation (Linux Foundation)
Applicazioni Containerizzate?
L'utilizzo dei container permette di incapsulare una applicazione rendendolo funzionante su qualsiasi ambiente di esecuzione. Attraverso i container insieme alle loro librerie, configurazioni e dipendenze possono essere facilmente distaccate dall’ambiente di esecuzione e trasferite altrove.
Layers
Immagine
Container
VM - Containers
Docker
Docker Engine
è un software open-source che fornisce servizi API e strumenti come: BuildKit
, Containerd
e Docker CLI
per il building ed il running di applicativi containerizzati.
Docker in produzione?
Non è un'ottima idea
- I Container Docker sono immutabili
- Gestione di errori imprevisti
- Strumenti avanzati di rete
- Necessità di una solida infrastruttura
Orchestrazione di Kubernetes
L'orchestrazione di Kubernetes consente di creare servizi applicativi che si estendono su più container in un cluster, automatizzandone la gestione, la scalabilità e l'integrità nel tempo.
Master node
: la macchina che controlla i nodi Kubernetes. È il punto di origine di tutte le attività assegnate.Pod
: un gruppo di uno o più container. I pod astraggono la rete e lo storage dal container sottostante, consentendoti di spostare i container nei cluster con maggiore facilità .
Replica Set
: controlla il numero di copie identiche di un pod che devono essere eseguite e gestite.
Orchestrazione di Kubernetes
L'orchestrazione di Kubernetes consente di creare servizi applicativi che si estendono su più container in un cluster, automatizzandone la gestione, la scalabilità e l'integrità nel tempo.
Servizio
: disaccoppia le definizioni del lavoro dai pod. indirizzando ogni richiesta al pod corretto, indipendentemente dalla sua posizione.Kubelet
: questo servizio viene eseguito sui nodi, legge i manifest del container e garantisce che i container definiti vengano avviati ed eseguiti.kubectl
: lo strumento di configurazione della riga di comando di Kubernetes.
Architettura
Cosa non è Kubernetes
- Non limita i tipi di applicazioni supportate
- Non compila il codice sorgente e non crea i container
- Non impone soluzioni di logging, monitoraggio o di gestione degli alert
- Non fornisce né rende obbligatorio un linguaggio/sistema di configurazione
Implementazione
Tecnologie utilizzate
Implementazione
Workflow
Implementazione
Workflow
Codice FLY
# Computazione del pi greco
var cloud= [type="azure", language="nodejs", threads=100]
var cluster = [type="k8s",clusterName="Fly",registryName="FlyRegistry.azurecr.io"] on cloud
var ch = [type="channel"] on cloud
func pi(){
var r = [type="random"]
var x = r.nextDouble()
var y = r.nextDouble()
var msg = 0
if((x * x)+(y * y) < 1.0){msg = 1}
ch!msg on cluster
}
func estimation(){
var sum = 0
var crt = 0
for i in [0:100] {
sum += ch? as Integer
crt += 1
}
println "pi estimation: " + (sum*4.0) / crt
}
fly pi in [0:100] on cluster thenall estimation
File JS Generato
let redis = require('redis'), client = redis.createClient({port:6379,host:'redis'});
var x = Math.random()
var y = Math.random()
var msg = 0
if((x * x) + (y * y) < 1.0)
{
msg = 1
}
client.on('ready', function (err) {
client.rpush('queue:jobs',msg)});
Dockerfile Generato
FROM node:10
MAINTAINER Luigi Barbato <l.barbato11@studenti.unisa.it>
EXPOSE 8888
WORKDIR /function
COPY ./main.js .
RUN npm install redis
CMD ["node", "main.js"]
File di deployment di Kubernetes
apiVersion: batch/v1
kind: Job
metadata:
name: fly-job
spec:
parallelism: ${parallelism}
completions: ${completions}
ttlSecondsAfterFinished: 5
template:
metadata:
name: fly
labels:
jobgroup: fly
spec:
containers:
- name: fly-node
image: ${registryName}/fly_node
command: [ "node", "./main.js" ]
restartPolicy: Never
Servizio Redis e Load Balancer
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
apiVersion: v1
kind: Service
metadata:
name: public-svc
spec:
type: LoadBalancer
ports:
- port: 6379
selector:
app: redis
Implementazione
Dimostrazione: Esecuzione
Implementazione
Dimostrazione: Redis Master & Servizi
Implementazione
Dimostrazione: Esecuzione Job
Implementazione
Dimostrazione: Job Running
Implementazione
Dimostrazione: Job Running - Gestione Failures
Implementazione
Dimostrazione: Job Running - Pods Success
Implementazione
Dimostrazione: Pi Estimation
Sviluppi Futuri
- Gestione dello storage
- Bilanciamento del carico
- Introduzione del Multi-Cloud