{"id":8439,"date":"2022-02-12T14:57:26","date_gmt":"2022-02-12T12:57:26","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8439"},"modified":"2022-12-12T16:52:34","modified_gmt":"2022-12-12T14:52:34","slug":"kubernetes-auf-dem-raspberry-pi-4-fuer-anfaenger-single-node-kubernetes-cluster-mit-k3s-erste-kubernetes-grundlagen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/kubernetes-auf-dem-raspberry-pi-4-fuer-anfaenger-single-node-kubernetes-cluster-mit-k3s-erste-kubernetes-grundlagen\/","title":{"rendered":"Kubernetes auf dem Raspberry Pi 4 f\u00fcr Anf\u00e4nger: Single-Node Kubernetes Cluster mit K3s + Erste Kubernetes Grundlagen"},"content":{"rendered":"<p>Dieser Beitrag richtet sich an Einsteiger, die Kubernetes auf dem Raspberry Pi oder einem anderen Debian-System installieren m\u00f6chten. Wir werden uns die wichtigsten Grundlagen ansehen, ohne zu sehr ins Detail zu gehen. Am Ende der Einrichtung folgt die Installation (Deployment) eines einfachen Webservers auf dem soeben erstellten Cluster. Der Fokus ist auf dem Raspberry Pi 4, l\u00e4sst sich aber auf jedem Debian-System fast identisch umsetzen.<\/p>\n<h2 class=\"wp-block-heading\" id=\"voraussetzungen-fur-kubernetes\">Warum setzt man Kubernetes ein?<\/h2>\n<p><strong>Kubernetes <\/strong>ist eine quelloffene Plattform zur Bereitstellung und Verwaltung von Containern. Wer nur wenige einzelne Container einsetzt, dem reichen oft Docker und Docker-Compose aus. Doch wenn das ganze w\u00e4chst, entstehen damit neue Probleme: Wie kann man z.B. das Deployment automatisieren, Ausf\u00e4lle\/Fehler erkennen und darauf reagieren, skalieren oder Hochverf\u00fcgbarkeit erreichen? Um so etwas effizient umsetzen zu k\u00f6nnen, braucht es eine Abstraktionsschicht um die Container &#8222;herum&#8220;.<\/p>\n<p><strong>Docker Swarm<\/strong> wurde daf\u00fcr von der wohl bekanntesten Container-Laufzeitumgebung Docker entwickelt. Wie bei einem Schwarm soll man mehrere Server kombinieren k\u00f6nnen, um darauf Container zu starten. Seit Jahren zeichnet sich jedoch ab, dass sich mit Kubernetes stattdessen eine quelloffene Alternative von Google durchsetzt. Mittlerweile geh\u00f6rt Swarm auch nicht mehr zu Docker, sondern wurde verkauft.<\/p>\n<h2 class=\"wp-block-heading\" id=\"voraussetzungen-fur-kubernetes\">Was hat es mit K3s auf sich?<\/h2>\n<p>Man kann Kubernetes von Hand installieren. Daf\u00fcr wird aber ein tiefes Verst\u00e4ndnis der Kubernetes-Architektur ben\u00f6tigt. Durch die verschiedenen Komponenten ist es zudem aufw\u00e4ndig. Au\u00dfer zu Lernzwecken wird Kubernetes daher \u00fcblicherweise \u00fcber entsprechende Kubernetes-Distributionen installiert: Das automatisiert und vereinfacht die Einrichtung erheblich. Damit kein Chaos entsteht, gibt es die CNCF (Cloud Native Computing Fundation): Sie ist ein Projekt der Linux Foundation und zertifiziert Kubernetes-Distributionen, die sich an den &#8222;Standard&#8220; (Upstream-Kubernetes) halten. So kann man zwischen den Distributionen wechseln, ohne dass die Programme die darauf laufen angepasst werden m\u00fcssen.<\/p>\n<p>Auf dem Raspberry Pi OS w\u00fcrde ich K3s empfehlen: Rancher hat bei dieser leichtgewichtigen Distribution das originale Kubernetes aufger\u00e4umt und optimiert, sodass es in eine Binary mit knapp 100 MB passt. Zum Vergleich: Beim schwergewichtigeren Original sind es mehrere Gigabyte. K3s zielt damit auf schw\u00e4chere Ger\u00e4te wie u.a. den Raspberry Pi ab.<\/p>\n<p>Man kann es aber auch als effizientere Kubernetes-Distribution auf normaler x86 Hardware installieren und profitiert von einer geringeren Ressourcenbelastung sowie reduzierter Angriffsfl\u00e4che. Mittlerweile ist K3s auch keine Insell\u00f6sung mehr, sondern seit August 2020 CNCF zertifiziert &#8211; also eine standardisierte Kubernetes-Implementierung.<\/p>\n<h2 class=\"wp-block-heading\" id=\"voraussetzungen-fur-kubernetes\">Voraussetzungen f\u00fcr Kubernetes mit K3s<\/h2>\n<p>K3s hat <a href=\"https:\/\/rancher.com\/docs\/k3s\/latest\/en\/installation\/installation-requirements\/\" title=\"ein paar Anforderungen\" target=\"_blank\" rel=\"nofollow\">ein paar Anforderungen<\/a>, die je nach verwendetem Betriebssystem etwas variieren. Ich werde es am Raspberry Pi OS demonstrieren, man k\u00f6nnte aber auch Alpine oder CentOS nutzen.<\/p>\n<h3 class=\"wp-block-heading\" id=\"docker\">Hardware<\/h3>\n<p>Ich nutze im Folgenden einen Raspberry Pi 4 mit 4 GB Arbeitsspeicher. Kleinere Modelle sind eben so m\u00f6glich wie vorherigen Generationen. 512 MB Arbeitsspeicher sind jedoch das absolute Minimum. Da mit 512 MB kaum etwas f\u00fcr die Anwendungen selbst bleibt, die man auf Kubernetes betreiben m\u00f6chte, empfehle ich 1 GB aufw\u00e4rts &#8211; mehr ist tendenziell nat\u00fcrlich besser.<\/p>\n<h3 class=\"wp-block-heading\" id=\"docker\">Was ist mit Docker?<\/h3>\n<p>Fr\u00fcher war Docker eine Voraussetzung f\u00fcr Kubernetes. Mittlerweile <a href=\"https:\/\/kubernetes.io\/docs\/setup\/production-environment\/container-runtimes\/\" title=\"verabschiedet sich Kubernetes mit Version 1.23 von Docker\" target=\"_blank\" rel=\"nofollow\">ver<\/a><strong><a href=\"https:\/\/kubernetes.io\/docs\/setup\/production-environment\/container-runtimes\/\" title=\"verabschiedet sich Kubernetes mit Version 1.23 von Docker\" target=\"_blank\" rel=\"nofollow\">abschiedet sich Kubernetes mit Version 1.23 von Docker<\/a> &#8211; allerdings nur auf technischer Ebene. Auch hier gibt es Standards: Die Open Container Initiative (OCI) <\/strong>legt den Standard f\u00fcr Container und Images fest, den ihr vielleicht von Docker schon kennt. <strong>CRI (Container Runtime Interface)<\/strong> hei\u00dft die Schnittstelle zwischen Kubernetes und der Container-Laufzeitumgebung. Die wird von Docker nicht unterst\u00fctzt, daher gibt es mit Dockershim eine \u00dcbersetzungsschicht.<\/p>\n<p>Es gibt aber alternative Laufzeitumgebungen, die diese Standards ohne Zwischenschicht erf\u00fcllen. Beispielsweise <strong>Podman <\/strong>oder <strong>Containerd<\/strong>. K3s nutzt daher mittlerweile standardm\u00e4\u00dfig Containerd statt wie fr\u00fcher Docker. <a href=\"https:\/\/rancher.com\/docs\/k3s\/latest\/en\/advanced\/#using-docker-as-the-container-runtime\" title=\"Wer m\u00f6chte, kann zu Docker wechseln\" target=\"_blank\" rel=\"nofollow\">Wer m\u00f6chte, kann auf Wunsch zur\u00fcck Docker wechseln<\/a>. W\u00fcrde ich ohne guten Grund jedoch nicht empfehlen, da Docker wie gesagt ab Kubernetes 1.23 ohnehin nicht mehr unterst\u00fctzt wird.<\/p>\n<h3 class=\"wp-block-heading\" id=\"docker\">Iptables statt nftables<\/h3>\n<p>Das Raspberry Pi OS hat seine Standard-Firewall von <strong>iptable <\/strong>auf dessen Nachfolger <strong>nftables <\/strong>umgestellt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ update-alternatives --get-selections | grep iptables\niptables                       auto     \/usr\/sbin\/iptables-nft<\/code><\/pre>\n<p>Wenn <strong>iptables <\/strong>wie hier auf <strong>\/usr\/sbin\/iptables-nft<\/strong> zeigt, m\u00fcssen wir dies umstellen. Derzeit ist K3s nur mit iptables kompatibel. Anschlie\u00dfend sollte das System neu gestartet werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo iptables -F\nsudo update-alternatives --set iptables \/usr\/sbin\/iptables-legacy\n# Falls Ipv6 verwendet wird\nsudo update-alternatives --set ip6tables \/usr\/sbin\/ip6tables-legacy\n<\/code><\/pre>\n<h3 class=\"wp-block-heading\" id=\"control-groups-aktivieren\">&#8222;Control Groups&#8220; aktivieren<\/h3>\n<p>Kubernetes ben\u00f6tigt &#8222;Control Groups&#8220;, kurz <strong>cgroups<\/strong>. Diese Kontrollgruppen sind eine Kernelfunktionalit\u00e4t, um Ressourcen von Prozessen zu beschr\u00e4nken &#8211; etwa Prozessorauslastung oder Arbeitsspeicher. Da cgroups auf dem Raspberry Pi OS standardm\u00e4\u00dfig nicht aktiv sind, m\u00fcssen wir <strong>cgroup_memory=1 cgroup_enable=memory<\/strong> ans Ende der Datei <strong>\/boot\/cmdline.txt <\/strong>einf\u00fcgen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ cat \/boot\/cmdline.txt\nconsole=serial0,115200 console=tty1 root=PARTUUID=67be036d-02 rootfstype=ext4 fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory<\/code><\/pre>\n<p>Damit unsere beiden \u00c4nderungen wirksam werden, erfolgt mit <strong>sudo reboot<\/strong> ein Neustart.<\/p>\n<h2 class=\"wp-block-heading\" id=\"kubernetes-mit-k3s-installieren\">Kubernetes mit K3s installieren<\/h2>\n<p>Mittlerweile bietet K3s ein Installationsskript, womit die Installation stark vereinfacht wird. Wie immer empfehle ich, dies zun\u00e4chst herunterzuladen und einen Blick darauf zu werfen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">curl -sfL https:\/\/get.k3s.io -o k3s-install.sh<\/code><\/pre>\n<p>Das Skript unterst\u00fctzt <a href=\"https:\/\/rancher.com\/docs\/k3s\/latest\/en\/installation\/install-options\/\" title=\"mehrere Umgebungsvariablen zur Anpassung\" target=\"_blank\" rel=\"nofollow\">mehrere Umgebungsvariablen zur Anpassung<\/a>. F\u00fcr den Einstieg sind die voreingestellten Standardwerte in den meisten F\u00e4llen ausreichend, sodass man es ohne weitere Konfiguration starten kann:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">bash k3s-install.sh<\/code><\/pre>\n<p>Auf dem Raspberry Pi 4 dauert es keine Minute, bis die Installation abgeschlossen ist. Durch das Skript kann man k3s systemweit nutzen, k3s kubectl bietet Zugriff auf kubectl &#8211; das Standardwerkzeug, um Kubernetes-Cluster zu verwalten:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo k3s kubectl get nodes\nNAME   STATUS   ROLES                  AGE   VERSION\npi     Ready    control-plane,master   88m   v1.22.6+k3s1<\/code><\/pre>\n<p>Hier sehen wir unseren Pi mit beiden Rollen (Control Plane zur Verwaltung, Master f\u00fcr die Anwendungen) auf Kubernetes 1.22. <\/p>\n<p>F\u00fcr einen einfachen Cluster mit nur einem Node, der lokal genutzt wird, m\u00fcsst ihr daher nicht zwingend kubectl installieren. Ihr k\u00f6nnt es aber z.B. auf eurer Workstation installieren und direkt von dort auf euren K8s &#8222;Cluster&#8220; zugreifen. Dazu muss nur die Konfigurationsdatei <strong>\/etc\/rancher\/k3s\/k3s.yaml<\/strong> vom Pi in <strong>~\/.kube\/config<\/strong> kopiert werden, damit sich der Client verbinden kann.<\/p>\n<h2 class=\"wp-block-heading\" id=\"version-wechseln-bestimmte-version-installieren\">Version wechseln\/bestimmte Version installieren<\/h2>\n<p>Eine Liste aller derzeit unterst\u00fctzten Versionen mit End of Life Datum finden sich in der <a href=\"https:\/\/kubernetes.io\/releases\/\" target=\"_blank\" rel=\"nofollow\">Kubernetes-Dokumentation<\/a>. Wenn ihr eine bestimmte Kubernetes-Version m\u00f6chtet, m\u00fcsst ihr die k3s Version wechseln und k\u00f6nnt diese mit der Umgebungsvariable <strong>INSTALL_K3S_VERSION <\/strong>angeben. K3s benennt seine Versionen gleich wie Kubernetes, d.H. mit K3s <strong>v1.21.9+k3s1<\/strong> erhaltet ihr den Vorg\u00e4nger 1.21 statt 1.22. Eine \u00dcbersicht aller Versionen: <a href=\"https:\/\/github.com\/k3s-io\/k3s\/releases\" title=\"K3s Releases\" target=\"_blank\" rel=\"nofollow\">K3s Releases<\/a>.<\/p>\n<p>F\u00fcr einen Versionswechsel m\u00fcsst ihr zun\u00e4chst eine bestehende Installation von K3s deinstallieren (dauert keine 10 Sekunden). <strong>ACHTUNG: Alles was in eurem Cluster liegt, geht dadurch verloren<\/strong>! <strong>Unbedingt vorher sichern falls notwendig oder am besten zum Experimentieren ein eigenes Testger\u00e4t benutzen.<\/strong><\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo \/usr\/local\/bin\/k3s-uninstall.sh<\/code><\/pre>\n<p>Nun mit <strong>INSTALL_K3S_VERSION <\/strong>und der gew\u00fcnschten Version (neu) installieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">INSTALL_K3S_VERSION=v1.21.9+k3s1 bash k3s-install.sh<\/code><\/pre>\n<p>Und schon hat man in unter 3 Minuten einen neuen Kubernetes-Cluster auf dem Raspberry Pi 4, diesmal mit Version 1.21 statt 1.22:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo k3s kubectl get nodes\nNAME   STATUS   ROLES                  AGE   VERSION\npi     Ready    control-plane,master   27s   v1.21.9+k3s1<\/code><\/pre>\n<h2 class=\"wp-block-heading\" id=\"berechtigungen-korrigieren-k3s-ohne-root-ausfuhren\">Berechtigungen korrigieren: K3s ohne root ausf\u00fchren<\/h2>\n<p>In unseren ersten Tests haben wir <strong>k3s<\/strong> mit <strong>sudo<\/strong> als root aufgerufen. Das l\u00e4sst sich vermeiden, in dem wir den Eigent\u00fcmer der Cluster-Konfiguration auf unseren Benutzer (im Standard pi) korrigieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo chown pi:pi \/etc\/rancher\/k3s\/k3s.yaml\n$ k3s kubectl get no\nNAME   STATUS   ROLES                  AGE     VERSION\npi     Ready    control-plane,master   4m48s   v1.21.9+k3s1<\/code><\/pre>\n<h2 class=\"wp-block-heading\" id=\"hallo-welt-erste-kubernetes-objekte-erstellen\">&#8222;Hallo Welt&#8220;: Erste Kubernetes-Objekte erstellen<\/h2>\n<p>Du besitzt nun einen Kubernetes-Cluster. Zwar nur mit einem einzigen Node und daher streng genommen kein Cluster &#8211; aber v.a. f\u00fcr den Anfang reicht das v\u00f6llig aus, um die Grundlagen von Kubernetes zu erlernen oder Testumgebungen aufzubauen. <\/p>\n<p>Schauen wir uns f\u00fcr eine Demo das kleinste m\u00f6gliche Objekt an: Ein Pod. Er b\u00fcndelt einen oder mehrere Container, die gemeinsame Ressourcen (z.B. Speicher) nutzen k\u00f6nnen. Er ist daher die einfachste (aber nicht Einzige) M\u00f6glichkeit, einen Container auf Basis eines Images zu erzeugen. <\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">apiVersion: v1\nkind: Pod\nmetadata:\n  name: webserver\nspec:\n  containers:\n  - name: nginx\n    image: nginx:1.20\n    ports:\n    - containerPort: 80<\/code><\/pre>\n<p>Dazu legt man eine Yaml-Textdatei (z.B. <strong>nginx.yml<\/strong>) an. Dieses Yaml erzeugt einen Pod namens <strong>webserver<\/strong>, der einen Container startet: &#8222;nginx&#8220; mit dem &#8222;nginx:1.20&#8220; Image. Mit <strong>kubectl <\/strong>k\u00f6nnen wir das Objekt erstellen lassen. Falls ihr direkt auf dem Pi arbeitet, &#8222;k3s&#8220; davor setzen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ k3s kubectl apply -f nginx.yml\npod\/webserver created<\/code><\/pre>\n<p>Wie ihr seht, folgt auf <strong>kubectl <\/strong>immer ein Befehl, in diesem Beispiel <strong>apply<\/strong>. Der Status aller Pods l\u00e4sst sich mit get pods <strong>einsehen:<\/strong><\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ k3s kubectl get pod\nNAME        READY   STATUS              RESTARTS   AGE\nwebserver   0\/1     ContainerCreating   0          4s<\/code><\/pre>\n<p>Beim erstmaligen Deployen dauert das Erstellen (je nach Internetgeschwindigkeit) eine Zeit, da zun\u00e4chst das Image heruntergeladen werden muss. Anschlie\u00dfend sollten der Container auf &#8222;Running&#8220; stehen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ k3s kubectl get pod\nNAME        READY   STATUS    RESTARTS   AGE\nwebserver   1\/1     Running   0          31s<\/code><\/pre>\n<p>Kubernetes erzeugt ein virtuelles Netzwerk und weist dem Pod eine IP-Adresse zu. Mit dem Befehl <strong>describe pod<\/strong> werden alle Informationen zu der Ressource (hier dem Pod) angezeigt.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ k3s kubectl describe pod webserver\nName:         webserver\nNamespace:    default\nPriority:     0\nNode:         pi\/192.168.0.120\nStart Time:   Mon, 07 Feb 2022 19:42:47 +0100\nLabels:       &lt;none&gt;\nAnnotations:  &lt;none&gt;\nStatus:       Running\nIP:           10.42.0.10\nIPs:\n  IP:  10.42.0.10\n...<\/code><\/pre>\n<p>Die Restliche Ausgabe habe ich zur \u00dcbersicht abgeschnitten. Ich empfehle dir, zumindest sp\u00e4ter dennoch einen Blick darauf zu werfen &#8211; vor allem der untere &#8222;Events&#8220; Bereich kann zur Fehlersuche hilfreich sein. Aber bleiben wir bei der IP: <strong>10.42.0.10<\/strong> hat Kubernetes dem Webserver-Pod zugewiesen. \u00dcber curl k\u00f6nnen wir auf dem Pi dar\u00fcber unseren Nginx erreichen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ curl http:\/\/10.42.0.10\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;Welcome to nginx!&lt;\/title&gt;\n&lt;style&gt;\n    body {\n        width: 35em;\n        margin: 0 auto;\n        font-family: Tahoma, Verdana, Arial, sans-serif;\n    }\n&lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;h1&gt;Welcome to nginx!&lt;\/h1&gt;\n&lt;p&gt;If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.&lt;\/p&gt;\n\n&lt;p&gt;For online documentation and support please refer to\n&lt;a href=&quot;http:\/\/nginx.org\/&quot;&gt;nginx.org&lt;\/a&gt;.&lt;br\/&gt;\nCommercial support is available at\n&lt;a href=&quot;http:\/\/nginx.com\/&quot;&gt;nginx.com&lt;\/a&gt;.&lt;\/p&gt;\n\n&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;\/em&gt;&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>Der Zugriff erscheint im AccessLog des Nginx. Dieser wird in Containern standardm\u00e4\u00dfig auf die Standardausgabe (stdout) geschrieben. Mit dem kubectl Befehl &#8222;logs&#8220; k\u00f6nnen wir die Ausgabe einsehen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ k3s kubectl logs webserver\n\/docker-entrypoint.sh: \/docker-entrypoint.d\/ is not empty, will attempt to perform configuration\n\/docker-entrypoint.sh: Looking for shell scripts in \/docker-entrypoint.d\/\n\/docker-entrypoint.sh: Launching \/docker-entrypoint.d\/10-listen-on-ipv6-by-default.sh\n10-listen-on-ipv6-by-default.sh: info: Getting the checksum of \/etc\/nginx\/conf.d\/default.conf\n10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in \/etc\/nginx\/conf.d\/default.conf\n\/docker-entrypoint.sh: Launching \/docker-entrypoint.d\/20-envsubst-on-templates.sh\n\/docker-entrypoint.sh: Launching \/docker-entrypoint.d\/30-tune-worker-processes.sh\n\/docker-entrypoint.sh: Configuration complete; ready for start up\n2022\/02\/07 19:43:14 [notice] 1#1: using the &quot;epoll&quot; event method\n2022\/02\/07 19:43:14 [notice] 1#1: nginx\/1.20.2\n2022\/02\/07 19:43:14 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)\n2022\/02\/07 19:43:14 [notice] 1#1: OS: Linux 5.10.92-v8+\n2022\/02\/07 19:43:14 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n2022\/02\/07 19:43:14 [notice] 1#1: start worker processes\n2022\/02\/07 19:43:14 [notice] 1#1: start worker process 31\n2022\/02\/07 19:43:14 [notice] 1#1: start worker process 32\n2022\/02\/07 19:43:14 [notice] 1#1: start worker process 33\n2022\/02\/07 19:43:14 [notice] 1#1: start worker process 34\n10.42.0.1 - - [07\/Feb\/2022:19:56:41 +0000] &quot;GET \/ HTTP\/1.1&quot; 200 612 &quot;-&quot; &quot;curl\/7.74.0&quot; &quot;-&quot;<\/code><\/pre>\n<p>Die letzte Zeile stammt von unserem <em>curl <\/em>Testaufruf.<\/p>\n<h2 class=\"wp-block-heading\" id=\"wie-geht-es-weiter\">Wie geht es weiter?<\/h2>\n<p>Der <em>curl <\/em>Aufruf funktioniert nur auf dem Kubernetes-Node selbst &#8211; nicht au\u00dferhalb, etwa vom eigenen PC. Dies l\u00e4sst sich mithilfe eines Ingress \u00e4ndern. Um den Webserver mit eigenen Inhalten zu f\u00fcllen, kann man Volumes oder Init-Container einsetzen. Das sind nur Beispiele, wie man sich an kleinen, praktischen F\u00e4llen in die restlichen Kubernetes-Objekte einarbeiten kann. Sich damit zu besch\u00e4ftigen w\u00e4re f\u00fcr Anf\u00e4nger der n\u00e4chste Schritt.<\/p>\n<p>Anschlie\u00dfend macht es Sinn, den Einstieg in &#8222;echte&#8220; Cluster zu starten. Das hei\u00dft: Mehrere Nodes (z.B. Raspberry Pis, oder aber x86 VMs bzw. Server) und die damit entstehenden neuen Szenarien, wie beispielsweise Lastverteilung oder Hochverf\u00fcgbarkeit.<\/p>\n<p>Beides w\u00fcrde an dieser Stelle aber den Rahmen sprengen. Kubernetes hat im Vergleich zu Docker eine h\u00f6here Komplexit\u00e4t, an die ich mich langsam heran tasten w\u00fcrde &#8211; sonst wird man schnell \u00fcberfahren und frustriert. Falls ihr euch f\u00fcr weitere Beitr\u00e4ge rund um Kubernetes interessiert, schreibt es gerne ins Forum.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Beitrag richtet sich an Einsteiger, die Kubernetes auf dem Raspberry Pi oder einem anderen Debian-System installieren m\u00f6chten. Wir werden uns die wichtigsten Grundlagen ansehen, ohne zu sehr ins Detail zu gehen. Am Ende der Einrichtung folgt die Installation (Deployment) eines einfachen Webservers auf dem soeben erstellten Cluster. Der Fokus ist auf dem Raspberry Pi &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8490,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[1022,719],"class_list":["post-8439","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-k3s","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8439"}],"version-history":[{"count":10,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8439\/revisions"}],"predecessor-version":[{"id":9779,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8439\/revisions\/9779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8490"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}