Zum Inhalt springen

Modul 15 von 16 · 📖 8 min Lesezeit · ⏱ 30 min gesamt

FI-AE 15 DevOps — CI-CD-Pipelines und Container

Inhaltsverzeichnis (7 Abschnitte)
  1. Konzepte und Hintergrund
  2. Architektur-Diagramm
  3. Praktische Schritte
  4. Häufige Fallstricke
  5. Weiterführende Ressourcen
  6. Worked Example: Automatisierte Bereitstellung einer Node.js-Anwendung via Docker und Kubernetes
  7. Wissens-Check

FI-AE 15 DevOps — CI/CD-Pipelines und Container

In diesem Modul erlernen Sie die Grundlagen der modernen Softwarebereitstellung durch CI/CD-Pipelines und Containerisierung. Sie verstehen, wie automatisierte Build-, Test- und Deploy-Prozesse die Entwicklung beschleunigen und stabilisieren. Zudem erwerben Sie praktische Kenntnisse in Docker und Kubernetes, um Anwendungen skalierbar und portabel zu betreiben.

Konzepte und Hintergrund

CI/CD-Pipeline
Ein automatisierter Prozess, der Codeänderungen durch Build-, Test- und Deploy-Schritte führt, um kontinuierliche Integration und Bereitstellung zu gewährleisten.
Docker
Eine Plattform zur Containerisierung von Anwendungen, die Abhängigkeiten bündelt und eine konsistente Umgebung über verschiedene Systeme hinweg sicherstellt.
Kubernetes
Ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen.
Pod
Die kleinste deploybare Einheit in Kubernetes, die eine oder mehrere Container mit gemeinsamem Netzwerk und Speicher umfasst.
Deployment
Ein Kubernetes-Objekt, das deklariert, wie eine Anwendung ausgeführt werden soll, und für die Verwaltung von ReplicaSets verantwortlich ist.

Architektur-Diagramm

flowchart LR
  A[Entwickler] --> B[Git-Repository]
  B --> C[CI/CD-Server]
  C --> D[Docker-Registry]
  D --> E[Kubernetes-Cluster]
  E --> F[Produktivumgebung]
  C --> G[Testumgebung]

Praktische Schritte

  1. Installieren Sie Docker auf Ihrem System mit dem Befehl
    sudo apt install docker.io
    , um Container zu erstellen und zu verwalten.
  2. Erstellen Sie ein Dockerfile mit einer Basis-Image-Anweisung wie
    FROM ubuntu:20.04
    , um Ihre Anwendungsumgebung zu definieren.
  3. Bauen Sie Ihr Docker-Image mit
    docker build -t meine-app:latest .
    , um Ihre Anwendung in ein Container-Image zu kompilieren.
  4. Pushen Sie das Image in eine Registry mit
    docker push meine-app:latest
    , damit es im Cluster verfügbar ist.
  5. Erstellen Sie ein Kubernetes-Deployment-Manifest mit
    kubectl apply -f deployment.yaml
    , um Ihre Anwendung im Cluster bereitzustellen.
  6. Erstellen Sie einen Service mit
    kubectl expose deployment meine-app --port 80
    , um den Zugriff auf Ihre Anwendung zu ermöglichen.
  7. Implementieren Sie eine CI/CD-Pipeline mit Jenkins oder GitLab CI, um Builds und Deploys zu automatisieren.
  8. Konfigurieren Sie einen Health-Check in Ihrem Deployment, um die Verfügbarkeit Ihrer Anwendung sicherzustellen.

Häufige Fallstricke

Weiterführende Ressourcen

Worked Example: Automatisierte Bereitstellung einer Node.js-Anwendung via Docker und Kubernetes

SITUATION: Als Junior-DevOps-Ingenieur bei der „TechStart GmbH“ erhalten Sie die Aufgabe, die manuelle Bereitstellung der Webanwendung „ShopFront“ zu automatisieren. Bisher wurde der Code manuell auf den Server kopiert, was zu Inkonsistenzen zwischen Entwicklungs- und Produktivumgebung führte. Ziel ist es, ein reproduzierbares Docker-Image zu erstellen und dieses über ein Kubernetes-Deployment in der Testumgebung bereitzustellen.

DURCHFÜHRUNG: Wir gehen davon aus, dass der Node.js-Code bereits in einem Git-Repository liegt. Der folgende Walkthrough demonstriert die lokale Erstellung des Images und die anschließende Konfiguration in Kubernetes.

Zunächst erstellen wir das Dockerfile, das die Bauanleitung für das Image definiert. Wir nutzen ein schlankes Basis-Image, um die Sicherheitsfläche zu minimieren.

# Dockerfile
FROM node:18-alpine

# Arbeitsverzeichnis im Container setzen
WORKDIR /app

# Abhängigkeiten kopieren und installieren
COPY package*.json ./
RUN npm ci --only=production

# Quellcode kopieren
COPY . .

# Exponierten Port definieren
EXPOSE 3000

# Startbefehl für die Anwendung
CMD [ "node", "server.js" ]

Nachdem das Dockerfile erstellt ist, bauen wir das Image lokal. Der Befehl -t taggt das Image mit einem Namen und einer Version, was für die spätere Identifikation in der Registry entscheidend ist.

docker build -t shopfront:v1.0 .

Um sicherzustellen, dass das Image korrekt funktioniert, starten wir es lokal in einer isolierten Umgebung. Dies simuliert die spätere Ausführung im Cluster.

docker run -d --name shopfront-test -p 3000:3000 shopfront:v1.0

Im nächsten Schritt erstellen wir das Kubernetes-Manifest deployment.yaml. Dieses deklariert den gewünschten Zustand des Clusters. Wir definieren hier drei Repliken, um Verfügbarkeit zu gewährleisten, und verweisen auf das zuvor erstellte Image.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: shopfront-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: shopfront
  template:
    metadata:
      labels:
        app: shopfront
    spec:
      containers:
      - name: shopfront
        image: shopfront:v1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"

Wir wenden dieses Manifest auf den Kubernetes-Cluster an. Der apply-Befehl sorgt dafür, dass der Cluster den aktuellen Zustand mit dem gewünschten Zustand abgleicht und ggf. Änderungen durchführt.

kubectl apply -f deployment.yaml

Schließlich erstellen wir einen Service, um den Traffic von außen auf die Pods zu leiten. Ohne diesen Schritt wäre die Anwendung im Cluster isoliert und nicht von außen erreichbar.

kubectl expose deployment shopfront-deployment --type=LoadBalancer --port=80 --target-port=3000

ERGEBNIS: Nach Ausführung der Schritte ist die Anwendung „ShopFront“ hochverfügbar im Cluster verteilt. Die Ausgabe von kubectl get pods zeigt drei laufende Pods im Status Running. Der LoadBalancer-Service hat eine externe IP-Adresse erhalten, über die die Anwendung im Browser erreichbar ist. Bei einem Ausfall eines Pods übernimmt Kubernetes automatisch die Neustartlogik, um die gewünschte Replika-Anzahl von drei wiederherzustellen.

REFLEXION: Sie haben verstanden, wie Containerisierung die Portabilität gewährleistet: Das gleiche Image, das lokal getestet wurde, läuft identisch im Cluster. Eine typische Falle war das Vergessen der resources-Limits im Deployment; ohne diese könnte ein einzelner Pod den gesamten Node im Cluster mit Speicher überlasten und andere Anwendungen abstürzen lassen. Durch die Definition von Requests und Limits wird die Stabilität des gesamten Clusters gesichert.

Wissens-Check

Vier Fragen zur Selbstkontrolle. Klicken Sie jede Frage an, um die richtige Antwort und Erklärung zu sehen.

Was ist der Hauptvorteil einer CI/CD-Pipeline in der Softwareentwicklung?
  • A) Reduzierung der Anzahl der Entwickler im Team
  • B) Automatisierung von Build-, Test- und Deploy-Prozessen
  • C) Erhöhung der Komplexität des Codes
  • D) Verringerung der Dokumentationspflicht

Richtige Antwort: B. CI/CD-Pipelines automatisieren Build-, Test- und Deploy-Prozesse, was die Entwicklung beschleunigt und stabilisiert. Option A ist falsch, da die Anzahl der Entwickler nicht reduziert wird. Option C ist falsch, da die Komplexität des Codes nicht erhöht wird. Option D ist falsch, da die Dokumentationspflicht nicht verringert wird.

Was ist ein Pod in Kubernetes?
  • A) Ein Container-Orchestrierungssystem
  • B) Die kleinste deploybare Einheit in Kubernetes
  • C) Ein Speicherobjekt für persistente Daten
  • D) Ein Netzwerk-Plugin für Kubernetes

Richtige Antwort: B. Ein Pod ist die kleinste deploybare Einheit in Kubernetes, die eine oder mehrere Container mit gemeinsamem Netzwerk und Speicher umfasst. Option A ist falsch, da Kubernetes das Container-Orchestrierungssystem ist. Option C ist falsch, da für persistente Daten andere Objekte wie PersistentVolume verwendet werden. Option D ist falsch, da Netzwerk-Plugins durch andere Komponenten bereitgestellt werden.

Welcher Befehl erstellt ein Docker-Image aus einem Dockerfile?
  • A) docker create -t meine-app:latest
  • B) docker run -t meine-app:latest
  • C) docker build -t meine-app:latest
  • D) docker deploy -t meine-app:latest

Richtige Antwort: C. Der Befehl 'docker build -t meine-app:latest' erstellt ein Docker-Image aus einem Dockerfile. Option A ist falsch, da 'docker create' einen Container erstellt, kein Image. Option B ist falsch, da 'docker run' einen Container startet, kein Image erstellt. Option D ist falsch, da 'docker deploy' kein gültiger Docker-Befehl ist.

Was ist die Hauptaufgabe von Kubernetes?
  • A) Code-Versionierung und -Management
  • B) Containerisierung von Anwendungen
  • C) Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen
  • D) Erstellung von Docker-Images

Richtige Antwort: C. Kubernetes ist ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen. Option A ist falsch, da Code-Versionierung und -Management durch Tools wie Git erfolgt. Option B ist falsch, da die Containerisierung durch Docker erfolgt. Option D ist falsch, da die Erstellung von Docker-Images durch Docker erfolgt.