# Deevirt Compute

----
Le compute est décomposé en 2 modules
- qemu
- mgr

La plage de port 44XX est réservé sur le compute

----

## Compute QEMU (Monitor)
Ce composant doit être installé sur chaque noeud de compute.

Il occupe 3 fonctions majeurs.

##### Gestion des évènements
Ce service établi une communication interne (socket) avec virtqemud pour récupérer les principaux évènements.

Aucun port en ouverture n'est requis.

- Mise à jour dans la base de données etcd
- Envoi des évènements via AMQP pour un traitement externe (VMCenter)

##### Récupération des métrics
Ce service établi une communication interne (socket) avec virtqemud afin de récupérer les diveres informations sur le noeud et les VMs.

- Port: 4490 (Un service http local prometheus est créé sur le port sans tls, **aucune information sensible n'étant véhiculé dans les informations**).

## Compute MGR (Monitor)
Ce composant s'appui fortement sur le protocole RAFT pour assurer la haute disponibilité, ["Raft: In Search of an Understandable Consensus Algorithm"](https://raft.github.io/raft.pdf)

Raft est un protocole de consensus distribué conçu pour garantir la cohérence des données dans un système réparti. Il fonctionne en élisant un leader, qui gère la réplication des logs vers les followers. Les décisions sont validées par la majorité, assurant tolérance aux pannes et fiabilité. 

**Cas d'usage**
- Cluster d'au moins 1 noeud  => 1 manager (pas de redondance, à éviter)  
- Cluster d'au moins 3 noeuds => 3 manager
- Cluster d'au moins 5 noeuds => 5 manager

##### Gestion du scheduler/HA
Ce service est important mais non critique.

Aucun port en ouverture n'est requis.

Pour son fonctionnement, il requiert:
- Au moins un serveur Prometheus (metrics)
- Au moins un serveur etcd (base de données).

Il est conseillé d'installer ces services sur l'infrastructure la plus résiliente ou idéalement, sur une infrastructure dédié.

Ce service devant être exécuté une seule fois, tout en étant résiliant aux pannes, il est commandé par le leader par le RAFT.

##### API (gRPC)
Ce service permet aux services externes d'intéragir avec l'API virtproxyd.

Le protocole http a été abandonné au profit du protocole gRPC ["gRPC: Google Remote Procedure Call"](https://grpc.io/)

gRPC est un framework RPC (Remote Procedure Call) moderne, open source et haute performance, capable de fonctionner dans n'importe quel environnement. Il permet de connecter efficacement des services au sein et entre différents centres de données, avec une prise en charge modulaire de l'équilibrage de charge, du traçage, de la vérification d'état et de l'authentification.

Ainsi donc, les appels passent de http(s):// à grpc://

- Port: 4480 (dev uniquement, pas de chiffrement)
- Port: **4443 (prod, avec chiffrement et authentification tls)**

