From Zero to CKAD: Deployment

From Zero to CKAD … Deployment

Avatar von Lars Iffland

In dieser Blogserie wollen wir unseren Weg von Grundauf bis zum CKAD aufzeigen und möglichst viel aus dem
Material zur Vorbereitung zum CKAD anhand eines praktischen Beispiels erklären. Das Repository zum Mitmachen findet ihr auf GitHub; die fertigen yamls für das Deployment findet ihr im Branch deployment.

Was ist ein Deployment?

Deployments sind eine Ressource zur Verwaltung von Pods. Mit Deployments können wir Pods anpassen und im
laufenden Betrieb aktualisieren und bei Problemen wieder zurückrollen, ohne Ausfallzeiten zu haben.

Das klingt doch gut, dann auf zum ersten Deployment. Wir lassen uns wieder eine yaml, die ein Deployment
beschreibt, generieren. Mit k create deployment frontend --image=nginx --dry-run=client -o yaml > deploy.yaml wird das ganze wieder in die deploy.yaml geschrieben. Und zur besseren Übersicht werfen wir die Zeilen raus, die wir nicht brauchen.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: frontend
  name: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - image: frontend
        name: frontend

Ähnlichkeiten zu Pods?

Sieht ja fast aus wie die yaml für Pods. Generell gilt auch für die meisten yamls in Kubernetes, dass sie die
folgenden Keys haben:

  • apiVersion
  • kind
  • metadata
  • spec

In der Metadata verstecken sich die Labels für das Deployment. Labels sind ein Key-Value-Paar um Deployments,
Pods und Services zu gruppieren und danach filtern zu können. Unter der Metadata lässt sich auch der Name des
Deployments finden.

Die specs

Kommen wir nun zum spannenden Teil, den specs. Gleich das erste was uns auffällt sind die replicas. Sie zeigen an, wieviele Pods in dem Deployment gewünscht sind.

Der Selector hat die matchLabels, die wieder ein Key-Value-Paar halten. Das Deployment überwacht also alle
Pods mit dem Label-Paar app: frontend. Ändert sich also ein Pod mit diesem Paar, sei es von der Konfiguration oder sollte er sterben, fährt das Deployment wieder genügend Pods hoch und runter, bis der „desired state“, den wir in den replicas definiert haben, wieder erreicht ist.

Bei einem Update der Pods werden also nacheinander ein Pod mit der neuen Konfiguration gestartet und bei Erfolg ein alter Pod herunter gefahren, bis alle Pods den neuen Zustand erreicht haben.

Das Template beschreibt die Pods die wir in dem Deployment verwenden. Sie haben wieder die labels app: frontend, damit das Deployment sie finden kann. in der spec werden die Container, die in den Pods laufen, beschrieben.


Also passen wir diesen für unsere Applikation an.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - image: frontend:latest
        imagePullPolicy: Never
        name: frontend
        ports:
        - name: http
          containerPort: 8090
          protocol: TCP

Die containers im Deployment sind das gleiche wie in der pod.yaml, die wir im Kapitel der Pods angelegt
haben.

Pod-Containers in Deploy

Überprüfen wir nun, ob das Deployment erfolgreich war. Mit kubectl get deploy wird uns das Deployment
angezeigt.

Get Deploy

Wir können sehen, dass jeweils für Frontend und Backend ein Pod läuft.

Mehr. Pods.

Brauchen wir mehr Pods, weil z. B. viele Requests das Backend ans Limit bringen, können wir die replicas erhöhen. Dann werden neue Pods hochgefahren, bis der gewünschte State erreicht ist.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: backend
  name:  backend 
spec:
  replicas: 5
  selector:
    matchLabels:
      app: backend 
  template:
    metadata:
      labels:
        app: backend 
    spec:
      containers:
      - image: backend:latest
        imagePullPolicy: Never
        name: backend
        ports:
        - name: http
          containerPort: 8089
          protocol: TCP

Alternativ kann man auch mit kubectl scale deployment backend --replicas=5 die Anzahl der Replicas ändern.

Der Fehlerfall

Wenn wir nun das Image ändern, z.B. zu busybox, werden die Pods nicht hochfahren können. Da Kubernetes die
Updates der Pods inkrementell macht, ist das, wie wir hier sehen, nicht weiter schlimm.

Kaputtes Image ist kaputt.

Es wird zwar versucht, 3 Pods hochzufahren, doch erst wenn diese in den Ready State kommen, werden die alten
heruntergefahren. Um diesen Fehler schnell wieder auszubügeln, kann man mit kubectl rollout undo deployment backend auf den vorherigen Stand zurück rollen. Falls man zu einer bestimmten Version zurück möchte, kann man sich mit kubectl rollout history deployment backend die Deployment-History anzeigen lassen, um dann mit kubectl rollout undo deployment backend --to-revision=2 das gewünschte Deployment anzuwenden.

Und nun?

Um die Applikation über den Browser via localhost zu erreichen, müssen wir aber wieder einen Port-Forward machen. Helfen uns da vielleicht die Services weiter?

Möglicherweise. Das werden wir aber erst im nächsten Teil der Serie erfahren.

In eigener Sache …

Mit WebAssembly die Kosten für die Wartung Deiner Cloud-Anwendung sparen und die Wirtschaftlichkeit und Effizienz des Unternehmens steigern?

Am 26. September 2024 um 11:30 Uhr bieten Dir unsere Experten einen tiefen Einblick in ein spannendes R&D-Projekt.

Melde Dich jetzt kostenlos an!

Avatar von Lars Iffland

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.