Linux-Schmie.de Dokumentationen
Dokumentationen zu den aktuellen Linux-Schmie.de Trainings
Dokumentationen zu den aktuellen Linux-Schmie.de Trainings
HowTos rund um das Thema cryptsetup
Unter /dev/mapper/$NAME ist nach dem mounten die entschlüsselte Partition zu
finden.
cryptsetup selber unterstützt nicht das Erzeugen eines Recovery Keys. Dies kann
aber systemd-cryptenroll übernehmen
Mit systemctl-cryptenroll ist es ebenfalls möglich TPM2 für die automatische Ver- und Entschlüsselung zu nutzen.
Nach dem Ausführen des Befehls wird das TPM2 als Schlüsseldevice genutzt. Sobald sich Änderungen an der EFI Konfiguration ergeben wird dieser Schlüssel allerdings ungültig und muss erneut eingetragen werden.
Den aktuellen Branch (im Beispiel ‘main’) auf den Stand bringen, der später im root der bereinigten Commit Historie stehen soll.
Als Zwischenschritt wird ein Branch (’temp_branch’) erzeugt. Durch den
Parameter --orphan hat dieser keine Commit Historie.
In diesem Branch alle Dateien Stagen (git add) und den initialen Commit
durchführen
Damit sind alle Projektdateien im neuen Branch enthalten, haben aber nicht die Commit Historie des anderen Branches.
Der alte Branch kann nun entfernt werden.
Und der aktuelle Branch auf den Namen des alten Branches umbenannt werden.
Bisher wurden die Änderungen nur an dem lokalen Repository vorgenommen und es
wurden Referenzen auf die Branches in einer Form geändert, dass andere Clones
des Repositories nicht mehr damit zurecht kommen. Dies würde man beim ersten
Push auf den Server beobachten, der die Änderungen ablehnt. Durch den
zusätzlichen Parameter --force lässt sich trotzdem der geänderte Stand des
Repositories pushen, allerdings müssen all diejenigen, die einen Clone des
Repositories haben diesen Parameter auch beim nächsten pull angeben um das
angepasste Repository zu laden.
Um einen git rebase mehrerer commits ohne manuelle Interaktion durchzuführen
kann das Editor Kommando gegen einen sed getauscht werden und damit bis auf
den ersten ‘pick’ alle weiteren gegen ein ‘squash’ getauscht werden.
HowTos rund um das Thema Gnome
Desktop Dateien unter Gnome müssen - damit sie direkt ausgeführt werden können - als launchable deklariert sein.
Launchable sind Desktop Dateien, wenn sie durch den Benutzer ausführbar sind und
per gio als trusted deklariert wurden.
Der Gnome Desktop ist mit einer eigenen Lösung für den Remote Zugriff ausgestattet. Diese Lösung beinhaltet die Möglichkeit per RDP (Remote Desktop Protocol) oder VNC auf eine bestehende Sitzung zuzugreifen.
Die Konfiguration wird durch den Benutzer innerhalb der Einstellungen durchgeführt.
Alternativ lassen sich die Protokolle auch über die Kommandozeile aktivieren und
konfigurieren. Hierzu dient das Kommando grdctl.
Um einen Teilnehmer an einer Session nur zuschauen zu lassen, kann die Session auf view-only geschaltet werden.
Auch die Zugangsdaten lassen sich über die Kommandozeile festlegen und auch wieder zurücksetzen.
HowTos rund um das Thema Kubernetes
Für die Verwaltung von Zertifikaten wird in der Regel der cert-manager eingesetzt. dieser kann eine lokale CA benutzen um eigene Zertifikate zu erstellen, aber auch per ACME - Protokoll erreichbare Zertifizierer wie z. B. Let’s Encrypt.
Werden die Zertifizierer als Issuer für einzelne Namespaces erstellt, können sie auch nur in den Namespaces benutzt werden.
Für die globale Nutzung gibt es den ClusterIssuer, der im gesamten Cluster verfügbar ist.
Einbauen lässt sich der ClusterIssuer in einen Ingress durch eine Annotation.
Dieser pod erzeugt durch das Überschreiten der verfügbaren Resourcen einen OOM.
Für die Installation muss zunächst der flux Client installiert sein.
Bei Benutzung eines GitLab wird ein Access Token mit Schreibrechten auf das Repository oder die Gruppe benötigt. Sinnvollerweise kann dieser in der Datei $HOME/.gitlab hinterlegt sein.
Danach kann flux mit den benötigen Umgebungswerten gestartet werden.
Es wird automatisch das benötigte Repository angelegt und die Dateien für flux abgelegt.
Im Cluster werden die benötigten CRDs und Deployments angelegt und gestartet.
Ob eine neuere Version für ein Update zur Verfügung steht kann über das
Subkommando check geprüft werden.
Die Komponenten können dann innerhalb des Repositories aktualisiert werden.
Der Cert-Manager ist eine Verwaltungskomponente für Zertifikate innerhalb eines Kubernetes Clusters.
Erst mit dem Cert-Manager ist es möglich Zertifikate zu erstellen, verwalten und löschen. Der Cert-Manager bringt über CRDs eigene Objekte für die Verwaltung mit
Die einfachste Installation kann direkt über Helm erfolgen.
Typischerweise wird für den Cert-Manager ein eigener Namespace (cert-manager)
angelegt.
Bei einem extern erreichbaren Webserver soll neben der Konfiguration eines Ingress mit nginx auf Port 80 auch ein Zugang über https (Port 443) ermöglicht werden.
Dazu bedarf es eines Zertifikats von einer Trusted-CA. Bei extern erreichbaren Webseiten bietet sich dafür z. B. Let’s Encrypt an.
Um bei Let’s Encrypt Zertifikate abholen zu können bedarf es zunächst eines Issuers über diese Objekt wir die Anmeldung an Let’s Encrypt durchgeführt. Die gespeicherte Anmeldung dient später auch als Berechtigung die Zertifikate zu beantragen.
Der Issuer wird im gleichen Namespace wie der spätere Ingress angelegt.
Sobald das Objekt erstellt ist, wird die Anmeldung durchgeführt. Der Status ist
im status des Ingress Objekts sichtbar.
Um einen Webserver per https erreichbar zu machen, wird zusätzlich zu der
normalen Konfiguration ein Abschnitt spec.tls benötigt in dem der SNI
spec.tls.hosts[] und der Name eines Secrets für das Zertifikat angegeben wird.
Damit der Cert-Manager sich um das Zertifikat kümmert muss eine Annotation
cert-manager.io/issuer: angelegt werden, in die der Name des zu benutztenden
Issuers angegeben wird.
Nach Anlegen des Objekts sorgt der Cert-Manager für die Erzeugung des Privaten
Schlüssels und eines Certificate Sign Requests (CSR). Den CSR sendet er zur
Validierung an den über den Issuer angegeben Dienst und sorgt sich um die
Kommunikation mit diesem um das Zertifikat zu holen. Sobald es vorliegt wird es
in dem unter secretName angegebenen Secret zusammen mit dem Key abgelegt und
steht für den Ingress zu Verfügung. Dieser baut das Zertifikat - sobald es
vorhanden ist - ein und stellt die Domain per https zur Verfügung.
Der Issuer steht immer nur in dem Namespace in dem er angelegt wurde zur Verfügung. Um einen Issuer auch über die Namespaces hinweg benutzen zu können gibt es den ClusterIssuer.
Dieser wird - in der Regel - Im Namespace des Cert-Manager abgelegt, kann aber - solang es keine RBAC Einschränkungen gibt - aus allen Namespaces benutzt werden.
Tatsächlich unterscheidet sich die Konfiguration des ClusterIssuer nur durch den unterschiedlichen
kind von dem Issuer (ClusterIssuer statt Issuer)
Auch beim Ingress ist nur die Annotation zu ändern.
Hier wird dann cert-manager.io/cluster-issuer: benutzt.
Das Tool
kubectl wird
für die direkte Kommunikation mit einer Kubernetes API benötigt.
Um mit der API kommunizieren zu können wird eine Konfigurationsdatei benötigt
(KUBECONFIG) in der die Informationen zur API, wie die Adresse, Benutzer,
Kennwort oder Zertifikate enthalten sind. Die Konfigurationdatei wird in der
Regel in der Datei ~/.kube/config abgelegt. Alternativ kann die
Umgebungsvariable KUBECONFIG gesetzt werden um eine alternative
Konfigurationsdatei angeben zu können.
Statt mehrere Konfigurationsdateien zu führen ist es Sinnvoll die Konfigurationsdaten in eine Datei zusammen zu fassen.
Auf Grund des Formats können die Dateien nicht einfach zusammenkopiert werden. Die einzelnen Daten müssen in die jeweiligen Sektionen der Konfigurationdatei verteilt werden.
Mit dem folgenden Workflow ist es möglich dies teilweise zu automatisieren.
~/.kube/config ausgegangen)KUBECONFIG auf die kopierte Datei und die neue Datei
(/tmp/kube_config). Weitere Dateien können durch Doppelpunkt getrennt
angegeben werdenkubectl in
die Datei ~/.kube/config.KUBECONFIGSobald die Konfigurationsdatei für kubectl mehr als einen Eintrag enthält,
kann der Context in dem gearbeitet werden soll gewechselt werden.
Dies geschieht entweder durch das Festlegen eines Default Context:
Oder durch die Nutzung des Parameters --context bei kubectl oder anderen
Befehlen wie z. B. flux, die dies unterstützen.
Über den Befehl kubectl config get-contexts lässt sich eine Liste der
verfügbaren Umgebungen anzeigen.
Über das Tool kind ist es möglich schnell einen Kubernetes Cluster innerhalb einer podman Umgebung aufzusetzen.
Dazu muss das Tool heruntergeladen oder über das Paketmanagement installiert.
podman und auch kubectl müssen ebenfalls installiert und konfiguriert sein.
Der einfachste Weg den Cluster einzurichten geht über das systemctl-run Kommando. Hierbei übernimmt der systemd die Kontrolle über die Umgebung für Umgebung in der der podman Befehl läuft.
Nach dieser Installation kann direkt über das kubectl Kommando ein Zugriff auf die Kubernetes Node erfolgen.
Dazu wurde die Datei $HOME/.kube/config um den Context kind-kind erweitert oder eine neue Datei erzeugt.
Genauere Informationen über den laufenden Cluster Node lassen sich über kubectl cluster-info dump abrufen.
Statt den Cluster mit einer Default Konfiguration zu starten, kann man eine yaml Datei mit passenden Werten zur Erzeugung nutzen.
Beispiele:
Die erstellten yaml Dateien sind bei der Erstellung des Clusters anzugeben.
Weitere Beispiele und Parameter sind in der kind Konfiguration zu finden.
Der Befehl kind kann ebenfalls zum entfernen eines Clusters genutzt werden.
Installation eines einfachen Clusters mit einer Node. nginx-ingress über die Ports 8000 und 8443 auf dem Host zu erreichen.
Für den manuellen Eintrag wird die komplette Zertifikatskette ohne das root-Zertifikat in einer Datei und der Key in einer anderen Datei benötigt. Beide müssen im PEM - Format vorliegen.
Sollten die Intermediate Zertifikate und das eigentliche Zertifikat nicht in
einer Datei sein, dann lassen sich diese per cat Befehl zusammenfügen.
Der zusätzliche Parameter -o yaml gibt den Eintrag aus statt ihn per API in
den Cluster zu senden.
Alternativ kann der Eintrag auch selber erstellt werden:
Der hinter tls.crt und tls.key angegebene Text entspricht dem Inhalt der
Zertifikats- und Key-Datei in einer mit base64 ummantelten Version ohne
Zeilenumbrüche.
Über das Dashboard lassen sich die Informationen über den Cluster visualisieren
und anpassen. Sobald ein metrics-server im Cluster existiert, kann man auch die
Metriken visualisieren.
Sollte der kublet-server nicht mit gültigen Zertifikaten ausgestattet sein,
muss dies dem metrics-server mitgeteilt werden.
Diese Installation des Dashboards ist ohne Absicherung per SSL. Diese müsste zusätzlich konfiguriert werden. Alternativ Nutzung von Rancher.
Zugriff auf das Dashboard über https://localhost:8443
Bevor du mit der Installation von Kubeadm beginnst, musst du dein Rocky Linux 9 System vorbereiten. Du musst sicherstellen, dass bestimmte Pakete und Abhängigkeiten installiert und die Systemeinstellungen korrekt sind.
Der folgenden Befehl setzt den Hostnamen des Systems auf seine eigene IP
Adresse über den Dienst ip.dynlinux.io
Dieser Befehl stellt sicher, dass alle Systempakete auf dem neuesten Stand sind.
Kubernetes erfordert die Deaktivierung von SELinux, um ordnungsgemäß zu funktionieren. Du kannst dies tun, indem du die Konfigurationsdatei bearbeitest.
Nach der Deaktivierung über die Konfigurationsdatei muss das System neu gestartet werden.
Alternativ kannst du es auch temporär deaktivieren
Die Firewall kann den Netzwerkverkehr zwischen den Kubernetes-Komponenten blockieren. Deaktiviere sie, um mögliche Probleme zu vermeiden:
Für die Netzwerkinfrastruktur von Kubernetes ist die IP-Weiterleitung erforderlich. Erstelle die Konfigurationsdatei 99-kubernetes.conf
Containerd ist die Container-Laufzeitumgebung (Container Runtime), die von Kubernetes benötigt wird, um Container zu starten und zu verwalten. Kubernetes verwendet die Container Runtime Interface (CRI), um mit der Container-Laufzeitumgebung zu interagieren.
Zuerst erstellst du eine Standardkonfiguration für Containerd:
Anschließend bearbeitest du die Konfigurationsdatei, um das cgroupfs-System für das Systemd-Cgroup-Treiber-System zu verwenden:
Nachdem Containerd eingerichtet ist, installierst du die Kubernetes-Tools.
⚠️ Hinweis: Die Versionsnummer v1.32 sollte an deine gewünschte Kubernetes-Version angepasst werden.
Dieser Befehl installiert die drei Hauptkomponenten:
Jetzt kannst du den Control-Plane-Knoten (Master-Knoten) initialisieren. Dies ist der wichtigste Schritt, da er das Herzstück deines Kubernetes-Clusters bildet.
Der Parameter –pod-network-cidr ist wichtig, da er das Netzwerk-Subnetz für die Pods festlegt. Der Wert 10.244.0.0/16 ist der Standard, der von vielen CNI-Plugins wie Flannel verwendet wird.
Nach der erfolgreichen Initialisierung musst du kubectl für den aktuellen Benutzer konfigurieren, um Befehle ausführen zu können:
Ohne ein Pod-Netzwerk-Addon können die Pods nicht miteinander kommunizieren. Flannel ist eine beliebte Wahl.
Auf der Control Plane solltest du keine Pods, die nicht zur Control Plane gehören - laufen lassen. Dies kann zu einer Instabilität der Control Plane führen.
Für Test-Setups ist es möglich auch auf der Control Plane Pods laufen zu lassen
Um weitere Control Plane-Knoten zu erstellen musst du zunächst die Zertifikatsdaten des Clusters ein Kubernetes Secret speichern. Dazu führst du auf einem existierenden Conntrol Plane-Knoten den folgenden Befehl aus.
⚠️ Dieser Schritt ist für das Hinzufügen eines Workers nicht notwendig.
Der Certificate Key Name aus der Ausgabe des vorherigen Befehls wird für den
kubeadm join benötigt. Der restliche Aufruf wird mit dem folgenden Befehl
ausgegeben auf dem bestehenden Control Plane-Knoten.
Den Ausgegebenen Befehl musst du nun um die Parameter --control-plane und
--certificate-key <certificate-key-string> erweitern und auf dem neuen
Control Plane-Knoten ausführen.
Sobald die zusätzliche Node bei kubectl get nodes auftaucht können die
korrekten Label gesetzt werden.
Kubeadm gibt dir nach der Initialisierung einen kubeadm join-Befehl aus. Du musst diesen Befehl auf den Worker-Knoten ausführen, um sie dem Cluster hinzuzufügen.
Dieser Befehl verbindet den Worker-Knoten mit dem Control Plane.
💡 Die Daten für diesen Befehl kannst du auf der Control Plane auslesen
Sobald die zusätzliche Node bei kubectl get nodes auftaucht können die
korrekten Label gesetzt werden.
Um sicherzustellen, dass dein Cluster ordnungsgemäß funktioniert, kannst du den Status der Knoten überprüfen:
Die Ausgabe sollte alle Knoten (den Control-Plane-Knoten und alle hinzugefügten Worker-Knoten) als Ready anzeigen.
Wenn du eine Anwendung bereitstellen möchtest, kannst du dies mit einem Deployment-Befehl tun:
Diese Befehle erstellen ein Deployment für eine Nginx-Webserver-Anwendung und legen einen Service vom Typ NodePort an, um die Anwendung über eine externe IP-Adresse zugänglich zu machen.
Pods sind in Kubernetes die Umgebung in der ein oder mehrere Container gestartet werden können. Container können nicht ohne einen umgebenden Pod laufen.
Alle Container innerhalb eines Pods teilen sich die Namespaces des Pods und können nur parallel auf der gleichen Node laufen. Wir einer der Container eines Pods beendet, dann werden alle Container im gleichen Pod gestoppt.
Pods können durch Signale zu Evicted Pods werden. Die Signale können z.B. durch zu wenig Speicher, Festplattenplatz, fehlende INodes oder Prozess IDs gesetzt werden. Meist starten in dem Fall neue Pods, sobald der entsprechende Engpass behoben ist.
Die verbleibenden - Evicted - Pods können dann entfernt werden.
Eine Liste der Evicted Pods zusammen mit dem Grund wird wie folgt erstellt:
Zum Löschen aller Evicted Pods reicht ebenfalls ein Einzeiler:
Ephemeral Container können einem Pod hinzugefügt werden um in der bestehenden Pod Umgebung debugging durchführen zu können.
Nach dem Verlassen des Containers bleibt dieser im Pod erhalten und wird erst durch entfernen des Pods gelöscht.
Solange kann an den Container attached werden.
Pods werden nicht direkt über die Pod IP angesprochen, da sich diese IP bei jedem Anlegen eines Pods ändert. Falls über das Deployment mehrere Pods angelegt werden, wird über die IP immer nur ein Pod angesprochen.
Ein Service sorgt für die Vergabe einer ClusterIP, eines NodePorts oder der Nutzung eines LoadBalancers.
Um die zusammengehörigen Pods zu finden werden über einen selector die passenden Label der Pods festgelegt. Dabei müssen die Pods und der Service im gleichen Namespace sein.
Durch den port wird der auf der ClusterIP zu belegende Port festgelegt. Der targetPort legt den vom Pod freigegebenen Port fest.
Bei der Konfiguration eines NodePort kann ein Port von 30000 bis 32767 automatisch oder durch die Angabe des Parameters nodePort festgelegt werden.
Die dynamische Vergabe des Ports bevorzugt, da es hier nicht zu Konflikten auf Grund paralleler Deployments kommen kann.
Eine StorageClass wird benutzt um einen Datenspeicher für die Pods zur Verfügung zu stellen.
Es gibt verschiedene Provider über die die Speicherung durchgeführt werden kann.
default festlegenUm für einen Cluster einen Storage als Voreinstellung zu haben wird in der Regel die erste angelegte StorageClass als default definiert.
Wird nun Storage angefordert, dann wird diese Klasse als StorageClass benutzt.
In der StorageClass Liste erscheint die StorageClass dann mit der Kennzeichnung (default).
default setzenMittels eines Patches lässt sich eine StorageClass als nicht-default setzen. Ist kein default definiert und eine Resource benötigt ein Volume, dann muss eine StorageClass explizit angegeben sein.
default setzenSobald es keine default StorageClass gibt, kann eine StorageClass als default festgelgt werden. Dies geschieht analog zum Entfernen der default Definition.
Für den Betrieb eines Kubernetes Clusters werden einige Tools benötigt.
dieses sind nicht immer direkt in den Repositories der Distributionen verfügbar. Das folgende Script installiert die wichtigsten Tools in /usr/local/bin und fügt den Pfad zur PATH Variable hinzu.
RKE2 hat die IPv6 der Node nicht erkannt. Durch eine zusätzliche
Konfigurationsdatei in /etc/rancher/rke2/config.yaml.d/ kann die bestehende
Konfiguration ergänzt werden:
Die Meldung deutet darauf hin, dass es ein Problem mit den Zertifikaten gibt und dieses erneuter werden müssen.
Das folgende Script zeigt ob die Zertifikate aktuell sind:
Falls bei diesem Test ein Fehler ausgegeben wird, können mit dem folgenden Script die Zertifikate gelöscht und erneuert werden:
Das SUSE Longhorn Projekt stellt eine Open-Source-Lösung für verteilte Block-Speicher für Kubernetes bereit.
Longhorn ist eine kostenlose und Open-Source-Software-Defined-Storage-Lösung, die für Kubernetes entwickelt wurde. Sie bietet persistente Speichervolumes für zustandsbehaftete Anwendungen, die auf Kubernetes laufen.
Longhorn eignet sich hervorragend für Szenarien, in denen Sie:
Die Installation von Longhorn erfolgt typischerweise über die Bereitstellung von YAML-Manifesten in Ihrem Kubernetes-Cluster. Sie können die neuesten Installationsanweisungen und Manifeste auf der offiziellen Longhorn-Dokumentation finden.
https://github.com/longhorn/longhorn/discussions/9167
Durch das Setzen einer Annotation kann eine storageClass zur default storageClass ungestellt werden.
Dabei sollte zunächst geschaut werden ob eine storageClass als default deklariert ist und diese deaktiviert werden.
Danach kann eine andere storageClass zur default storageClass gemacht werden.
Auflisten der storageClass Elemente um eine default storageClass zu finden
Der sinnvollste Weg um an eine PostgreSQL-Datenbank in einer Kubernetes-Cluster Umgebung zu verbinden ist die Verwendung eines passenden PostgreSQL Containers.
Dieser lässt sich über den den Befehl kubectl run erzeugen.
Dazu sollte im Vorfeld der namespace des PostgreSQL Servers sowie dessen
Service-Name und Service-Port bekannt sein.
In dem Beispiel sind die folgenden Parameter vergeben:
postgresqlns ist der Namespacemypostgresql ist der Name des Services5432 ist der Service-PortDer Container für den Zugriff wird nun mit dem Befehl kubectl run erzeugt und
direkt eine Verbindung zum PostgreSQL Server hergestellt.
Nach Ende der Verbindung wird der Container gelöscht.
kubectl ist auf einer Control Plane installierthelm kann über die Webseite https://get.helm.sh
heruntergeladen und installiert werden.
Die folgende Kommandozeile führt dies automatisch durch. Die Versionsnummer sollte entsprechend angepasst sein.
Über das Repository stehen die verschiedenen Charts für die Installation zur Verfügung und können auch darüber upgedated werden.
Die Installation erfolgt in einem eigenen Namespace. Dieser kann vorab
oder beim helm install über den Parameter --create-namespace während der
Installation angelegt werden.
Im folgenden wird ein nginx Webserver installiert und mit einem Ingress versehen.
Durch die Basic Authentication wird sichergestellt, dass nur Benutzer mit entsprechenden Berechtigungen Zugriff auf die Website bekommen.
Im Ingress müssen nun nur noch die folgenden Annotations hinterlegt werden:
Um eigene Images zu verwalten und zu pushen, wird ein OCI Registry benötigt.
Im folgenden Beispiel wird die Installation über yaml Dateien durchgeführt,
die direkt über kubectl importiert werden. Dazu werden die im folgenden
aufgeführten Beispiele in Dateien gepackt und über denn Befehl kubectl apply -f $DATEINAME importiert.
Zunächst wird ein Namespace erstellt in dem die Registry läuft. Für das Beispiel
ist das der Namespace registry.
Damit die Daten der Registry auch nach einem Neustart erhalten bleiben, wird ein
Storae benötigt. Über die default Storage Klasse wird dafür ein
PersistentVolumeClaim erstellt. Dieser erstellt dann ein PersistentVolume
sobald dieses von dem Deployment angefordert wird.
Wird eine andere als die default StorageClass gewünscht kann diese mit dem
Parameter storageClassName angegeben werden.
Damit die Registry nicht ohne Authentifizierung läuft muss im Vorfeld eine
htpasswd Datei erstellt werden um darüber die Benutzer zu verwalten.
Zunächst wird die htpasswd Datei erstellt. Dies lässt sich am einfachsten über
den httpd OCI Container durchführen. Dieser enthält das benötigte Progamm
htpasswd. Im Beispiel wird podman genutzt. Der Befehl kann gegen docker
getauscht werden.
Über die Datei htpasswd wird anschließend ein Secret im Namespace registry erstellt.
Über das Deployment wird die Definition des Registry Pods durchgeführt. Dieser wird dann über ein automatisch erstelltes ReplicaSet gestartet.
Nach dem Einlesen des Deployments existiert der Pod registry im Namespace
registry, es existiert aber noch kein Zugriff von Außen auf den Container.
Dazu wird ein Service erstellt.
Der Service ist in der Lage den passenden Pod auf Grund des selector zu finden
und diesem eine ClusterIP zu geben. Dies ClusterIP mit dem Port 5000 ist dann
eine Möglichkeit auf den Dienst zuzugreifen.
Allerdings nur auf einer der Cluster Nodes. Um auch von Außen auf den Dienst zugreifen zu können macht es Sinn einen Ingress zu erstellen über den dann der Zugriff erfolgt.
Für den Ingress wird eine DNS Domain benötigt, die auf den Cluster zeigt. Für
das Beispiel ist es registry.internal. Um auch per https auf den Dienst
zugreifen zu können muss ein TLS Zertifikat vorhanden sein. Diese kann wie Folgt
erstellt werden:
Statt des selbstzertifizierten Zertifikats kann auch ein Let’s Encrypt
Zertifikat über cert-manager oder ein bestehendes Zertifikat verwendet werden.
Aus dem Zertifikat wird nun wiederum ein secret erstellt.
Dieses secret wird in dem folgenden Ingress verwendet.
Die beiden auskommentierten Einträge sind die Verwendung von cert-manager und
einem ClusterIssuer gedacht. Der ClusterIssuer muss dafür zunächst angelegt sein
und die Domain von extern durch den Zertifizierungsdienst - z. B. Let’s Encrypt
Nach dem Erstellen des Ingress ist ist die Registry über https://registry.internal erreichbar.
Rancher ist eine von SUSE entwickelte Verwaltungsplattform für Kubernetes.
Für die Installation wird eine bereits vorhandene Kubernetes Installation und das Tools Helm benötigt.
Bei der Installation über Helm werden durch das Tool die benötigten Steuerdateien für den Cluster aus Templates erstellt und eingespielt.
Zunächst wird der cert-manager für die Zertifikatsverwaltung benötigt.
Nun folgt die eigentlich Rancher Installation
Während der Installation wird die URL für das Webinterface sowie der Zugang zum Anmeldetoken angezeigt.
Die Rancher Kubernetes Engine 2 ermöglicht die Installation und Konfiguration eines Kubernetes Clusters durch wenige Befehle.
Im folgenden wird die Installation unter einer aktuellen Version von Rocky Linux 9 vorgestellt.
Da das System selber Firewall - Regeln setzt sollte eine zusätzliche Firewall Konfiguration deaktiviert sein.
In der Regel läuft auf einem neu installierten Rocky Linux der firewalld.
Der Hostname der Node sollte korrekt gesetzt sein, oder durch hostnamectl gesetzt werden.
Die folgenden Tools werden von RKE2 je nach konfigurierter Umgebung benutzt und sollten installiert sein.
Da das RKE2 einige der in einer Standard - Installation vorherrschenden Limit überschreitet müssen für inotify die Limits erhöht werden.
Die Installation der RKE2 Umgebung kann durch ein Script oder die Installation des Binaries von GitHub durchgeführt werden.
Das Script installiert neben dem Binary auch einige nützliche Scripte über die alle Prozesse des RKE2 gestoppt oder eine Installation entfernt werden kann.
Bei unterstützten Plattformen - wie Rocky Linux - wird zusätzlich ein Repository für den Paketmanager installiert über den ein direktes Update per yum update möglich ist.
Zusätzlich wird das Kommando kubectl für die Verwaltung des Clusters benötigt. Der folgende Aufruf installiert den Befehl direkt nach /usr/local/bin. Um direkt per bash verfügbar zu sein wird auch die Variable PATH erweitert.
Falls dem RKE2 keine weiteren Parameter angegeben werden sollen, kann der Dienst aktiviert und gestartet werden.
Die für den kubectl benötigte Konfiguration kann direkt unter .kube/config im Homeverzeichnis des aktuellen Benutzers und dem von root zur Verfügung gestellt werden.
Nach wenigen Minuten sollte die neue RKE2 Node zur Verfügung stehen.
HowTos rund um das Thema Mikrosoft Windows
Bei der Installation von Mikrosof Windows 11 versuche der Installer immer einen Online Zugang über das Mikrosoft Netzwerk zu benutzen.
Soll stattdessen nur ein lokaler Benutzer eingerichtet werden, ist es möglich während der Installation über die Tastenkombination STRG+F10 eine Eingabeaufforderung zu starten und dort über das folgende Kommando:
Es wird der Rechner sofort neu gestartet und der Einrichtungsdialog wird normal durchlaufen ohne allerdings einen Online-Zugang zu benötigen.
Dazu beim Dialog ‘Wie möchten Sie dieses Gerät einrichten’ den Punkt ‘Für persönliche Verwendung einrichten’ und danach ‘Anmelden’ auswählen.
Nun nochmals die Eingabeaufforderung mittels STRG+F10 öffnen und den Befehl ipconfig /release zum unterbrechen der Internetverbindung eingeben.
Die Eingabeaufforderung schließen und den Punkt Erstellen Sie eines auswählen.
Über den folgenden Dialog wird dann ein lokales Konto eingerichtet.
Works with openssl >= 1.1.1
Works with openssl >= 1.1.1
Um eine CA als Trust dem Betriebssystem hinzuzufügen wird die CA - Datei im Verzeichnis /etc/pki/ca-trusted/source/anchors hinzugefügt und über den Befehl update-ca-trust eingebunden.
Beispiel für die MyLinuxTime CA:
HowTos rund um das Thema Prometheus
Create a self-signed cert for node-exporter:
$ openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout node_exporter.key -out node_exporter.crt -subj “/C=ZA/ST=CT/L=SA/O=VPN/CN=localhost” -addext “subjectAltName = DNS:localhost” Move the certs into the directory we created:
$ mv node_exporter.* /etc/node-exporter/ Install htpasswd so that we can generate a password hash with bcrypt, which will prompt you for a password that we are setting for the prometheus user::
$ apt install apache2-utils $ htpasswd -nBC 10 "" | tr -d ‘:\n’; echo Now populate the config for node-exporter:
$ cat /etc/node-exporter/config.yml
tls_server_config:
cert_file: node_exporter.crt
key_file: node_exporter.key
basic_auth_users:
prometheus:
$ chown -R ${NODE_EXPORTER_USER}:${NODE_EXPORTER_USER} /etc/node-exporter Then create the systemd unit file:
$ cat > /etc/systemd/system/node_exporter.service « EOF [Unit] Description=Node Exporter Wants=network-online.target After=network-online.target StartLimitIntervalSec=500 StartLimitBurst=5 [Service] User=${NODE_EXPORTER_USER} Group=${NODE_EXPORTER_USER} Type=simple Restart=on-failure RestartSec=5s ExecStart=${BIN_DIRECTORY}/node_exporter –web.config=/etc/node-exporter/config.yml [Install] WantedBy=multi-user.target EOF Reload systemd and start node-exporter
$ systemctl daemon-reload $ systemctl enable node_exporter $ systemctl restart node_exporter Prometheus Config Copy the /etc/node-exporter/node_exporter.crt from the node-exporter node to prometheus-node, then in the /etc/prometheus/prometheus.yml config:
 scrape_configs:
PromQL wird benutzt um aus einer Prometheus Time-Series-Database (TSD) Daten abzufragen.
Die Daten liegen als Metriken vor, die bei jedem erneuten Abruf (scrape) von den Exportern aktualisiert werden. Dabei wird den Metriken jeweils der aktuelle Timestamp hinzugefügt. Über PromQL lässt sich daher sehr einfach die Veränderung der Metriken über die Zeit nachverfolgen.
Zusätzlich zu den Metriken selber werden Attribute (label) gesetzt um die Metrik genauer zu beschreiben.
Wie bei der Ausgabe ersichtlich sind für node_cpu_seconds_total 3 Attribute
gesetzt: instance, job und mode
Um auf ein oder mehrer Attribute zu filtern werden sie hinter der Metrik in geschweiften Klammern angegeben.
Hierdurch wird die Ausgabe eingeschränkt.
Um die Anzahl der CPU Kerne herauszufinden könnte reicht die Zählung der
Ergebniszeilen (count).
Allerdings nur solange es nicht mehrere Instanzen gibt. Bei einer zusätzlichen Instanz mit gleicher Anzahl an CPUs würde nicht 2 pro Instanz ausgegeben, sondern nur 4, da die Zeilen zusammengezählt werden.
Das richtige Ergebnis erhält man nur, wenn man den count nur auf die gleiche
Instanz anwendet, also eine Gruppierung auf die Instanz vornimmt.
Sollte der Wert häufiger benötigt werden, machen eine ‘recording rule’ Sinn. Hierbei werden - parallel zum Abholen neuer Metriken durch den Prometheus Server - auch auf Grund der recording rules eigene Metriken berechnet. Dies verhindert, dass oft genutzte Werte immer wieder innerhalb der PromQL Queries erneut berechnet werden.
Diese recording rule definiert eine neue Metrik
instance:node_cpu_seconds_total:count, die genau der im vorherigen Bespiel
erzeugten Abfrage entspricht.
Um diese recording rule zu aktivieren wird sie in eine yaml Datei gepackt und
über rules_file in der Prometheus Konfiguration geladen.
Mit dieser Metrik ist es dann recht enfach die Load der Instanzen
(node_load1), die die Summer der Loads aller Scheduler darstellt, durch die
Anzahl der Scheduler (= Anzahl der CPU Kerne) zu teilen und einen vergleichbaren
Wert für alle Instanzen zu haben. Wir müssen dann nicht mehr wissen wieviele CPU
Kerne die Instanzen haben, da alles relativ zu einem CPU Kern dargestellt wird.
Eigentlich ist es nur die Division der Load (node_load1) durch unsere Metrik
(instance:node_cpu_seconds_total:count).
Allerdings haben die beiden Werte nicht alle Attribute gleich. node_load1 hat
noch das zusätzliche Attribut job. Dieses gibt es bei
instance:node_cpu_seconds_total:count nicht.
Daher ist bei der Division dieses Attribut zu ignorieren oder die Division nur
auf das Attribut intance anzuwenden.
HowTos rund um das Thema ZigBee
Der im Rahmen des Themenabends durchgeführte Kurs erklärt die ersten Schritte der Einrichtung und Konfiguration einer ZigBee basierten Homeautomation. Dabei geht es nicht darum bestehende - kommerzielle - Gateways zur Verwaltung von ZigBee Geräten einzusetzen, sondern auf einem RaspberryPi oder ähnlichen Rechnern unter Linux ein Gateway zusammen mit einem CC2531 Netzwerksniffer aufzubauen.
Für den Kurs wird keine explizite Hard- oder Software benötigt und die Teilnehmer können dem Vortrag und den Vorführungen folgen. Es ist aber möglich selber die einzelnen Schritte nachzuvollziehen und ebenfalls über den eigenen Rechner ein ZigBee Netz aufzubauen.
Dafür wird folgendes benötigt:
Auf den Debugger für den CC2531 und das Adapterkabel kann verzichtet werden, wenn ein CC2531 mit vorinstallierter Coordinator - Software für zigbee2mqtt gekauft wird. Damit fällt dann auch der Installationsschritt zum flashen des CC2531 weg.
Viele der aktuell erhältichen Coordinator sind auch schon mit einer Firmware ausgestattet, die es erlaubt per Software - ohne den Debugger - die Geräte direkt zu flashen.
Neben dem CC2531 können auch andere Coordinator eingesetzt werden. Diese sind in der Liste der unterstützten Coordinatoren aufgelistet.
Zusammen mit einem Laptop mit Linux oder einem RaspberryPi mit Raspberry Pi OS können alle Schritte nachvollzogen werden. Beim Paketmanager gehen wir von einem Debian-basierenden Grundsystem aus.
Eine Liste weiterer Endgeräte, die mit dem Gateway in der aktuellen Version genutzt werden können ist auf der Projektseite auf GitHub zu finden.
Um auf den CC2531 die geeignete Firmware aufzuspielen wird ein CC Debugger von Texas Instruments sowie ein Adapter benötigt. Diese sind über einige Plattformen wie z. B. Amazon bestellbar (Debugger, Adapter).
Zusätzlich wird die entsprechende Firmware und das Tool zum Flashen benötigt.
Die für uns interessante Firmware wird auf der GitHub Seite des Gateways zur Verfügung gestellt und dort auch immer wieder aktualisiert. Dabei gibt es dort 2 verschiedene Varianten des Firmware:
Die Coordinator Firmware ist für die Verwaltung der Geräte zuständig und ist quasi der Netzverwalter. Alleine kann ein Coordinator mit einem CC2531 in der aktuellen Firmware - Version bis zu 30 Geräte direkt verwalten. Andere Chips können durchaus mehr verwalten.
Um mehr Geräte nutzen zu können werden Router benötigt. Diese können entweder durch CC2531 mit Router Firmware oder durch Dauerstrom Geräte wie z. B. dem Osram Smart+ Plug zur Verfügung gestellt werden. Dabei ist es abhängig von den Geräten selber wie viele Geräte sie wiederum verwalten können.
Zum Flashen unter Linux wird cc-tool benötigt. Dieses lässt sich problemlos per git herunterladen und lokal compilieren und nutzen:
Danach müssen sowohl der CC Debugger als auch der damit verbundene CC2531 an den Rechner angeschlossen werden. Die LED am CC Debugger wird dann zunächst rot leuchten. Nach einem Druck auf die Reset - Taste sollte sie dann grün leuchten.
Sollte der CC Debugger weiterhin rot leuchten, sicherheitshalber richtige Polung der Anschlüsse überprüfen!
Damit ist der CC Debugger im Programmiermodus und die Firmware kann aufgespielt werden:
Damit ist die Vorbereitung des CC2531 abgeschlossen und der kann benutzt werden.
Als Gateway nutzen wir zigbee2mqtt von Koenkk. Das Gateway ist komplett auf GitHub zu finden.
Um auch einfach wieder Updates durchführen zu können sollte das Gateway per Git heruntergeladen und verwaltet werden:
Wir gehen dabei davon aus, dass die Installation auf einem RaspberryPi stattfindet und der Benutzer der Benutzer pi ist. Ansonsten bitte anpassen.
Um die Software laufen zu lassen muss die Umgebung zur Verfügung gestellt werden. Dies ist Node.js mit npm.
Mit den folgenden Aufrufen sollte die Version getestet werden:
Danach können dann die Module installiert und konfiguriert werden:
Damit ist das Gateway vorbereitet, kann aber noch nicht gestartet werden, da noch kein Mosquitto MQTT Server zur Verfügung steht um die Daten des Gateways zu speichern.
Der Mosquitto MQTT Server ist für die Zwischenspeicherung der Nachrichten, die vom ZigBee - Netzwerk kommen und dahin gehen sollen zuständig. Er funktioniert wie ein Telegramm - Dienst. Das Gateway kann z. B. den Zustand eines Schalters an eine Adresse (topic) des MQTT senden. Clients wie z. B. NodeRed oder OpenHAB2 etc. können nun an dieser Adresse lauschen (subscribe) und bekommen dadurch jede Änderung der Daten an dieser Adresse mit. Dadurch können sie sofort auf die Änderung reagieren von von sich aus auf eine Adresse eine Naschricht schicken oder Aktionen auslösen.
Für die Grundinstallation ohne jegliche Absicherung des Dienstes reicht die folgende Zeile:
Vor dem Produktiveinsatz des Dienstes sollte die Kommunikation zwischen MQTT server und weiteren externen Geräten abgesichert werden.
Der Datei /opt/zigbee2mqtt/data/configuration.yaml liegt die Konfiguration für das Gateway. Falls der MQTT nicht auf dem lokalen Rechner läuft oder es eine Anpassung für den Benutzernamen und das Kennwort gibt, können diese hier eingetragen werden:
Es handelt sich hierbei um eine yaml - Datei. Bei diesem Dateityp ist es wichtig die Einrückungen (Leerschritte) beizubehalten.
Zusätzlich zu dem Einrichten des mqtt - Gateways sollte dem ZigBee - Netzwerk eine eigene Netzwerkadresse gegeben werden. Diese sollte möglichst nicht manuell sondern automatisch generiert werden um sie einmalig zu halten.
Ein zusätzlicher Eintrag in die Konfigurationsdatei mit dem folgenden Inhalt sorgt für die automatische Generierung einer Netzwerkadresse:
Nun steht dem ersten Start nicht mehr im Weg:
Der Server sollte nun melden, dass er an den MQTT Server verbunden ist.
Geräte, die in den Verbindungsmodus geschaltet wurden sollten nun auch sichtbar werden.
Die Meldungen, die nun vom an den MQTT Server geschickt und dort gespeichert werden lassen sich über den folgenden Befehl abrufen:
Anpassen des friendly_name
Jedes Gerät hat seine eindeutige ID, aber die ID kann sich keiner merken. Daher kann in der Datei /opt/zigbee2mqtt/data/configuration.yaml der friendly_name angepasst werden um einen sprechenden Namen für die Geräte zu bekommen.
Dazu zunächst den Server stoppen (mit STRG+C oder systemctl stop zigbee2mqtt) und die Datei dann editieren.
Beispiel:
Nach dem Neustart des Dienstest nutzt der Server dann statt der bisherigen ID den friendly_name.
Weitere Konfigurationsparameter sind auf der Website zu finden: https://www.zigbee2mqtt.io/information/configuration.html
Nachdem unsere Steckdose einen sprechenden Namen hat, können wir an das Gerät Nachrichten schicken (geht natürlich auch mit den IDs, ist aber mühsamer):
Der Nachrichteninhalt ist dabei ein JSON - Element, dass das Gateway auswertet und entsprechende Kommandos verschickt. Um ein Kommando zu senden wir an den Topic, der über mosquitto_sub ausgelesen wurde ein /set angehangen und die Nachricht dorthin geschickt.
Das Gateway selber informiert auch über Vorgänge und lässt sich per MQTT steuern: https://www.zigbee2mqtt.io/information/mqtt_topics_and_message_structure.html
Für einige Geräte sind sogar OTA-Updates verfügbar:
Es ist sinnvoll den Dienst so einzurichen, dass er beim Systemstart automatisch startet und nicht immer auf der Konsole per Hand aufgerufen werden muss.
Dazu kann die Datei /etc/systemd/system/zigbee2mqtt.service mit folgendem Inhalt angelegt werden:
Nach dem Anlegen kann er Dienst direkt für den Systemstart eingebunden und gestartet werden:
Ausgaben des Dienstes können jetzt über journalctl ausgelesen werden:
Ein schneller Weg um eine Oberfläche für die ZigBee Geräte zu bekommen ist die Software Home Assistant. Diese Software unterstützt eine Vielzahl an IoT - Geräten unter anderem auch ZigBee über mqtt.
Die Installation unter Debian:
Nach der Installation kann über Port 8123 des Rechners auf den Home Assistant zugegriffen werden.
Im Home Assistant muss dann unter den Integrationen das MQTT - Modul aktiviert und auf den Server localhost konfiguriert werden. Damit die Integration vollständig ist, muss in der zigbee2mqtt configuration.yaml die Homeasssistant Integration aktiviert sein.
Prüfungsvorbereitungen auf die Prüfungen des Linux Professional Institute (LPI)
Die Prüfungsvorbereitung enthält alle Objectives des Linux Professional Institute für die Prüfungen LPI-700 für die Prüfungsversion V1.0.
Die Prüfungsvorbereitung enthält alle Objectives des Linux Professional Institute für die Prüfungen LPI-101 und LPI-102.
Die Prüfungsvorbereitung enthält alle Objectives Linux Professional Institute für die Prüfungen LPI-201 und LPI-202.