Zum Inhalt

App Deployment

Ziel

In diesem Projekt geht es um das Deployment einer vollständigen Anwendung mit Datenbank in Kubernetes. Sie werden:

  • Einen separaten Namespace für die Anwendung erstellen
  • Eine Demo-Anwendung als Deployment bereitstellen
  • Services für interne und externe Kommunikation konfigurieren
  • Eine MariaDB-Datenbank als Backend einrichten
  • Die Anwendung mit der Datenbank verbinden
  • Die fertige Anwendung im Browser testen

Vorbereitung

  • Erstellen Sie ein Arbeitsverzeichnis und wechseln Sie hinein

    cd ~/workspace
    mkdir app-deployment
    cd app-deployment
    

Aufgabe 1: Namespace erstellen

Namespace-Manifest erstellen

  • Erstellen Sie eine namespace.yaml Datei für einen neuen Namespace namens docker-demoapp
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Namespace
metadata:
  name: docker-demoapp

Namespace bereitstellen

  • Wenden Sie das Namespace-Manifest an
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f namespace.yaml
  • Überprüfen Sie, ob der Namespace erfolgreich erstellt wurde
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get namespaces

Aufgabe 2: Anwendung deployen

Deployment-Manifest erstellen

  • Erstellen Sie eine app.yaml Datei mit einem Deployment für die docker-demoapp
  • Verwenden Sie das Image docker.io/corewire/docker-demoapp:1.1.1
  • Die Anwendung läuft auf Port 5000
  • Setzen Sie die Umgebungsvariable DOCKERDEMO_NOTES_DIR auf /data/notes
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-demoapp
  namespace: docker-demoapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-demoapp
  template:
    metadata:
      labels:
        app: docker-demoapp
    spec:
      containers:
      - name: docker-demoapp
        image: docker.io/corewire/docker-demoapp:1.1.1
        ports:
        - containerPort: 5000
        env:
          - name: DOCKERDEMO_NOTES_DIR
            value: "/data/notes"

Deployment bereitstellen

  • Wenden Sie das Deployment-Manifest an
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f app.yaml
  • Überprüfen Sie, ob der Pod läuft
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pods -n docker-demoapp

Port-Forwarding testen

  • Finden Sie den Namen des Pods heraus
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pods -n docker-demoapp
  • Stellen Sie eine Port-Weiterleitung zum Pod her
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl port-forward -n docker-demoapp <POD_NAME> 5000:5000
  • Testen Sie die Anwendung im Browser

Aufgabe 3: Service erstellen

Service-Manifest hinzufügen

  • Erweitern Sie die app.yaml Datei um einen Service vom Typ NodePort
  • Der Service soll auf Port 5000 lauschen und Anfragen an Port 5000 der Pods weiterleiten
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

Fügen Sie folgenden Block an das Ende der app.yaml Datei hinzu:

---
apiVersion: v1
kind: Service
metadata:
  name: docker-demoapp
  namespace: docker-demoapp
spec:
  selector:
    app: docker-demoapp
  ports:
  - port: 5000
    targetPort: 5000
  type: NodePort

Service bereitstellen

  • Wenden Sie das erweiterte Manifest an
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f app.yaml
  • Überprüfen Sie, ob der Service erstellt wurde
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get services -n docker-demoapp

Externe Erreichbarkeit testen

  • Finden Sie die IP-Adresse der Nodes heraus
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get nodes -o wide
  • Notieren Sie sich den NodePort des Services und testen Sie die Anwendung über http://<NODE_IP>:<NODE_PORT>

Aufgabe 4: Datenbank bereitstellen

Datenbank-Manifest erstellen

  • Erstellen Sie eine db.yaml Datei mit einem MariaDB-Deployment
  • Verwenden Sie das Image mariadb
  • Konfigurieren Sie folgende Umgebungsvariablen:
  • MYSQL_USER: example-user
  • MYSQL_PASSWORD: OGI0YzE2NDU5NTE3MzhmZTI1ZWYxMTY1
  • MYSQL_ROOT_PASSWORD: MjcyYjYzOWFkODJhMGQ3ZWRkNWIyY2Yy
  • Erstellen Sie zusätzlich einen Service für die Datenbank
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: database
  namespace: docker-demoapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: database
  template:
    metadata:
      labels:
        app: database
    spec:
      containers:
      - name: database
        image: mariadb
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_USER
          value: "example-user"
        - name: MYSQL_PASSWORD
          value: "OGI0YzE2NDU5NTE3MzhmZTI1ZWYxMTY1"
        - name: MYSQL_ROOT_PASSWORD
          value: "MjcyYjYzOWFkODJhMGQ3ZWRkNWIyY2Yy"
---
apiVersion: v1
kind: Service
metadata:
  name: database
  namespace: docker-demoapp
spec:
  selector:
    app: database
  ports:
  - port: 3306
    targetPort: 3306

Datenbank bereitstellen

  • Wenden Sie das Datenbank-Manifest an
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f db.yaml
  • Überprüfen Sie, ob der Datenbank-Pod läuft
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pods -n docker-demoapp -o wide

Aufgabe 5: Anwendung mit Datenbank verbinden

App-Deployment erweitern

  • Erweitern Sie das Deployment in der app.yaml um die folgenden Umgebungsvariablen:
  • DATABASE_HOST: database
  • DATABASE_PORT: 3306
  • DATABASE_USER: example-user
  • DATABASE_USER_PASSWORD: OGI0YzE2NDU5NTE3MzhmZTI1ZWYxMTY1
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)

Der env-Block im Container sollte so aussehen:

env:
  - name: DOCKERDEMO_NOTES_DIR
    value: "/data/notes"
  - name: DATABASE_HOST
    value: "database"
  - name: DATABASE_PORT
    value: "3306"
  - name: DATABASE_USER
    value: "example-user"
  - name: DATABASE_USER_PASSWORD
    value: "OGI0YzE2NDU5NTE3MzhmZTI1ZWYxMTY1"

Deployment aktualisieren

  • Wenden Sie das erweiterte App-Manifest an
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f app.yaml

Aufgabe 6: Vollständige Anwendung testen

Funktionalität überprüfen

  • Öffnen Sie die Anwendung im Browser über die NodePort-URL
  • Testen Sie das Erstellen und Speichern von Notizen
  • Überprüfen Sie, ob die Notizen nach einem Refresh der Seite erhalten bleiben (Datenbankfunctionalität)

Status-Überprüfung

  • Listen Sie alle Ressourcen im Namespace auf
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get all -n docker-demoapp
  • Überprüfen Sie die Logs der Anwendung
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl logs -n docker-demoapp deployment/docker-demoapp
  • Überprüfen Sie die Logs der Datenbank
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl logs -n docker-demoapp deployment/database

Aufgabe 7: Troubleshooting (Optional)

Verbindung zur Datenbank testen

  • Verbinden Sie sich zum App-Pod und testen Sie die Datenbankverbindung

    kubectl exec -it -n docker-demoapp deployment/docker-demoapp -- /bin/bash
    # Im Pod:
    apt update && apt install -y telnet
    telnet database 3306
    

Service-Discovery überprüfen

  • Überprüfen Sie die DNS-Auflösung im App-Pod

    kubectl exec -it -n docker-demoapp deployment/docker-demoapp -- nslookup database
    

Pod-to-Pod Kommunikation

  • Listen Sie die Endpoints des Database-Service auf

    kubectl get endpoints -n docker-demoapp database
    

Ausblick

Nach Abschluss dieser Aufgabe haben Sie eine vollständige Multi-Tier-Anwendung in Kubernetes bereitgestellt. Sie haben gelernt, wie Deployments, Services und Umgebungsvariablen zusammenarbeiten, um eine funktionsfähige Anwendung zu erstellen.

Erweiterungen

Mögliche Erweiterungen dieser Aufgabe: - Verwendung von ConfigMaps und Secrets für die Konfiguration - Hinzufügung von Persistent Volumes für die Datenbank - Implementation von Health Checks - Skalierung der Anwendung auf mehrere Replicas