Nomaden der Wolken (nicht der Lüfte)

Dieses Posting ist aus dem April 2021


Es ist ja schon länger klar, dass es potentielle Kunden gibt, die nicht die Zeit haben, den Aufwand scheuen oder einfach nicht die Chance haben, auf der "grünen Wiese" in eine Containerwelt mit Kubernetes einzutauchen. Eine Option für solche Unternehmen ist Docker Swarm - unter anderem, weil Mirantis die Lösung weiter unterstützt.  Kleine Umgebungen lassen sich damit sehr schnell aufbauen und einfach betreiben. Die Handhabung kann aber durchaus etwas hakelig sein.

Eine andere Option, der Unternehmen wie  CloudFlareTrivagoCircleCISAP und eBay vertrauen, ist Nomad aus dem Hause Hashicorp.

Nomad arbeitet als Orchestrator - allerdings nicht nur für Docker Container sondern auch für KVM-VMs, Java Dienste, Prozesse, die direkt oder in einer Change-Root Umgebung ausgeführt werden und für weitere Dienste, die per Treiber angebunden werden können. Bei Trivago werden mit Nomad z. B. Dienste in FreeBSD-Jails gestartet und verwaltet. Es gibt aber auch Treiber für Podman. Nomad registriert spätestens beim Start, welche Treiber sich in seinem Plugin-Verzeichnis befinden und macht sie benutzbar.

Nomad integriert sich sehr einfach mit den anderen Projekten aus dem Hashicorp-Universum (z. B. mit Consul und Vault). Es ist kein Problem Cluster aufzubauen, die aus VMs, Containern, Bare Metal Servern bestehen und auf verschiedenen Betriebssystemen basieren. 

Nomad ist vielleicht auch deshalb für Kunden so interessant, weil sie ihre seine bewährten und bekannten Storagesysteme weiterverwenden können (Host Volume Support) - inzwischen ist aber auch Storage über CSI ansprechbar. Für die Bereitstellung von Diensten nach außen bieten sich Software Loadbalancer wie Traefik und Fabio an, die ihre Konfiguration aus Consul beziehen und dynamisch anpassen können. Es gibt offenbar aber auch eine Integration von Consul und F5.

Eine Produktionsumgebung nach der Nomad Reference Architecture sieht wie folgt aus:

Ein Consul Cluster (bestehend aus mindestens drei Consul-Instanzen) wird mit einem Nomad-Cluster (bestehend aus mindestens drei Nomad-Server Instanzen) verbunden. Dieses Setup kann dann von einer Vielzahl von Nomad-Clients (auf denen gleichzeitig auch immer ein Consul-Client für das Service-Discovery laufen sollte) konsumiert werden.

Nun sind vielen Kunden ja diese "Meta-Nodes", die für ihre Anwendungen nicht nutzbar sind - aber trotzdem bezahlt werden müssen, ein Dorn im Auge. Deswegen habe ich für die Consul- und Nomad-Cluster in der Triton-Umgebung LX-branded Zones genommen. Das Consul-Cluster kann per docker-compose ausgerollt werden und baut sich dank Containerpilot automatisch selbst auf. Für den Nomad-Cluster habe ich drei Void-Linux Zonen gewählt, für die ich vorher mit Packer ein Image erzeugt hatte. Vermutlich ließe sich aber auch hier ein Setup mit Docker und Containerpilot herstellen. So belegt eine Void-Linux Zone mit laufendem Consul-Client und Nomad-Server ungefähr 140 MB Arbeitsspeicher - ein Consul-Container kommt mit etwa 75 MB Memory daher. Trotzdem können sie die volle Leistung des darunterliegenden Compute Nodes abfordern, wenn keine anderen Instanzen diese benötigen. Zusätzlich lassen sich die Zonen online rekonfigurieren - falls z. B. doch mehr Arbeitsspeicher benötigt werden sollte. Void-Linux läßt sich für diese Aufgabe mit minimaler Diensteausstattung konfigurieren:

[root@7aa0927f-8ded-40ae-bd57-f577b44c6dff ~]# vsv

   SERVICE              STATE   ENABLED   PID      COMMAND           TIME
 ✔ consul               run     true      24463    consul            5 days
 X nanoklogd            down    true      ---      ---               0 seconds
 ✔ nomad                run     true      41107    nomad             23 hours
 ✔ socklog-unix         run     true      37770    socklog           5 days
 ✔ sshd                 run     true      67524    sshd -D [listener 5 days

Das Consul Server Cluster ist nach dem Autopilot Pattern aufgebaut und verwendet Containerpilot und das entsprechende Consul Repository aus dem Autopilot Pattern Repo auf Github, um per docker-compose ein leicht skalierbares Cluster aus lx-branded Zones aufzubauen.

Nomad und Consul kennen das Konzept des "Datacenters". Nomad kennt zusätzlich noch das Konzept der "Region", welche wiederum aus mehreren "Datacentern" besteht. Innerhalb einer Region sollte die Kommunikation zwischen den Nomad-Servern mit geringer Latenz möglich sein. Bei der Kommunikation zwischen Regionen werden auch höhere Latenzen toleriert. In der Dokumentation wird dabei dieses Bild verwendet:

Dazu ist es sinnvoll, das Konzept vom Consul Connect zu kennen. Consul Connect ist das Service Mesh auf Basis von Consul, welches sowohl in Kubernetes aber auch überall, wo ein Consul-Client läuft, verwendet werden kann. Consul baut mit Hilfe des Envoy Proxy, der ja auch bei Istio zum Einsatz kommt, ein Service Mesh auf: 

Natürlich integriert sich hier auch wieder Nomad, wenn gewünscht. Im Multi-Cloud Kontext existieren in Consul Connect auch Gateways, die eine Kommunikation zwischen Diensten über Datacenter-Grenzen hinweg möglich machen.

Die Funktioen zum Loadbalancing, Traffic-Routing sowie Geo-Failover sind im Multi-Cloud Betrieb unerläßlich. Für das Service Mesh sind IP-Adressen übrigens uninteressant, weil die Dienste mit Namen registriert werden. Deshalb ist auch keine NAT-Konfiugration erforderlich. Die Kommunikation wird verschlüsselt abgewickelt.

Der Aufbau einer echten Multi-Cloud Infrastruktur ist damit relativ einfach möglich. Auch das Ausbringen von Workloads, die sich über mehrere Datacenter oder Clouds verteilen sollen, ist damit umsetzbar.

Im Vergleich zu Kubernetes-Systemen wie Gardener, Kubermatic und Giantswarm, verwendet Nomad kein "Cluster of Clusters" Konzept sondern Cluster und Regionen sind unabhängig voneinander und es gibt kein zentrales Cluster. Nomad unterstützt Multi-Region Deployments von Applikationen (s. unten). Damit stellt Nomad eine Möglichkeit für Kunden dar z. B. eine Applikation in verschiedenen Cloud-Regionen auszurollen. Dafür sind keine besonderen Voraussetzungen durch die zu Grunde liegende Infrastruktur zu erfüllen. Consul und Nomad sind für Multi-Datacenter und Multi-Region Konstrukte ausgelegt.

Links:


Nomad vs. Kubernetes

Nomad CI/CD Developer Workflows and Integrations

Von dev nach Nomad mit Gitlab CI

From Zero to WOW! with Nomad

Multi-Cluster Deployments with Nomad (TranscriptBlogeintragUsecase Bowery Farming)

Nomad: Kubernetes without the complexity

Mixing Containerized and non containerized Workloads with Services and Batch Jobs in Nomad

Machine Learning Workflows with Hashicorp Nomad and Apache Spark

Going global with Nomad and Google Cloud Platform

Going Multi-Cloud with Terraform and Nomad

OpenFaaS - Nomad Provider

GitLab + Nomad: a GitOps Dream Come True (SlidesRepoVideo)

Mixing Containerized and Non-Containerized Workloads with Services and Batch Jobs in Nomad

Nomad Ecosystem

Loadbalancing with F5 and Consul

Consul Connect Service Mesh

Consul Service Mesh: Deep Dive

Nomad Hands-On - Oscon 2018