multimico / cluster

This repository contains all relevant information for our multimico edge cluster
Creative Commons Zero v1.0 Universal
0 stars 0 forks source link

set up host #1

Open phish108 opened 3 years ago

phish108 commented 3 years ago

Wichtig: Das ursprüngliche Issue ging davon aus, dass wir den linux QEMU-Hypervisor verwenden. Diese Annahme haben wir inzwischen angepasst und sind auf LXC/LXD Systemcontainer umgestiegen. Diese sparen Ressourcen.

we build on ubuntu LTS.

We do not install any extra components, as nodes will run as VM on the host hardware.

After installation we need to install

Extra tools

bajkad commented 3 years ago

? How can the ansible inventory be accessed and how can I work with it?

phish108 commented 3 years ago

@bajkad Ein Ansible Inventory ist eine einfache Datei mit Hostnamen, wobei die Hostnamen nach Arten gruppiert sein können.

Diese Datei übergibt man als Dateinamen an Ansible. Über die Gruppen im Inventory kann man Aktionen auf bestimmte arten von Rechnern beschränken (z.B. nur Hypervisoren oder VMs im Kubernetes Netzwerk).

phish108 commented 3 years ago

Hypervisor Host/Virtualisierungshost aufsetzen.

Beispiel hier gefunden. Dort sind auch Links zur offiziellen Doku.

Finale Lösung durch diese Diskussion inspiriert.

Beim Booten im Bootloader mit e in den Editiermodus wechseln.

Das Ergebnis muss wie folgt aussehen:

setparams 'Ubuntu Server' 

    set gfxpayload=keep
    linux      /casper/vmlinuz  quiet autoinstall "ds=nocloud-net;s=https://raw.githubusercontent.com/dxiai/multimico-cluster/main/hypervisor/" ---
    initrd     /casper/initrd

Anschliessend mit Crtl+x den Editiermodus verlassen und den Installationsprozess lostreten.

Mit nocloud-net können wir den autoinstall-Prozess mit einer Netzwerkdatei initialisieren, der die relevanten Dateien von der URL holt, die im s-Parameter angegeben ist.

Zusätzlich gibt es noch die Parameter i und h, die den Hostnamen festlegen. Hierzu gibt es eine kurze Doku. Leider werden diese Optionen nicht vom Installer übernommen, sondern werden nur für DHCP-Einstellungen weitergereicht.

Die aktuelle Version der user-data-Datei funktioniert nicht richtig und der Installer bricht unterwegs ab. Konnte noch nicht evaluieren was noch fehlt. Hier müssen wir noch die Doku wälzen. So können wir die Hardware einheitlich aufsetzen. Der Ubuntu-Installer verzeiht keine Fehler in der Konfiguration des Cloud-Init Installers. Gleichzeitig ist die Dokumentation nur spärlich.

Bei der Konfiguration gilt es darauf zu achten, dass der Installer nicht durch die neuste Version ersetzt wird. Wenn der neuste Installer genutzt wird, dann bricht der Installationsprozess regelmässig an verschiedenen Stellen ab.

Der Autoinstaller besteht aus zwei Teilen:

  1. Die Basisinstallation der Hardware inkl. HD Partitionierung, Netzwerk, Tastatur, Repositories und Basis-System
  2. Das Nutzersystem mit Nutzern und Software.

Beide Teile werden durch eine Neustart getrennt.

In der Konfiguration findet sich der zweite Teil im Abschnitt user-data. Laut Dokumentation kann der Standardnutzer im Abschnitt identity im ersten Teil oder wie in allen anderen Cloud-Init im Abschnitt users definiert sind. Die Dokumentation stellt aber nicht fest, dass entweder der Abschnitt identity oder der Abschnitt user-data.users vorhanden sein darf. Sind beide Abschnitte vorhanden, initialisiert der Installer keine Nutzer. Weil user-data.users wesentlich flexibler ist als der Abschnitt identity ist, empfehle ich diese Variante.

Bei der Nutzerkonfiguration übernimmt der Installer nicht die Default Shell. Diese müssen wir explizit unter shell angeben. Es ist übrigens möglich mehrere SSH Identitäten von Github zu importieren. Das folgende Beispiel zeigt das:

users: 
      - name: dxiai
        passwd: "PASSWORDHASH"
        shell: /bin/bash
        ssh_import_id: 
          - gh:phish108
          - gh:bajkad
        groups:
          - sudo
          - lxd
          - adm
          - plugdev
          - cdrom
        lock_passwd: false

Beim Passwordhash muss das Format strikt eingehalten werden. Am Besten man erstellt das Passwort wie unter #3 beschrieben mit openssl passwd -6 $PASSWORD. Dabei gilt zu beachten, dass openssl unter MacOS diesen Befehl nicht unterstützt. Am leichtesten geht das unter Linux oder mit einem Docker Container.

In den Abschnitt user-data müssen zusätzliche Software-Packete im Abschnitt packages festgelegt werden. Dieser Abschnitt darf theoretisch auch in Teil 1 stehen. In diesem Fall können aber nur Packete installiert werden, die auf dem Installationsmedium vorhanden sind. Damit die Installation funktioniert müssen ausserdem die beiden Optionen package_update und package_upgrade auf true gesetzt werden. Update synchronisiert die externen APT Repositories, so dass wir alle Deb-Packete auswählen können. Ohne Update können wir keine zusätzliche Software (wie petname) installieren. Upgrade stellt sicher, dass alle Packete aktualisiert und alle Sicherheitsupdates eingespielt sind. Ergänzend habe ich noch package_reboot_if_required auf true. Das hatte jedoch keinen Effekt.

Bei der Netzwerkkonfiguration gab es zusätzliche Punkte zu beachten. Die folgende Konfiguration ist eine funktionierende Einstellung für unsere Hardware und Installationen unter VirtualBox.

network:
    version: 2
    ethernets:
      maineth:
        match:
          name: "en*"
        dhcp4: true

Die Option match gibt uns die notwendige Flexibilität um verschiedene Netzwerkkarten richtig anzusprechen. Dieser Schritt war wichtig, damit die SSH Schlüssel geladen werden können. Tritt hier ein Fehler auf, wurden meine User gelöscht.

Diese Konfiguration werden wir später in Schritt #5 noch anpassen.

Weil wir cloud-init nur für die Erstinstallation verwenden muss nach der Installation cloud-init deaktiviert werden. Dazu muss eine leere Datei wie folgt angelegt werden: sudo touch /etc/cloud/cloud-init.disabled (SIehe Diskussion hier). Die restliche Konfiguration wird mit Ansible vorgenommen.

phish108 commented 3 years ago

LVM wird zur Kompensation von Funktionen benötigt, die in BTRFS standardmässig vorliegen. D.h. mit einem BTRFS Dateisystem ist LVM für unsere Zwecke nicht notwendig. hypervisor/user-data berücksichtigt das in der storage-Konfiguration. Das Ergebnis ist, dass wir nun drei Partitionen erhalten:

  1. UEFI Zum Booten (FAT32)
  2. Das Boot Dateisystem mit dem Kernel (BTRFS)
  3. Das Root Dateisystem mit allen anderen Daten (BTRFS)
phish108 commented 3 years ago

Installation abschliessen

Das Fine-Tuning des Hypervisors erfolgt ebenfalls über cloud-init und erfordert keine zusätzlichen manuellen schritte.

Damit der Hypervisor Host richtig funktioniert, muss das Netzwerk finalisiert werden und LXD konfiguriert werden.

LXD finalisieren wir indem wir ein preseed.yaml auf dem Host einrichten und damit LXD starten. Dabei müssen wir beachten, dass die --preseed-Option immer nur von der Standardeingabe die Daten liesst.

bajkad commented 2 years ago

Die korrekte Installation funktioniert nur mit dem ip Kernel Parameter.

setparams 'Ubuntu Server' 

    set gfxpayload=keep
    linux      /casper/vmlinuz  ip=dhcp quiet autoinstall "ds=nocloud-net;s=https://raw.githubusercontent.com/dxiai/multimico-cluster/main/hypervisor/" ---
    initrd     /casper/initrd
phish108 commented 2 years ago

Hier ist der Link, von dem ich die entscheidende Inspiration für Daniels Lösung bekommen habe. Der entscheidende Hinweis findet sich im Abschnitt Grup (UEFI).

Der Parameter ip=dhcp stellt sicher, dass die Netzwerkinitialisierung via DHCP immer vor der eigentlichen Systeminitialisierung durchgeführt wird. Dadurch ist eine Netzwerkverbindung zu jedem Zeitpunkt der Systeminitialisierung garantiert - solange eine IP-Adresse via DHCP zugewiesen wurde. Mehr Details zur ip-Option gibt es in der Linux Kernel Dokumentation.

Unter normalen Umständen ist die Anpassung nicht notwendig, weil die Netzwerkinitialisierung normalerweise schnell genug abgeschlossen ist. Ab Ubuntu 21.04 ist das durch eine Änderung im Linux-Bootvorgang jedoch nicht mehr garantiert.