Hello 😃

Luigi Barbato

Tesista triennale @ISISLab

main

intro

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.

cover

intro

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.

cover

intro

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

intro

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.

intro

intro

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

main

intro

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.

intro

Layers

right-arrow

intro

Immagine

right-arrow

intro

Container

VM - Containers

main

intro

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.

main

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.

cover

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

cover

  • 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

main

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




intro intro intro intro intro

Implementazione

Workflow

main

Implementazione

Workflow

k8s

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

main

Implementazione

Dimostrazione: Redis Master & Servizi

main

Implementazione

Dimostrazione: Esecuzione Job

main

Implementazione

Dimostrazione: Job Running

main

Implementazione

Dimostrazione: Job Running - Gestione Failures

main

Implementazione

Dimostrazione: Job Running - Pods Success

main

Implementazione

Dimostrazione: Pi Estimation

main

Sviluppi Futuri

  • Gestione dello storage
  • Bilanciamento del carico
  • Introduzione del Multi-Cloud

Conclusioni Finali

cover

Grazie per l'attenzione