Structural diff for HAProxy configuration

(This is an English translation of a previous post)

We use HAProxy for all our incoming HTTP and other TCP connections.

Its configuration is the most complex we have. That’s why we do not write it by hand, but rather generate it from metadata and includes. Such a generator makes the configuration easier — but it also makes it harder to see what the actual changes will be in the end.

For situations like that, we like tooling that will show us a diff of the generated configuration. Because the HAProxy configuration is a single text file, we could use the diff program to compare two versions.

The downside of a textual diff is that it shows meaningless differences, for example if only order or comments change.

„Structural diff for HAProxy configuration“ weiterlesen

HAProxy-Konfiguration strukturell diffen

(This post is also available in English)

Wir benutzen HAProxy für alle unsere eingehenden HTTP- und sonstigen TCP-Verbindungen.

Die Konfiguration ist die komplexeste, die wir haben. Daher wird die Konfiguration nicht von Hand erstellt, sondern aus Metadaten und Includes generiert. Ein solcher Generator vereinfacht die Konfiguration — aber kann es erschweren zu sehen, was man nun wirklich ändert.

Für solche Fälle mögen wir Tooling, dass uns einen Diff der generierten Konfiguration anzeigen kann. Da die HAProxy-Konfiguration eine einzelne Textdatei ist, könnten wir das diff-Programm benutzen um zwei Versionen zu vergleichen.

Das Problem mit einem rein textuellen Diff ist, dass dort auch Unterschiede auftauchen, die gar keine Auswirkung auf HAProxy haben, z.B. wenn sich nur die Reihenfolge oder Kommentare ändern.

„HAProxy-Konfiguration strukturell diffen“ weiterlesen

Kubernetes Local Persistent Volumes mit virtio-Disks

In Kubernetes ermöglichen Persistent Volumes (PVs) den Betrieb von Workloads mit persistentem State. Der Inhalt dieser Volumes existiert unabhängig von der Lebensdauer der Pods, die sie verwenden.

Es gibt viele verschiedene Implementierungen/Provider für PVs. Wenn man Kubernetes bei einem Cloud-Anbieter betreibt, kann man deren Blockdevice- oder Netzwerkdateisystem-Service verwenden, z.B. Elastic Block Store (EBS) bei AWS

Auch in einer on-prem-Umgebung wie unserer gibt es Möglichkeiten: die meisten unserer Persistent Volumes liegen auf NetApps. Mit dem offiziellen NetApp-Provisioner Trident werden diese bei Bedarf automatisch angelegt.

In manchen Fällen möchte man aber nicht Volumes per Netzwerk einbinden, sondern diese direkt auf der Node haben, d.h. Local Storage nutzen. Das kann z.B. schneller oder kostengünstiger sein, und hat weniger Abhängigkeiten. Es passt insbesondere dann, wenn die Redundanz der Daten auf Anwendungsebene sichergestellt ist, so dass ein Verlust eines einzelnen PVs keinen Datenverlust bedeutet.

Pods verwenden die PVs nicht direkt, sondern sie referenzieren einen Persistent Volume Claim (PVC). Ein PVC ist ein „Wunsch“ nach einem Volume einer bestimmter Art und Größe. Eine Controller-Loop in Kubernetes sorgt dafür, dass ein PVC mit einem passenden PV verknüpft wird. Erst dann kann das PVC von Pods verwendet werden.

Für die meisten Arten von Volumes gibt es dynamisches Provisioning: wenn jemand ein PVC erstellt, wird automatisch vom Hersteller-spezifischen Provisioner (wie NetApp Trident) ein passendes PV erstellt. Da das neue PV genau auf das PVC passt, werden diese dann von Kubernetes verknüpft. 

Bei den local Volumes gibt es stattdessen ein statisches Provisioning: der local-static-provisioner scannt nur auf der jeweiligen Node, wo er läuft, nach schon bestehenden Mountpoints oder Blockdevices, und erstellt dafür die PV-Objekte. Wenn man also ein PVC anlegt, und es gar kein passendes PV gibt, dann wird das PVC pending bleiben, bis man selbst ein Volume erstellt.

„Kubernetes Local Persistent Volumes mit virtio-Disks“ weiterlesen

Linux-Packages erstellen aus fertigen Binaries – mit automatischen Updates

Man kennt das Problem: in der Linux-Distribution der Wahl ist eine gewünschte Software nicht als Paket verfügbar, oder nicht in der Version, die man braucht/möchte. 

Früher™ hätte man häufig selbst kompilieren müssen. Heutzutage, und insbesondere mit Programmiersprachen wie Go oder Java, aus denen (fast) statische Binaries/JARs fallen, stellen viele Upstreams eigene Binaries für ihre Programme bereit. Mit etwas Glück auch in Form von DEBs oder RPMs – aber leider nicht immer.

„Linux-Packages erstellen aus fertigen Binaries – mit automatischen Updates“ weiterlesen

Health-Check-Cache für HTTP-Backends

Was ist das, wozu brauchen wir das und was ist daran so kompliziert?

Ein Health-Check-Cache soll, wie der Name schon vermuten lässt, Health-Checks cachen. In Wirklichkeit passiert aber noch mehr, was für uns auch sehr wichtig ist.

Unsere Loadbalancer laufen mit HAProxy. Dieser macht regelmäßig Health-Checks gegen die Backends. Das ist auch gut und richtig, denn er muss ja immer wissen, welches Backend tatsächlich up oder down ist, um den Traffic für den User möglichst ohne Unterbrechung oder Fehler zu lenken. Wenn man jetzt, so wie wir, sehr viele Loadbalancer hat und diese auch noch innerhalb sehr kurzer Zeit vervielfachen kann, wird das jedoch ab einem gewissen Punkt zu einem Problem und skaliert einfach nicht mehr, was die Health-Checks angeht.

Stellen wir uns 50 Loadbalancer vor, die alle N Sekunden gegen ein und das selbe Backend prüfen. Dazu kommt der normale Traffic, der nicht aus dem Cache ausgeliefert wird, oder der gerade im Cache expired ist, plus vielleicht noch eine „nicht optimale“ Backendsoftware, die einfach nicht so viele Requests pro Sekunde schafft. Das alles in Kombination ist denkbar ungünstig. Das Ziel eines Caches ist es ja, das Backend zu entlasten und die Auslieferung bestenfalls noch zu beschleunigen. Selbiges können wir auch für Health-Checks tun. Wieso sollen alle 50 Loadbalancer einzeln ihre Health-Checks gegen die Backends fahren? Auch hier kann man das super konsolidieren, indem wir nur für die Health-Checks einen Cache betreiben und der HAProxy gegen den Cache prüft.

Das Backend bzw. die Software können wir uns leider nicht in jedem Fall aussuchen oder so beeinflussen, dass sie für uns ausreichend performt. Also brauchen wir eine Lösung, die wir einfach überall anwenden können, unabhängig vom eigentlichen Backend. Da passt ein solcher Cache sehr gut ins Konzept.

„Health-Check-Cache für HTTP-Backends“ weiterlesen

Firmwareupdate für Samsung 980 PRO unter Linux

Leider gibt es bei der Samsung 980 PRO ein Problem mit der Firmware – die NVMe braucht dringend ein Update auf Firmware 5B2QGXA7, Details findet man im Artikel von Heise.

Das ISO findet man über https://semiconductor.samsung.com/consumer-storage/support/tools/ unter „Firmware“, jedoch macht Samsung es nicht leicht, die Firmware „mal eben“ unter Linux upzudaten, daher hier unsere Kurzanleitung!

Sichert vorher eure Daten! Wir hatten zwar keinen Datenverlust, aber ohne Sicherung macht man hier an dieser Stelle besser nicht weiter!

„Firmwareupdate für Samsung 980 PRO unter Linux“ weiterlesen

FastNetMon Configs mit CUE verwalten

Es war einmal in einem Rechenzentrum in Deutschland vor nicht all zu langer Zeit, da begab es sich, dass ein Admin FastNetsMon einrichten wollte. Doch diese Aufgabe stellte sich als mühsam heraus, da die Konfiguration nicht in einer Config-Datei gespeichert wurde, sondern nur via CLI möglich war. „Schade“, dachte sich der Admin und konfigurierte die Instanz manuell nach der Vorgabe, die ihm gegeben wurde.

Einige Jahre später wurden neue Server angeschafft, um die vorherigen auszumustern und die Zeit war gekommen die Installation zu wiederholen. Dieses mal war es jedoch anders als noch vor ein paar Jahren! Es musste nicht nur eine Instanz konfiguriert werden, sondern zwei Instanzen. Dieser Umstand führte direkt zu Fehlern, da die alte Version andere Parameter hatte als die neue. Ebenfalls wurde von IPFIX/sFlow auf einen Port-Mirror umgestellt, weshalb dort weitere Einstellungen angepasst und geprüft werden mussten.

„FastNetMon Configs mit CUE verwalten“ weiterlesen

Hello world!

Willkommen zum technischen Blog der Babiel GmbH!

Hier schreiben häuptsächlich Kollegen aus dem Bereich des Managed Hostings – unsere HR bespielt Linkedin, Facebook und Instragram – hier sind die Techniker am Werk. 😉 Auf twitter sind wir diejenigen, die technische Dinge (re)tweeten und kennzeichnen dort unsere Beiträge durch unser jeweiliges Kürzel.

Wir hoffen, durch den Blog bessere Einblicke darauf geben zu können, wie wir arbeiten, welche Themen uns bewegen und hoffen, darüber auch in einen Austausch zu kommen. Pre-COVID19 fand man uns regelmäßig auf Meetups, z.B. beim „talk@babiel“ direkt bei uns vor Ort, aber z.B. auch bei DevOps Düsseldorf – dort ebenfalls mit Vorträgen. Da der Vor-Ort Austausch leider schon lange ruhen muss, sieht man sich nun vielleicht mal beim Infrafoo des Chaosdorf.

Zum Team: wir sind derzeit 22 Kollegen und dafür verantwortlich, die IT Services der Babiel zu betreiben. Das fängt an bei Grundlagen wie dem Betrieb unseres Autonomen Systems AS198913, geht weiter über Themen wie Virtualisierung, Storage, Betriebssysteme, Managed Hosting, Monitoring und umfasst auch den Betrieb der Applikationen; aber auch betriebsrelevante Tools werden in der Abteilung programmiert.

Themen die uns bewegen sind also:

  • Datacenter-Technologie im Netzwerkbereich, Loadbalancer, DDoS-Schutz, Virtualisierung
  • Automatisierung, CI/CD Pipelines, Puppet, Go
  • Kubernetes
  • Linux
  • Speziallösungen für IT-Probleme, die man mit der Zeit bekommt und für die es keine „off the shelf“ Lösung gibt

Enjoy our Blog!