Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Die Idee eine "Cloud" zu bauen entstand während der Corona-Zeit. Anstatt "Fernsehen" könnte man doch was Sinnvolles ausprobieren. Außerdem ist der vorhandene Raspberry 4 bereits überlastet, und kann schwerlich neue Dienste anbieten. Da wäre doch ein System, das skalierbar ist, beliebig viele Services anbieten kann usw. doch genau das Richtige. Außerdem sind Microservices leichter auf neue Hardware portierbar! Ich erinnere mich noch genau, wie aufwändig der Umstieg vom Raspberry 2 auf den Raspberry 3 und dann auf den Raspberry 4 war. Ich musste jedes mal aufs Neue nachdenken, wie den die Installation genau geht, habe viel Zeit investiert und erreichte am Ende bestenfalls, dass ich nachher dieselben Dienste nutzen konnte wie vorher:) Darum: eine Cloud muss her.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 173
Veröffentlichungsjahr: 2021
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Bau einer K8s bare-metal-cloud mit RaspberryPI
Ein Kubernetes-Cluster auf Basis RaspberryPi 4 und Microk8s.Integration der notwendigen EDV-Umgebung.
„Von einem der auszog, das Fürchten zu lernen“.
Alfred Sabitzer
https://www.linkedin.com/in/alfred-sabitzer-805312183/
https://www.xing.com/profile/Alfred_Sabitzer/cv
Vorwort
Die Idee eine „Cloud“ zu bauen entstand während der Corona-Zeit. Anstatt „Fernsehen“ könnte man doch was Sinnvolles ausprobieren. Außerdem ist der vorhandene Raspberry 4 bereits überlastet, und kann schwerlich neue Dienste anbieten. Da wäre doch ein System, das skalierbar ist, beliebig viele Services anbieten kann usw. doch genau das Richtige. Außerdem sind Microservices leichter auf neue Hardware portierbar! Ich erinnere mich noch genau, wie aufwändig der Umstieg vom Raspberry 2 auf den Raspberry 3 und dann auf den Raspberry 4 war. Ich musste jedes mal aufs Neue nachdenken, wie den die Installation genau geht, habe viel Zeit investiert und erreichte am Ende bestenfalls, dass ich nachher dieselben Dienste nutzen konnte wie vorher:)
Darum: eine Cloud muss her.
Generell: Der Bau einer Cloud ist ein komplexes Unternehmen (am einfachsten ist es, wenn man sich in einer bereits existenten Cloud einmietet – da gibt es genug Anbieter am Markt).
Dieses Buch beschreibt die einzelnen Schritte, die ich durchgeführt habe um mir meine eigene Cloud zu bauen. Hier wird nur der Hardwareaufbau sowie die Basiseinrichtung beschrieben. Der Bau von Microservices, das Einrichten einer CI/CD-Strecke, ja selbst das konfigurieren von Prometheus und Grafana überschreitet den Rahmen dieses Buches. Hier werden wirklich nur die Basisfunktionen (HA-Cluster, Cluster-Storage, Ingress, Zertifikate, Dashboard …) gestreift.
Hier finden sich viele Codefragmente, die eine Idee geben können, wie jemand das bei sich zu Hause selbst tun könnte. Diese Codeteile erheben keinen Anspruch auf Funktionalität oder dergleichen. Die Verwendung erfolgt auf eigenes Risiko.
Generell würde mich der Austausch mit anderen „Cloud“-Bauern interessieren. Ideen, Verbesserungen, Anregungen udglm. sind herzlich willkommen. Der Auto ist erreichbar unter [email protected] erreichbar. Teile des Buches gibt es online auf https://whttps://www.slainte.at/index.php/k8s/cloudww.slainte.at/index.php/k8s/cloud.
Unzmarkt, im Mai 2021.
Prinzipieller Aufbau einer Cloud
Schaubild 1: Cloud Struktur
Diese Abbildung beschreibt den Aufbau meiner „On-Premise“-Cloud mit allen vorhanden Komponenten. Die „Cloud“ selbst wird durch die Umrandung für Infrastruktur, Dämonset und Service dargestellt. Alles innerhalb dieser Umrandung ist in der Cloud bzw. Teil der Cloud.
Eine allgemeine Cloud besteht im wesentlichen aus den folgenden Kernkomponenten:
Infrastruktur – Alles was physikalisch vorhanden sein muss
Dämonsets – Alle Softwarekomponenten zum Betrieb eines Clusters
Service – Alle Infrastruktservices, die notwendig sind um Business-Services anzubieten bzw. zu betreiben
Konfiguration – Alle Konventionen/Konfiguration die zum Betrieb der Business-Services notwendig sind
Umsysteme – Alle Systeme, die aus verschiedenen Gründen nicht (nur) im Cluster vorhanden sind (z.b. Internet-Router)
Entwicklungssysteme – Alle System- und Softwarekomponenten die notwendig sind, um Business-Services zu entwickeln.
Die nachfolgenden Kapitel versuchen diesen prinzipiellen Cloud-Aufbau auf einer privaten „On-Premise“-Cloud nachzubilden und zu beschreiben.
Die CNCF Cloud Native Interactive Landscape auf https://www.cncf.io/ nennt derzeit folgende Applikationen:
Schaubild 2: Cloud Native Landscape
Prinzipiell sollte der Aufbau einer Cloud nicht unterschätzt werden. Auf humorige Weise ist das im folgenden Bild dargestellt.
Schaubild 3: Cloud Eisberg
Aufbau des Gesamtsystemes
Schaubild 4: Gesamtsystem
Ein Raspberry Steuernode (für Monitoring, Backup, ansible, Entwicklung …) sowie ein Raspberry-Cluster mit fünf Raspberry’s.
Auf dem Cluster werden die folgenden K8s installiert.
Kustomize # k8s native configuration managementlinkerd # Linkerd is a service mesh for KubernetesWebservice # einfacher Webservicecert-manager # Zertifikatsmanagerportainer # Portainer UI for your Kubernetes clusterprometheus # Prometheus operator for monitoring and loggingregistry # Private image registry dashboard # The Kubernetes dashboardmetrics-server # K8s Metrics Server for API access to service metricsingress # Ingress controller for external accesslonghorn # ClusterStoragehelm3 # Helm 3 - Kubernetes package managermetallb # Loadbalancer for your Kubernetes clusterha-cluster # Configure high availability on the current noderbac # Role-Based Access Control for authorisationdns # CoreDNSstorage # Storage class; allocates storage from host directory
disabled:
helm # Helm 2 - the package manager for Kubernetes
host-access # Allow Pods connecting to Host services smoothly
Die Installationsreihenfolge ist von unten nach oben.
Der Raspberry-Steuernode wird für Monitoring, Backup, dhcp, ntp usw. benutzt. Weiters ist dieser Raspberry auch der Entwicklungsrechner. Dh. Dort wird neben Docker, Arkade, Ansible usw. auch ein separates microk8s installiert.
Hier werden dann alle Komponenten getestet, bevor die Konfiguration am Cluster installiert wird. Ziel ist es ein versioniertes Deployment mit einer integrierten CI/CD-Strecke zu haben.
Aufbau der Hardware
Inspiration:
https://www.picocluster.com/blogs/picocluster-assembly-instructions/assemble-pico-5h-rpi4https://www.reichelt.at/at/de/raspberry-pi-fan-tower-4-stoeckig-rpi-fan-tower-4-p299268.html?PROVID=2807&gclid=EAIaIQobChMItIXp4e_N8AIVBigYCh1V6QINEAYYBiABEgKeRPD_BwEhttps://www.amazon.de/GeeekPi-6-Layers-Raspberry-K%C3%BChlk%C3%B6rper-Stapelbares/dp/B085ZJQMXF/ref=sr_1_5?adgrpid=70647801065&dchild=1&gclid=EAIaIQobChMItIXp4e_N8AIVBigYCh1V6QINEAAYAyAAEgI5Z_D_BwE&hvadid=391629950630&hvdev=c&hvlocphy=20047&hvnetw=g&hvqmt=e&hvrand=8703768946581253209&hvtargid=kwd-296167140860&hydadcr=27956_1978103&keywords=raspberry+pi+cluster&qid=1621156967&sr=8-5https://www.reichelt.at/at/de/gehaeuse-fuer-raspberry-pi-4-alu-schwarz-rpi-case-alu07-p261677.html?PROVID=2807&gclid=EAIaIQobChMI54DQs_HN8AIV0gCiAx2dYQPpEAQYBiABEgLjHfD_BwEhttps://www.amazon.de/Geekworm-Raspberry-Aluminum-Passive-Dissaption/dp/B07ZVJDRF3https://magpi.raspberrypi.org/articles/group-test-best-raspberry-pi-4-thermal-cases-tested-and-rankedhttps://raspberrytips.com/raspberry-pi-4-passive-cooling/
Ich habe mir einen Pico-Cluster bestellt. Diese Hardware hat ein sympathisches Gehäuse, in dem alle Komponenten ihren Platz haben. Diese Hardware kommt aus den USA, was zu folgenden Problemen führt
Der Stromstecker ist aus den USA. Für Europa braucht man einen eigenen. Ein altes PC-Stromkabel reicht
Es wird Zoll fällig. Die Höhe des Zolls berechnet sich an der Höhe des Einkaufwertes.
Dh. nur das Notwendigste aus den USA kaufen. Die Raspberrys und die SD-Speicherkarten gibt es auch in Europa (und sind teilweises sogar billiger).Es gibt aber auch noch andere Hardwareanbieter (siehe Links).Prinzipiell braucht man ein paar Raspberrys, SD-Karten, einen Nway-Switch, Netzwerkkabel, passendes Power-Supply, Kühlung. Ob es ein aktiver Lüfter sein muß, oder ob man mit passiven Kühlteilen das Auslangen findet muß jeder selbst entscheiden. Ich persönlich glaube mittlerweile, wenn man meine aktive Kühlung mit Lüfter braucht, dann sollte man stärkere Hardware nehmen:). Dh. Es gibt gute passive Kühlsysteme, die ihren Zweck erfüllen.
Meine Lieferung sieht aus wie folgt:
Schaubild 5: Pico Cluster 1
Es kommt alles in einer Box. Das Pico-Gehäuse aus Acryl hat eine Schutzfolie. Es sind alle Schrauben, passiven und aktiven Elemente gut verpackt.
Schaubild 6: Pico Cluster 2
Meine Raspberrys haben auch ein passives Kühlteil (das große Schwarze) aus Aluminium.
Schaubild 7: Pico Cluster 3
Hier kann man den zusammengebauten Tower plus der Stromverteilung sehen. Die Stromkabel sind bereits an den einzelnen Raspberrys angeschlossen. Der Tower ist bereits mit der Grundplatte verbunden.
Schaubild 8: Pico Cluster 4
Hier kann man die Stromversorgung sehen. Diese Stromversorgung reicht für alle fünf Raspberrys.
Schaubild 9: Pico Cluster 5
Hier sieht man den Nway-Switch, bereits mit dem Pico-Seitenteil verbunden.
Schaubild 10: Pico Cluster 6
Ansicht „von links“ mit dem aktiven Lüfter (der nicht leise ist).
Schaubild 11: Pico Cluster 7
Ansicht „von rechts“ mit dem nway-Switch und der Stromversorgung im Hintergrund.
Sehr elegant gelöst ist bei Pico die Verbindung der einzelnen Seitenteile. Das ist bei jeder Seitenkante eine Schraube mit Mutter. Dh. jede einzelne Seite kann mit vier Schrauben gelöst und entnommen werden. Das ist praktisch, wenn man die SSD-Karten wieder mal neu aufsetzen will / muß.
Ab nun kann der Cluster mit einem richtigen Betriebssystem und den Softwarekomponenten versorgt werden.
Bisher erreicht:
Hardware zusammengebaut
Installieren der Raspberrys
Inspiration:
https://www.raspberry-pi-geek.de/ausgaben/rpg/2018/04/raspberry-pi-farm-mit-ansible-automatisieren/https://www.raspberrypi.org/blog/raspberry-pi-imager-update/
Wir wählen das richtige Betriebssystem, und initialiseren alle SD-Karten.
Schaubild 12: Raspberry Pi Imager
Alle Karten mit dem Raspberry-Imager https://www.raspberrypi.org/blog/raspberry-pi-imager-update/initialisieren.
Für jeden Node merken wir uns die MAC-Adresse. Am DHCP-Server müssen die richtigen Einträge konfiguriert werden.
alfred@monitoring:~$ sudo tail -f /var/log/syslog | grep -i dhcp
Apr 14 07:28:44 monitoring dhcpd[2264]: DHCPACK on 192.168.0.24 to dc:a6:32:ed:09:68 (ubuntu) via eth0
Apr 14 07:28:44 monitoring dhcpd[2264]: DHCPOFFER on 192.168.0.25 to dc:a6:32:ee:f2:15 (ubuntu) via eth0
Apr 14 07:28:44 monitoring dhcpd[2264]: DHCPREQUEST for 192.168.0.25 (192.168.0.2) from dc:a6:32:ee:f2:15 (ubuntu) via eth0
Apr 14 07:28:44 monitoring dhcpd[2264]: DHCPACK on 192.168.0.25 to dc:a6:32:ee:f2:15 (ubuntu) via eth0
alfred@monitoring:~$ sudo nano /etc/dhcp/dhcpd.conf
# unterster
host pc1 {
hardware ethernet dc:a6:32:ee:f1:94;
fixed-address 192.168.0.201;
server-name "pc1";
}
# vierter
host pc2 {
hardware ethernet dc:a6:32:ee:f1:c4;
fixed-address 192.168.0.202;
server-name "pc2";
}
# dritter
host pc3 {
hardware ethernet dc:a6:32:ee:f2:15;
fixed-address 192.168.0.203;
server-name "pc3";
}
# zweiter
host pc4 {
hardware ethernet dc:a6:32:ee:f2:21;
fixed-address 192.168.0.204;
server-name "pc4";
}
# oberster
host pc5 {
hardware ethernet dc:a6:32:ed:09:68;
fixed-address 192.168.0.205;
server-name "pc5";
}
alfred@monitoring:~$ sudo systemctl restart isc-dhcp-server
alfred@monitoring:~$ sudo systemctl status isc-dhcp-server
● isc-dhcp-server.service - ISC DHCP IPv4 server
Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-04-14 07:42:54 CEST; 8s ago
Docs: man:dhcpd(8)
Main PID: 22045 (dhcpd)
Tasks: 4 (limit: 9257)
CGroup: /system.slice/isc-dhcp-server.service
└─22045 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dh>
Apr 14 07:42:54 monitoring.slainte.at sh[22045]: Wrote 0 new dynamic host decls to leases file.
Apr 14 07:42:54 monitoring.slainte.at sh[22045]: Wrote 20 leases to leases file.
Apr 14 07:42:54 monitoring.slainte.at dhcpd[22045]: Wrote 20 leases to leases file.
Apr 14 07:42:54 monitoring.slainte.at dhcpd[22045]: Listening on LPF/eth0/dc:a6:32:d3:aa:3e/192.168.0.0/24
Apr 14 07:42:54 monitoring.slainte.at dhcpd[22045]: Sending on LPF/eth0/dc:a6:32:d3:aa:3e/192.168.0.0/24
Apr 14 07:42:54 monitoring.slainte.at sh[22045]: Listening on LPF/eth0/dc:a6:32:d3:aa:3e/192.168.0.0/24
Apr 14 07:42:54 monitoring.slainte.at sh[22045]: Sending on LPF/eth0/dc:a6:32:d3:aa:3e/192.168.0.0/24
Apr 14 07:42:54 monitoring.slainte.at sh[22045]: Sending on Socket/fallback/fallback-net
Apr 14 07:42:54 monitoring.slainte.at dhcpd[22045]: Sending on Socket/fallback/fallback-net
Apr 14 07:42:54 monitoring.slainte.at dhcpd[22045]: Server starting service.
Bisher erreicht:
Speicherkarten installiert
Bootfähige Nodes
Reservierung der MAC-Adressen am DHCP-Server
Lokale Konfiguration
Diese Konfiguration muß händisch auf jedem Node gemacht werden. Dazu loggt man sich auf jedem Node ein. Die Beispiele hier beziehen sich auf den pc1.Der Standard User für die erstmalige Anmeldung ist ubuntu mit dem Passwort ubuntu.
alfred@bureau:~$ ssh ubuntu@pc1
The authenticity of host 'pc1 (192.168.0.201)' can't be established.
ECDSA key fingerprint is SHA256:3AtqqBeZQjedxbb3f1c2Amw2VECVS3R3IF47c3xUZSo.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'pc1,192.168.0.201' (ECDSA) to the list of known hosts.
ubuntu@pc1's password:
You are required to change your password immediately (administrator enforced)
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-1033-raspi aarch64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Apr 14 09:12:44 UTC 2021
System load: 0.25 Temperature: 37.0 C
Usage of /: 4.2% of 58.26GB Processes: 132
Memory usage: 3% Users logged in: 0
Swap usage: 0% IPv4 address for eth0: 192.168.0.201
* Introducing self-healing high availability clusters in MicroK8s.
Simple, hardened, Kubernetes for production, from RaspberryPi to DC.
https://microk8s.io/high-availability
43 updates can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable
Last login: Wed Apr 14 09:12:26 2021 from 192.168.0.3
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for ubuntu.
Current password:
New password:
Retype new password:
passwd: password updated successfully
Connection to pc1 closed.
Bei der Gelegenheit wird das Passwort geändert.
ubuntu@ubuntu:~$ sudo su -l
root@ubuntu:~# apt-get update && apt-get upgrade -y
Konfiguration der sudo-Berechtigungen mit visudo. Mitglieder dieser Gruppe dürfen root-Kommandos ohne Passwort absetzen.
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
Anlegen des Users ansible und Aufnahme in die sudo-Gruppe.
root@ubuntu:~# adduser ansible
Adding user `ansible' ...
Adding new group `ansible' (1001) ...
Adding new user `ansible' (1001) with group `ansible' ...
Creating home directory `/home/ansible' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for ansible
Enter the new value, or press ENTER for the default
Full Name []: Ansible Automatisierung
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
root@ubuntu:~# usermod -aG sudo ansible
Es wird auch ein „Microk8s“-User angelegt. In unserem Falle „alfred“.
root@ubuntu:~# adduser alfred
root@ubuntu:~# usermod -aG sudo alfred
Editieren der /boot/firmware/cmdline.txt um die Container-Features zu ermöglichen.
root@ubuntu:~# nano /boot/firmware/cmdline.txt
root@ubuntu:~# cat /boot/firmware/cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc group_enable=cpuset cgroup_memory=1 cgroup_enable=memory
root@ubuntu:~#
Dann setzen des hostnames und der hosts-Datei
root@ubuntu:~# cat /etc/hosts
192.168.0.201 pc1
192.168.0.202 pc2
192.168.0.203 pc3
192.168.0.204 pc4
192.168.0.205 pc5
192.168.0.2 monitoring
192.168.0.2 ntp
127.0.0.1 localhost pc1
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
alfred@ubuntu:~$ sudo nano /etc/hostname
alfred@ubuntu:~$ cat /etc/hostname
pc1
Die Einträge in /etc/hosts werden sinngemäß überall gemacht:)
Auch am Monitoring-Server und am „Bureau“-Rechner.
Eintragen der fixen IP-Adresse. Jeder Node im Cluster hat eine fixe IP-Adresse.
192.168.0.201 pc1192.168.0.202 pc2192.168.0.203 pc3192.168.0.204 pc4192.168.0.205 pc5
Disablen der Network-config:
root@ubuntu:~# nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
root@ubuntu:~# cat /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network: {config: disabled}
root@ubuntu:~#
root@ubuntu:~# nano /etc/netplan/50-cloud-init.yaml
root@ubuntu:~# cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
eth0:
# dhcp4: true
optional: true
dhcp4: false
addresses:
- 192.168.0.201/24
gateway4: 192.168.0.1
nameservers:
addresses: [87.243.129.30,78.152.93.30]
version: 2
root@ubuntu:~# netplan apply
root@ubuntu:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether dc:a6:32:ee:f1:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.201/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::dea6:32ff:feee:f194/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether dc:a6:32:ee:f1:95 brd ff:ff:ff:ff:ff:ff
root@ubuntu:~#
Das ist doppelt gemoppelt zum Eintrag im DHCP-Server. Aber somit kann der DHCP-Server diese Adressen nicht versehentlich zweimal vergeben, und der Cluster kommt auch dann richtig hoch, wenn der DHCP-Server mal nicht da ist.
Zum Abschluß noch ein paar Kleinigkeiten.
sudo iptables -P FORWARD ACCEPT
sudo apt-get install -y mc sshfs
sudo apt-get install -y iptables-persistent
Shutdown -r now
Jetzt hat man ein Grundsystem. Einloggen als masteruser.
Am „client“ kopiert man die Credentials auf den Rechner.
alfred@bureau:~$ ssh-copy-id -i /home/alfred/.ssh/id_rsa.pub pc1
Vernünftige Aliase setzen für den „Master-User“ der MicroK8s.
alfred@pc1:~$ cat .bash_aliases
#Shortcut um sich tipparbeit zu sparen
alias kubectl='microk8s.kubectl'
alias k='kubectl'
alias kall='microk8s kubectl get all --all-namespaces && microk8s kubectl get ingresses --all-namespaces && microk8s kubectl get endpoints --all-namespaces'
#Zeigt die logs der Ingress-Pods
alias klt='(kubectl get pods --all-namespaces) | grep -i nginx-ingress-microk8s-controller | while read a b c; do kubectl logs "$b" -n ingress; done'
alias helm='microk8s.helm3'
Bisher erreicht:
Speicherkarten installiert
Bootfähige Nodes
Reservierung der MAC-Adressen am DHCP-Server
Konfiguration NTP
Login über SSH
NTP-Client
Inspiration:https://www.server-world.info/en/note?os=Ubuntu_20.04&p=ntp&f=3https://wiki.ubuntuusers.de/systemd/timesyncd/https://ubuntu.com/server/docs/network-ntphttps://linuxize.com/post/how-to-set-or-change-timezone-on-ubuntu-20-04/
Konfigurieren des systemd-timesyncd und der richtigen Zeitzone. Es wird der lokale Timeserver als Quelle eingetragen.
alfred@pc1:~$ sudo timedatectl set-timezone Europe/Vienna
alfred@pc1:~$ sudo nano /etc/systemd/timesyncd.conf
alfred@pc1:~$ cat /etc/systemd/timesyncd.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.
[Time]
ntp
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
alfred@pc1:~$
ntp ist im Host-File definiert. Dann starten des Servicessudo systemctl enable systemd-timesyncd.servicesudo systemctl restart systemd-timesyncd.servicesudo systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-05-19 21:12:58 CEST; 2s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 2322 (systemd-timesyn)
Status: "Initial synchronization to time server 192.168.0.2:123 (ntp)."
Tasks: 2 (limit: 9257)
Memory: 1.2M
CGroup: /system.slice/systemd-timesyncd.service
└─2322 /lib/systemd/systemd-timesyncd
May 19 21:12:58 pc1 systemd[1]: Starting Network Time Synchronization...
May 19 21:12:58 pc1 systemd[1]: Started Network Time Synchronization.
May 19 21:12:58 pc1 systemd-timesyncd[2322]: Initial synchronization to time server 192.168.0.2:123 (ntp). (192.168.0.2).
Überprüfen am Zeitserver
root@monitoring:~# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
^* 178.189.127.148 1 10 377 564 -1241us[-1335us] +/- 9749us
^+ 178.189.127.149 1 10 377 711 -1134us[-1227us] +/- 9455us
^+ 178.189.127.147 1 10 377 497 -814us[ -814us] +/- 9744us
^+ 80.64.136.37 2 10 377 608 -1982us[-2075us] +/- 32ms
^- 141.255.175.253 2 10 377 836 -1170us[-1263us] +/- 36ms
^+ vpn.oe9hamnet.at 1 10 377 763 -82us[ -175us] +/- 13ms
^- palmers.nobody.at 2 10 377 915 -3636us[-3729us] +/- 44ms
^- chilipepper.canonical.com 2 10 377 965 -2478us[-2572us] +/- 59ms
^- pugot.canonical.com 2 10 377 893 -3647us[-3741us] +/- 51ms
^- alphyn.canonical.com 2 10 377 729 -3778us[-3871us] +/- 119ms
^- golem.canonical.com 2 10 377 725 -1245us[-1339us] +/- 55ms
^- 197-81-132-246.absoluteh> 3 10 377 365 -3165us[-3165us] +/- 120ms
^+ clock1.infonet.ee 1 10 377 915 -3190us[-3283us] +/- 26ms
^+ mail.deva-ayurveda.eu 2 10 377 800 -914us[-1008us] +/- 24ms
^- 139.143.5.30 2 10 377 815 -1208us[-1302us] +/- 53ms
root@monitoring:~# chronyc clients
Hostname NTP Drop Int IntL Last Cmd Drop Int Last
192.168.0.3 358 0 10 - 46 0 0 - -
pc4 70 0 11 - 79m 0 0 - -
pc3 70 0 11 - 79m 0 0 - -
pc2 70 0 11 - 79m 0 0 - -
pc1 74 0 11 - 96 0 0 - -
pc5 70 0 11 - 79m 0 0 - -
192.168.0.31 1 0 - - 19h 0 0 - -
root@monitoring:~#
Bisher erreicht:
Speicherkarten installiert
Bootfähige Nodes
Reservierung der MAC-Adressen am DHCP-Server
Konfiguration NTP
Login über SSH
Verbindung mit NTP-Server hergestellt
NFS-Mount zwischen Nodes:
Inspiration:
https://www.linuxtechi.com/configure-nfs-persistent-volume-kubernetes/
https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-volumes-example-nfs-persistent-volume.html
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
https://blog.mayadata.io/openebs/how-to-run-nfs-on-top-of-openebs-jiva
https://de.wikipedia.org/wiki/SSHFShttps://wiki.ubuntuusers.de/FUSE/sshfs/
SSHFS ist IMHO eine bessere Lösung als NFS. Dazu richtet man einfach eine SSH-Verbindung ein.
Mit ssh-copy-id kann man dann die Credentials kopieren. Ab dann braucht man kein Passwort mehr. Das Einbinden kann so erfolgen:
# Mount NAS-Drive
volume="/mnt/${USER}"
if mount|grep ${volume}; then
echo ${volume} " already mounted for " ${USER}
else
sshfs monitoring:/mnt/rasp/${USER} ${volume}
echo ${volume} " now mounted for " ${USER}
fi
Bis eine besser Lösung gefunden wird, werden alle Nodes auf den "monitoring"-Raspi verbunden.
alfred@pc1:~$ sudo su -l
root@pc1:~# apt-get install sshfs -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
sshfs
0 upgraded, 1 newly installed, 0 to remove and 12 not upgraded.
Need to get 41.9 kB of archives.
After this operation, 115 kB of additional disk space will be used.
Get:1 http://ports.ubuntu.com/ubuntu-ports focal/universe arm64 sshfs arm64 3.6.0+repack+really2.10-0ubuntu1 [41.9 kB]
Fetched 41.9 kB in 1s (59.5 kB/s)
Selecting previously unselected package sshfs.
(Reading database ... 100173 files and directories currently installed.)
Preparing to unpack .../sshfs_3.6.0+repack+really2.10-0ubuntu1_arm64.deb ...
Unpacking sshfs (3.6.0+repack+really2.10-0ubuntu1) ...
Setting up sshfs (3.6.0+repack+really2.10-0ubuntu1) ...
Processing triggers for man-db (2.9.1-1) ...
root@pc1:~#
Key generieren:
root@pc1:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:l+Uj/Ij+B3FGw8MFN6jHyDzNXme31BcQhaDCfheRtkQ root@pc1
The key's randomart image is:
+---[RSA 3072]----+
| .E+*O. |
| . .+Oo o |
| o +oOoo o|
| . ..B=O ..*|
| .S.=Oo..o+|
| .oo+.. . |
| . ... |
| . . |
| .... |
+----[SHA256]-----+
root@pc1:~#
root@pc1:~# ssh-copy-id -i /root/.ssh/id_rsa.pub ansible@monitoring
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'monitoring (192.168.0.2)' can't be established.
ECDSA key fingerprint is SHA256:muGKSK9rmwhof1T5cq4tw6WbaWLvpwMFVKYuvlYLT+A.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ansible@monitoring's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ansible@monitoring'"
and check to make sure that only the key(s) you wanted were added.
Directory erzeugen:
root@pc1:~# mkdir /opt/cluster
Eintrag im fstab:
alfred@pc1:~$ cat /etc/fstab
LABEL=writable/ ext4defaults0 0
LABEL=system-boot /boot/firmware vfat defaults 0 1
ansible@monitoring:/home/ansible/copy /opt/cluster fuse.sshfs rw,delay_connect,idmap=user,uid=0,gid=0,umask=0,allow_other,_netdev,workaround=rename 0 0
Und siehe da (nach Reboot, um zu prüfen ob es sich von selbst mounted):
Filesystem Size Used Avail Use% Mounted on
udev 3.8G 0 3.8G 0% /dev
tmpfs 782M 4.0M 778M 1% /run
/dev/mmcblk0p2 59G 9.2G 47G 17% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/loop0 88M 88M 0 100% /snap/core/11086
/dev/loop2 49M 49M 0 100% /snap/core18/1949
/dev/loop1 88M 88M 0 100% /snap/core/10956
/dev/loop3 49M 49M 0 100% /snap/core18/2002
/dev/loop4 63M 63M 0 100% /snap/lxd/19648
/dev/loop5 28M 28M 0 100% /snap/snapd/11843
/dev/loop6 60M 60M 0 100% /snap/lxd/20330
/dev/loop7 161M 161M 0 100% /snap/microk8s/2175
/dev/loop9 29M 29M 0 100% /snap/snapd/11584
/dev/loop8 180M 180M 0 100% /snap/microk8s/2144
/dev/mmcblk0p1 253M 119M 134M 47% /boot/firmware
ansible@monitoring:/home/ansible/copy 117G 12G 101G 11% /opt/cluster
tmpfs 782M 0 782M 0% /run/user/1001
Diese Schritte müssen auf allen Nodes gemacht werden.
Bisher erreicht:
ansible installiert
Konfiguration des clusters in ansible eingerichtet
Hifreiche Skripten für ansible
5 Nodes zu einem Cluster verbunden
sshfs-mount auf allen Nodes
UFW-Firewall
Inspiration:https://microk8s.io/docs/portshttps://wiki.ubuntu.com/UncomplicatedFirewallhttp://manpages.ubuntu.com/manpages/focal/en/man8/ufw-framework.8.html
Ob so ein Cluster überhaupt eine Firewall braucht ist fraglich (denn der Zugang wird ohnedies über einen Clusteralias gesteuert (und vor dem Cluster sitzt noch ein Firewall-Router)). Diese Kapitel zeigt wie es prinzipiell geht, aber auf dem Picocluster wird keine UFW verwendet.
Ich erzeuge am node
