<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://xinux.net/index.php?action=history&amp;feed=atom&amp;title=Kubernetes_Ingress_Updates_Skalierung</id>
	<title>Kubernetes Ingress Updates Skalierung - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://xinux.net/index.php?action=history&amp;feed=atom&amp;title=Kubernetes_Ingress_Updates_Skalierung"/>
	<link rel="alternate" type="text/html" href="https://xinux.net/index.php?title=Kubernetes_Ingress_Updates_Skalierung&amp;action=history"/>
	<updated>2026-08-24T00:20:14Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://xinux.net/index.php?title=Kubernetes_Ingress_Updates_Skalierung&amp;diff=72555&amp;oldid=prev</id>
		<title>Thomas.will: Die Seite wurde neu angelegt: „Dieser Artikel baut auf dem vorherigen Deployment aus Compose-App nach Kubernetes übersetzen auf und ergänzt das, was…“</title>
		<link rel="alternate" type="text/html" href="https://xinux.net/index.php?title=Kubernetes_Ingress_Updates_Skalierung&amp;diff=72555&amp;oldid=prev"/>
		<updated>2026-08-09T08:11:40Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „Dieser Artikel baut auf dem vorherigen Deployment aus &lt;a href=&quot;/index.php?title=Kubernetes-Compose-App-Uebersetzen&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kubernetes-Compose-App-Uebersetzen (Seite nicht vorhanden)&quot;&gt;Compose-App nach Kubernetes übersetzen&lt;/a&gt; auf und ergänzt das, was…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Dieser Artikel baut auf dem vorherigen Deployment aus [[Kubernetes-Compose-App-Uebersetzen|Compose-App nach Kubernetes übersetzen]] auf und ergänzt das, was mit Docker Compose gar nicht möglich war: externer Zugriff über Ingress, kontrollierte Updates ohne Downtime, Skalierung und persistente Daten.&lt;br /&gt;
&lt;br /&gt;
==Externer Zugriff mit Ingress==&lt;br /&gt;
&lt;br /&gt;
Port-Forwarding aus dem vorherigen Artikel funktioniert nur temporär und nur für eine Person gleichzeitig. Für dauerhaften externen Zugriff wird ein '''Ingress''' verwendet.&lt;br /&gt;
&lt;br /&gt;
; Was ein Ingress macht&lt;br /&gt;
* Ein Ingress ist ein Regelwerk, das eingehenden HTTP(S)-Traffic anhand von Hostname oder Pfad an den passenden internen Service weiterleitet – vergleichbar mit einem Reverse Proxy wie Traefik oder Nginx, den man aus der Compose-Welt kennt.&lt;br /&gt;
&lt;br /&gt;
; Ingress-Controller bei k3s&lt;br /&gt;
* k3s bringt Traefik als Ingress-Controller bereits vorinstalliert mit. Es muss nichts zusätzlich installiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: networking.k8s.io/v1&lt;br /&gt;
kind: Ingress&lt;br /&gt;
metadata:&lt;br /&gt;
  name: web-ingress&lt;br /&gt;
spec:&lt;br /&gt;
  rules:&lt;br /&gt;
    - host: web.lab.local&lt;br /&gt;
      http:&lt;br /&gt;
        paths:&lt;br /&gt;
          - path: /&lt;br /&gt;
            pathType: Prefix&lt;br /&gt;
            backend:&lt;br /&gt;
              service:&lt;br /&gt;
                name: web&lt;br /&gt;
                port:&lt;br /&gt;
                  number: 80&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Anwenden&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl apply -f web-ingress.yaml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Hostnamen lokal auflösen&lt;br /&gt;
* Da &amp;lt;code&amp;gt;web.lab.local&amp;lt;/code&amp;gt; keine echte Domain ist, muss der Hostname auf dem Client in &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; eingetragen werden, zeigend auf die IP-Adresse von &amp;lt;code&amp;gt;k8s-server&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;echo &amp;quot;&amp;amp;lt;SERVER_IP&amp;amp;gt; web.lab.local&amp;quot; | sudo tee -a /etc/hosts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Zugriff testen&lt;br /&gt;
* &amp;lt;code&amp;gt;curl http://web.lab.local&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Health-Checks: Probes==&lt;br /&gt;
&lt;br /&gt;
Im vorherigen Artikel wurde festgestellt, dass es kein Äquivalent zu &amp;lt;code&amp;gt;depends_on&amp;lt;/code&amp;gt; gibt. Die Kubernetes-Antwort darauf sind '''Probes''' – fortlaufende Prüfungen, ob ein Container tatsächlich funktioniert.&lt;br /&gt;
&lt;br /&gt;
; Liveness Probe&lt;br /&gt;
* Prüft, ob der Container noch lebt. Schlägt sie fehl, wird der Container neu gestartet.&lt;br /&gt;
&lt;br /&gt;
; Readiness Probe&lt;br /&gt;
* Prüft, ob der Container bereit ist, Traffic zu empfangen. Schlägt sie fehl, wird der Pod aus dem Service entfernt, aber '''nicht''' neu gestartet – er bekommt einfach so lange keinen Traffic, bis die Probe wieder erfolgreich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
containers:&lt;br /&gt;
  - name: web&lt;br /&gt;
    image: nginx:1.25&lt;br /&gt;
    ports:&lt;br /&gt;
      - containerPort: 80&lt;br /&gt;
    readinessProbe:&lt;br /&gt;
      httpGet:&lt;br /&gt;
        path: /&lt;br /&gt;
        port: 80&lt;br /&gt;
      initialDelaySeconds: 5&lt;br /&gt;
      periodSeconds: 10&lt;br /&gt;
    livenessProbe:&lt;br /&gt;
      httpGet:&lt;br /&gt;
        path: /&lt;br /&gt;
        port: 80&lt;br /&gt;
      initialDelaySeconds: 15&lt;br /&gt;
      periodSeconds: 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Warum das die depends_on-Lücke schließt&lt;br /&gt;
* Ein Service leitet Traffic nur an Pods weiter, deren Readiness Probe erfolgreich ist. Damit landet Traffic nie bei einer Instanz, die noch nicht bereit ist – unabhängig von der Startreihenfolge.&lt;br /&gt;
&lt;br /&gt;
==Rolling Updates==&lt;br /&gt;
&lt;br /&gt;
; Was bei einem Compose-Update passiert&lt;br /&gt;
* &amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt; nach einem Image-Wechsel ersetzt Container ohne eingebaute Kontrolle darüber, wie viele gleichzeitig offline sind.&lt;br /&gt;
&lt;br /&gt;
; Was ein Deployment stattdessen tut&lt;br /&gt;
* Standardmäßig verwendet ein Deployment die Update-Strategie &amp;lt;code&amp;gt;RollingUpdate&amp;lt;/code&amp;gt;: Es werden schrittweise neue Pods mit dem neuen Image gestartet und alte erst entfernt, wenn genügend neue bereit sind (erkennbar über die Readiness Probe).&lt;br /&gt;
&lt;br /&gt;
; Image aktualisieren&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl set image deployment/web web=nginx:1.26&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rollout beobachten&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl rollout status deployment/web&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rollout-Historie ansehen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl rollout history deployment/web&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Bei Problemen zurückrollen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl rollout undo deployment/web&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skalierung==&lt;br /&gt;
&lt;br /&gt;
; Deployment skalieren&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl scale deployment/web --replicas=3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Verteilung über die Nodes prüfen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl get pods -o wide&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die drei Instanzen verteilen sich in der Regel automatisch über die verfügbaren Agent-Nodes.&lt;br /&gt;
&lt;br /&gt;
; Warum die Datenbank nicht einfach genauso skaliert wird&lt;br /&gt;
* Würde &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; ebenfalls auf drei Replicas skaliert, entstünden drei unabhängige PostgreSQL-Instanzen ohne gemeinsamen Datenbestand – das produziert Dateninkonsistenz, keine Hochverfügbarkeit. Zustandsbehaftete Anwendungen wie Datenbanken benötigen einen anderen Ansatz (&amp;lt;code&amp;gt;StatefulSet&amp;lt;/code&amp;gt;), der über den Rahmen dieses Kurses hinausgeht, aber als Begriff hier bewusst fällt.&lt;br /&gt;
&lt;br /&gt;
==Persistente Daten: PersistentVolumeClaim==&lt;br /&gt;
&lt;br /&gt;
In der ursprünglichen Compose-Datei sorgte &amp;lt;code&amp;gt;volumes: db_data:/var/lib/postgresql/data&amp;lt;/code&amp;gt; dafür, dass die Datenbank einen Container-Neustart übersteht. Das Kubernetes-Äquivalent ist ein '''PersistentVolumeClaim''' (PVC).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: PersistentVolumeClaim&lt;br /&gt;
metadata:&lt;br /&gt;
  name: db-data&lt;br /&gt;
spec:&lt;br /&gt;
  accessModes:&lt;br /&gt;
    - ReadWriteOnce&lt;br /&gt;
  resources:&lt;br /&gt;
    requests:&lt;br /&gt;
      storage: 1Gi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Im db-Deployment einbinden&lt;br /&gt;
* Der Claim wird als Volume in den Pod eingehängt und im Container an den passenden Pfad gemountet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
    - name: db&lt;br /&gt;
      image: postgres:16&lt;br /&gt;
      volumeMounts:&lt;br /&gt;
        - name: data&lt;br /&gt;
          mountPath: /var/lib/postgresql/data&lt;br /&gt;
  volumes:&lt;br /&gt;
    - name: data&lt;br /&gt;
      persistentVolumeClaim:&lt;br /&gt;
        claimName: db-data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Anwenden und prüfen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl apply -f db-pvc.yaml&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl get pvc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Übung: Rolling Update ohne Downtime beobachten==&lt;br /&gt;
&lt;br /&gt;
# Skaliert &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; zunächst auf 3 Replicas.&lt;br /&gt;
# Öffnet ein zweites Terminal und lasst dort fortlaufend Anfragen laufen, zum Beispiel mit &amp;lt;code&amp;gt;watch curl -s http://web.lab.local&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Startet im ersten Terminal ein Rolling Update auf ein anderes Image (&amp;lt;code&amp;gt;nginx:1.26&amp;lt;/code&amp;gt;) und beobachtet parallel im zweiten Terminal, ob Anfragen fehlschlagen.&lt;br /&gt;
# Prüft mit &amp;lt;code&amp;gt;kubectl rollout status deployment/web&amp;lt;/code&amp;gt;, wann der Rollout abgeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
==Übung: Rollback im Fehlerfall==&lt;br /&gt;
&lt;br /&gt;
# Führt absichtlich ein Update auf ein nicht existierendes Image durch (&amp;lt;code&amp;gt;nginx:kaputt&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Beobachtet mit &amp;lt;code&amp;gt;kubectl rollout status deployment/web&amp;lt;/code&amp;gt;, dass der Rollout hängen bleibt.&lt;br /&gt;
# Macht das Update mit &amp;lt;code&amp;gt;kubectl rollout undo deployment/web&amp;lt;/code&amp;gt; rückgängig und bestätigt mit &amp;lt;code&amp;gt;kubectl get pods&amp;lt;/code&amp;gt;, dass wieder die alte, funktionierende Version läuft.&lt;br /&gt;
&lt;br /&gt;
==Übung: Persistenz der Datenbank prüfen==&lt;br /&gt;
&lt;br /&gt;
# Bindet den PVC wie oben gezeigt ins &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt;-Deployment ein und wendet die Änderung an.&lt;br /&gt;
# Legt über &amp;lt;code&amp;gt;kubectl exec -it&amp;lt;/code&amp;gt; in den &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt;-Pod eine Testtabelle oder einen Testeintrag in der Datenbank an.&lt;br /&gt;
# Löscht den &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt;-Pod gezielt mit &amp;lt;code&amp;gt;kubectl delete pod&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Prüft nach dem automatischen Neustart, ob der zuvor angelegte Datenbestand noch vorhanden ist.&lt;/div&gt;</summary>
		<author><name>Thomas.will</name></author>
	</entry>
</feed>