Kubernetes Spielcluster

Aus Hackerspace Bielefeld Wiki
Version vom 13. September 2023, 14:36 Uhr von Inflac (Diskussion | Beiträge) (Hinzufügen zu Kategorie "Projekt")
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Kubernetes Spielcluster

Hardware

  • 4x Lenovo ThinkCentre M Mini-PCs (M715q Tiny, AMD Ryzen 2 Core PRO A6-8570E, 4GB RAM, 256GB SATA SSD)
  • 1x Raspberry Pi 2
  • 1x USB Netzwerkadapter
  • 1x 5port Ethernet Switch
  • div. Ethernet- und Stromkabel
  • 1x USB-Stick

Setup

Raspberry Pi als Gateway und DHCP-Server

Der Raspberry Pi dient als Netzwerk-Gateway und DHCP-Server für den Cluster. Da ein Pi nur ein Ethernet-Interface hat wird die Anbindung "nach außen" über einen USB Netzwerkadapter hergestellt.

Der Pi fungiert nicht nur als Netzwerk-Gateway, sondern auch als DHCP-Server für den Cluster. Der DHCP Server ist so konfiguriert das er erkennt ob auf einem Cluster-PC ein Debian Installer gebootet wurde und in diesem Fall eine Preseed-Datei an den Client ausliefert die den Installationsvorgang automatisiert so dass keine manuellen Eingaben erforderlich sind.

Die Preseed-Datei wiederum veranlasst den PC am Ende des Debian Installationsvorgangs ein Provisionierungsscript auszuführen das die weiteren Schritte der Cluster-Installation ausführen soll.

DHCP Server Konfiguration

TODO: server packet name

Einträge für die einzlen Cluster-PCs sehen so aus:

 host k8s-0 {
   hardware ethernet 00:23:24:D6:33:38;
   fixed-address 192.168.10.100;
   if substring (option vendor-class-identifier, 0, 3) = "d-i" {
     filename "http://192.168.10.1/preseed.php?host=k8s-0";
   }
 }

Die Zuordnung von MAC-Adresse zu IP ist fix, der Name einer Preseed-Datei wird nur zurückgegeben wenn sich der Debian-Installer über einen mit "d-i" beginnenden Vendor Class Identifier zu erkennen gibt; der Installer lädt dann die Preseed-Datei von der angegebenen URL. Die eigentliche Preseed-Datei wird von einem einfachen PHP Script erzeugt das einen Hostnamen als Parameter übergeben bekommt, so können mit nur einem einzigen Bootstick unterschiedliche Konfigurationen auf den verschiedenen PCs installiert werden.

Preseed Datei

Das die eigentliche Preseed-Datei erzeugende PHP Script sieht folgendermaßen aus:

 #_preseed_V1
 
 d-i debian-installer/language string en
 d-i debian-installer/country string DE
 d-i debian-installer/locale string us_US.UTF-8
 
 d-i keyboard-configuration/xkb-keymap select de
 
 d-i netcfg/choose_interface select auto
 
 d-i netcfg/dhcp_timeout string 60
 d-i netcfg/dhcpv6_timeout string 60
 
 d-i netcfg/get_hostname string <?php echo $_GET['host'] ?>
 d-i netcfg/get_domain string local.net
 
 d-i netcfg/wireless_wep string
 
 d-i hw-detect/load_firmware boolean true
 
 d-i mirror/country string manual
 d-i mirror/http/hostname string http.us.debian.org
 d-i mirror/http/directory string /debian
 d-i mirror/http/proxy string
 
 d-i passwd/root-password password secret
 d-i passwd/root-password-again password secret
 
 d-i passwd/user-fullname string k8s user
 d-i passwd/username string k8s
 d-i passwd/user-password password secret
 d-i passwd/user-password-again password secret
 
 d-i passwd/user-default-groups string audio cdrom video sudo
 
 d-i clock-setup/utc boolean true
 
 d-i time/zone string Europe/Berlin
 
 d-i clock-setup/ntp boolean true
 
 d-i partman-auto/init_automatically_partition Guided - use entire disk
 d-i partman-auto/disk string /dev/sda
 d-i partman-auto/method string regular
 
 d-i partman-auto-lvm/guided_size string max
 
 d-i partman-lvm/device_remove_lvm boolean true
 d-i partman-md/device_remove_md boolean true
 d-i partman-lvm/confirm boolean true
 d-i partman-lvm/confirm_nooverwrite boolean true
 
 d-i partman-auto/choose_recipe select atomic
 
 d-i partman-md/confirm boolean true
 d-i partman-partitioning/confirm_write_new_label boolean true
 d-i partman/choose_partition select finish
 d-i partman/confirm boolean true
 d-i partman/confirm_nooverwrite boolean true
 
 d-i apt-setup/cdrom/set-first boolean false
 d-i apt-setup/non-free-firmware boolean true
 d-i apt-setup/non-free boolean true
 d-i apt-setup/contrib boolean true
 
 d-i apt-setup/disable-cdrom-entries boolean true
 
 #d-i apt-setup/use_mirror boolean false
 
 #d-i apt-setup/local0/repository string \
 #       http://local.server/debian stable main
 #d-i apt-setup/local0/comment string local server
 
 # Enable deb-src lines
 #d-i apt-setup/local0/source boolean true
 
 # URL to the public key of the local repository; you must provide a key or
 # apt will complain about the unauthenticated repository and so the
 # sources.list line will be left commented out.
 #d-i apt-setup/local0/key string http://local.server/key
 
 
 tasksel tasksel/first multiselect standard, ssh-server
 
 d-i pkgsel/include string wget curl apt-transport-https vim mc git tree gpg
 
 d-i pkgsel/upgrade select none
 
 popularity-contest popularity-contest/participate boolean false
 
 d-i grub-installer/only_debian boolean true
 d-i grub-installer/with_other_os boolean false
 
 d-i grub-installer/bootdev  string /dev/sda
 
 d-i finish-install/reboot_in_progress note
 
 d-i debian-installer/exit/poweroff boolean true
 
 d-i preseed/late_command string wget http://192.168.10.1/preseed.sh -O /target/root/preseed.sh; sh /target/root/preseed.sh <?php echo $_GET['host']; ?> 
 

Die meisten Vorgaben sind statisch und für alle PCs gleich, es unterscheiden sich nur die Werte für "netcfg/get_hostname" und "preseed/late_command". Erstes wird einfach auf den Übergebenen Hostnamen gesetzt, letzteres lädt das "preseed.sh" Shellscript vom Raspberry Pi und führt es lokal mit dem Hostnamen als Parameter aus. Alle weiteren Installationsschritte werden von diesem Script ausgeführt.

Installationsscript

Das Installationsscript ist recht einfach gehalten da es noch im Kontext des Bootsystems des USB-Sticks ausgeführt wird:

 #! /bin/bash                                                                                                    
 
 hostname $1
 echo $1 > /etc/hostname
 
 wget http://192.168.1.1/firstboot.sh -O /target/usr/local/bin/firstboot.sh
 chmod a+x /target/usr/local/bin/firstboot.sh
 
 cat > /target/etc/systemd/system/firstboot.service <<EOF                                                        
 [Unit]                                                                                                          
 Description=One time boot script                                                                                
 After=network.target nss-lookup.target                                                                          
                                                                                                                 
 [Service]                                                                                                       
 Type=simple                                                                                                     
 ExecStart=/usr/local/bin/firstboot.sh                                                                           
                                                                                                                 
 [Install]                                                                                                       
 WantedBy=multi-user.target                                                                                      
 EOF                                                                                                             
 
 chroot /target /bin/systemctl enable firstboot.service

Es setzt zunächst den übergebenen Hostnamen dauerhaft, lädt dann ein weiteres Shellscript namens "firstboot.sh" herunter und setzt hierfür einen SystemD Service auf damit es beim ersten Start des gerade installierten Systems ausgeführt wird.

Firstboot Script

Das firstboot.sh Script deaktiviert nun als allererstes den Firstboot Service um bei folgenden Systemstarts nicht noch einmal ausgeführt zu werden, danach kann dann die weitere Installation und Konfiguration der einzelnen Cluster-PCs erfolgen:

 #! /bin/bash
 systemctl disable firstboot
 
 ... alles weitere hier ...


TODOs

Vollständig automatische Installation

Bisher muss im Bootmenü des USB-Installationssticks noch manuell "Automatische Installation" ausgewählt werden. Das erfordert zumindest eine angeschlossene Tastatur, und vorzugsweise auch einen Bildschirm wenn man die richtige Tastensequenz zur Auswahl des Menüpunktes "Automatische Installation" nicht auswendig lernen will.

Erste Versuche einen Bootstick mit geänderter Grub-Installation zu erstellen die nach ein paar Sekunden direkt "Automatische Installation" ausführt sind bisher gescheitert ...

Package Proxy

Damit nicht bei jedem neuen Installationsanlauf ein Haufen Installationspackete von Debian- und Google-Servern heruntergeladen werden müssen wäre es nicht schlecht auf dem Raspberry Pi einen transparenten Cacheing-Proxy für solche Downloads zu haben.

Kubernetes-Installation

Das ist bisher erst halb fertig (oder auch weniger), gesucht wird hier immer noch ein wirklich brauchbares HowTO