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 namensdocker-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 TypNodePort
- 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