Avoir une infrastructure informatique ou les services, comme NAV, ne soient plus affectés par une défaillance matériel.
# Méthode
Pour permettre à un service de passer d'un hôte à l'autre la méthode la plus flexible est d'exectuer les service dans des instances virtualisées ou des conteneurs.
Pour diminuer ou même éliminer l'impacte d'un hôte défaillant sur la disponibilité du service, un système d'orquestration automatique doit gérer l'attribution des instances virtuelle ou des conteneurs sur les hôtes matériels.
De plus, les données utilisées par le service doivent être aussi disponbile sur plusieurs hôtes pour que les données soient toujours disponible lors de la défaillance d'un hôte.
Finalement, la communication entre les hôtes doivent être dupliqués en cas de la défaillance d'un commutateur réseau.
Un minimum de deux (2) noeuds de storage et de calcule est requis pour permettre la redondance du matériel et permettre le balancement des services en cas de panne. Trois (3) noeuds permetteraient d'avoir encore un noeud de redondance après la défaillance d'un noeud, ce qui permet de remplacer le noeud défaillant sans urgences.
Les noeuds de storage on besoin de 5 GB de RAM et un core du CPU pour chaque disques. Il est possible d'utiliser les noeuds de storage pour executer des services comme le font les noeuds de calcule. Ce n'est pas recommandé, car ceci peut impacter la vitesse des accès au données.
Un orcestrateur, il permet le balancement de pods (microservices) entre les divers nodes (serveurs) sous sa gérance (cluster)
### [Terraform](https://www.terraform.io/)
Language de définition "statefull" pour l'infrastructure. Il permet de documenter (via les scripts) comment l'infrastructure sera construite. Utilisé pour les nodes physique et les services dans les pods.
### [Helm](https://helm.sh/)
La méthode pour déployé des services dans k8s. En plus de terraform qui détermine la nature de l'infrastructure, helm défini la configuration des pods et des services dans le cluster k8s.
### [Flatcar linux](https://www.flatcar.org/)
Une districution de linux particulièrement optimisé pour executer une seule tâche sur un serveur. Utilisé pour héberger le service K8s. Fait intéressant, flatcar est maintenu par Microsoft. Source du noyau linux pour l'ensemble du cluster k8s.
### [Containerd](https://containerd.io/)
Solution parallèle à Docker pour la création et gestion de containers, un composant d'un pod dans k8s. La solution est considéré comme le standard d'industrie pour la contenérisation d'hébergement. Docker est plus populaire dans le domain du développment sur les postes de travail.
### [Alpine linux](https://alpinelinux.org/)
Une distribution de linux optimisée pour être de petite taille, mais versatille contrairement à flatcar linux. Sans charge, l'image sans noyau prendre un peu moins que 8MB. Utilisé pour la construction des pods qui supporteront les service hébergés dans le cloud interne k8s.
## Services
### [Typhon](https://typhoon.psdn.io/)
Une distribution de kubernete, elle permet de déployer un cluster kubernete avec des configuration et les pods les plus utilisé.
### [Matchbox](https://matchbox.psdn.io/)
Un serice de déploiement pour les nodes physiques via le réseau (iPXE). Install les images généré par la configuration de terraform sur les nodes physique du cluster.
Serveur DNS recusif et serveur DHCP excessivement simple a déployer qui offre les fonctionnalités IP et DNS pour le foncitonnement d'un réseau interne. Essentiel pour le fonctionnement de matchbox. k8s utilise ses propres service DNS interne.
Programme codé en C permettant de communiquer avec la plateform IPMI (Intelligent Platform Management Interface). Cette commande sera utilisé dans les scritp CI de wookpecker pour redémarrer les nodes physiques du cluster et initier leur déploiement.
### [Gitea](https://gitea.io/)
Un répo git semblable à github et gitlab. Offre l'authentification LDAP (aka AD lightweight Directory) sans coût supplémentaire. Permet d'entreposer les fichiers de configuraiton terraform, donc la documentation de l'infrastructure.
### [Woodpecker CI](https://woodpecker-ci.org/)
Un outil d'intégration en continue "Continous integration - CI" permettant d'executer les script terraform quand les fichiers de configuration terraform change. Ceci permet de forcer les gestionnaires de l'infrastructure de changer la documentation terraform dans le répertoire git de gitea quand ils désirent effectuer une modification.
### [Openstack](https://www.openstack.org/)
Orchestrateur pour la virtualisation. Un équivalence de k8s pour les machines virutelles. k8s contient plus d'outils, offre des meilleurs performances en fonction du matériel, mais openstack offre la possibilité d'executer des windows sur linux, ce que k8s ne permet pas. Il est possible d'executer Openstack sur k8s. Il sera utilisé pour executer les logiciels monolitique, ceux qui est impossible de migrer vers les microservices. Ceci inclue les logiciels exclusivement executable sur windows comme Microsoft NAV. Openstack est plutot complex, il se pourrait qu'une solution plus simple soit offerte si elle peut être déployé par terraform.
L'image docker pour mssql, malheureusement en ubuntu, ce qui rend l'image un peu plus lourde, mais fonctionnel. Après un peu de lecture, il sera impossible de permettre plusieurs microservices avec un load balancer frontal, mais un pod seul (legacy service) avec un service frontal devrait nous donner 5 à 10 secondes de downtime quand la node hébergeant le pod meurt, tout de même acceptable.
### [OpenLDAP](https://www.openldap.org/)
Application d'annulaire suivant le standard LDAP pour l'entreposage, entre autres, des informations d'utilisateurs et d'ordinateur. Effectue le même rôle qu'Active directory, mais AD dévie en quelques point du standard LDAP.
Protocole d'autentification réseau. Cette méthode permet à un utilisateur d'ouvrir une session sur un oridnateur (ou d'autre service) à partir d'un jeu d'authentification centralisé. Active directory utilise une version modifié de kerberos pour à cet effect.
### [Samba](https://www.samba.org)
Couche d'interoperabilité permettant à windows et linux de s'authentifier dans la même infrastructure LDAP/Kerberos. Mis en d'autre mots, samba peut être utilisé pour créer un controlleur de domain AD sur linux. Il permet aussi d'utiliser le protocole de partage windows, SMB sur linux.
### [Rook](https://rook.io/)
Décrit comme un opération de storage. Dans le cloud k8s interne, rook sera utilisé comme méthode de distribution de cehp. Il permet d'utiliser les outils et méthodes résiliante de k8s pour déployer ceph sur les nodes de storage.
### [Ceph](https://ceph.com/)
Un système de storage d'information distribué. Ceph permet essentiellement de construire un NAS/SAN résilient distribué sur le réseau. La manière qu'il fonctionne est analogue à comment fonctionne un RAID5 pour un jeux de disques sur un poste local.
Un reverse proxy servant de point de sortie unique par node pour plusieurs service interne du cluster. En combinaison avec MetalLB, ceci permet d'attribuer dynamiquement un IP à un service en fonction de la node que celui-ci est exectuer dessus. Il est aussi possible d'attribuer l'IP le même IP a plusieurs node tant que celui est associé avec le même jeux de pods ingress.
### [Cert Manager](https://cert-manager.io/)
En travail constant avec Ingress, cert manager permet de générer, certifier et renouveller un certificat. Ceux-ci sont traditionnellement utilisé pour l'encryption de site web (https), malgré que de nombreuse autres utilité sont possible. Ce serait avec un certificat de cert manager que l'encryption de NAV se ferait par le réseau. Il est important d'utiliser un nom de domaine qui résoud à l'externe pour permettre au fournisseur de certificat; let's encrypt de communiquer avec cert manager.
Knot DNS est un serveur DNS de production hébergant une zone DNS. Celui-ci sera utilisé pour héberger la zone DNS du réseau local et sera mise-à-jour via externalDNS et par extension défini dans terraform. Knot DNS est différent de DNSMasq, car celui-ci sert a héberger une zone et non d'être un qui effectue une résolution pour les clients, aka recursif.
Permet de dynamiquement généré une entrée DNS dans knot DNS en fonction d'une configuration d'un service dans k8s.
### [MetalLB](https://metallb.universe.tf/)
Permet l'attribution automatique d'un IP à un service que l'on désire exposé à l'exterieur du cluster k8s, soit dans le réseau interne.
### [Prometheus](https://prometheus.io/)
Permet d'accumuler les métriques des divers nodes et service du cluster k8s. Il est aussi utilisé pour générer des alertes quand les métriques atteindre un niveau défini.
### [Grafana](https://grafana.com/)
Visualistaion de métrique. Grafana sera utilisé pour créer des tableau de métrique pour vérifier l'état de santé du cluster k8s et des services qu'il supporte.
Une solution de résautage pour la communication entre les pods inter-node géré par le même cluster k8s
### [CoreDNS](https://coredns.io/)
Service DNS interne pour automatiser la communication entre les pods et les services du cluster k8s.
### [etcd](https://etcd.io/)
Dépôt de configuration "flat" semblable a [Redis](https://redis.io/) utilisé par les nodes de gestions de k8s pour enmagasier les configurations de cluster.