Lab: Wordpress mit Frontend und Backend
Ziel
In diesem Projekt geht es um das Zusammenführen des bisher Gelerntem. Sie werden:
- Eine Anwendung mit Frontend und Backend bereitstellen
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der bisherigen Folien und des Cheatsheets eigenständig zu lösen.
- Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
Aufgabe 1: Datenbank erstellen
Aufgabe 1.1: Datenbank-Deployment erstellen
- Erstellen Sie ein Secret, das einen Schlüssel
password
mit dem Wert "mypassword" enthält
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Erstellen Sie eine Datei
secret.yaml
mit dem folgenden Inhalt:
---
apiVersion: v1
kind: Secret
metadata:
name: db
labels:
exercise: wordpress
type: Opaque
stringData:
password: "mypassword"
- Deployen Sie es:
kubectl apply -f secret.yaml
- Erstellen Sie ein Deployment für die DB
- Das Deployment sollte einen einzelnen Pod erstellen
- Der Container sollte das Image
mysql:5
verwenden - Ein HostPath-Volume vom Typ
DirectoryOrCreate
sollte unter dem Pfad/data/blog/mysql
erstellt werden - Das Volume sollte unter dem Mountpfad
/var/lib/mysql
eingehängt werden - Die folgenden Umgebungsvariablen sollten gesetzt werden:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_DATABASE: "wordpress"
MYSQL_USER: "wordpress"
MYSQL_PASSWORD
, das auf das oben erstellte geheime Passwort verweist
- Der ContainerPort 3306 sollte konfiguriert werden
- Vergessen Sie nicht die Labels und LabelSelectors!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: db
labels:
app: blog
component: db
exercise: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: blog
component: db
template:
metadata:
labels:
app: blog
component: db
spec:
volumes:
- name: data
hostPath:
path: /data/blog/mysql
type: DirectoryOrCreate
containers:
- name: mysql
image: mysql:5
env:
- name: MYSQL_RANDOM_ROOT_PASSWORD
value: "yes"
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: db
key: password
volumeMounts:
- mountPath: /var/lib/mysql
name: data
ports:
- containerPort: 3306
- Deployen Sie die Datenbank
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f db-deployment.yaml
- Überprüfen Sie, ob die Datenbank läuft indem Sie die Logs des Pods abrufen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl logs deployments/db
(...)
[Note] mysqld: ready for connections.
Aufgabe 1.2: Datenbank-Service erstellen
- Erstellen Sie einen Service für die Datenbank
- Der Dienst sollte Port 3306 auf targetPort 3306 abbilden
- Vergessen Sie die labelSelectors nicht!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Service
metadata:
name: db
labels:
exercise: wordpress
spec:
selector:
app: blog
component: db
ports:
- protocol: TCP
port: 3306
targetPort: 3306
- Deployen Sie den Service
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f db-service.yaml
Aufgabe 2: Wordpress Frontend erstellen
- Erstellen Sie ein Deployment für das Wordpress-Frontend
- Das Deployment sollte einen einzelnen Pod erstellen
- Der Container sollte das Image "wordpress:5" verwenden
- Die folgenden Umgebungsvariablen sollten gesetzt werden:
WORDPRESS_DB_HOST: "db"
WORDPRESS_DB_NAME: "wordpress"
WORDPRESS_DB_USER: "wordpress"
WORDPRESS_DB_PASSWORD
, das auf das oben erstellte Secret verweist
- Der ContainerPort 80 sollte konfiguriert werden
- Vergessen Sie nicht die Labels und LabelSelectors!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: server
labels:
exercise: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: blog
component: web
template:
metadata:
labels:
app: blog
component: web
spec:
containers:
- name: wordpress
image: wordpress:5
imagePullPolicy: Always
env:
- name: WORDPRESS_DB_HOST
value: db
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: db
key: password
ports:
- name: web
containerPort: 80
- Deployen Sie das Frontend
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f web-deployment.yaml
- Prüfen Sie in den Wordpress-Logs, ob die Anwendung läuft
kubectl logs deployments/server
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
No 'wp-config.php' found in /var/www/html, but 'WORDPRESS_...' variables supplied; copying 'wp-config-docker.php' (WORDPRESS_DB_HOST WORDPRESS_DB_NAME WORDPRESS_DB_PASSWORD WORDPRESS_DB_USER)
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.42.130.234. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.42.130.234. Set the 'ServerName' directive globally to suppress this message
[Wed Feb 28 15:46:34.797478 2024] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.53 (Debian) PHP/7.4.29 configured -- resuming normal operations
[Wed Feb 28 15:46:34.797511 2024] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
- Erstellen Sie einen Service für die Wordpress-Anwendung
- Der Dienst sollte Port 80 auf targetPort "web" abbilden.
- Vergessen Sie nicht die labelSelectors!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Service
metadata:
name: server
labels:
exercise: wordpress
spec:
selector:
app: blog
component: web
ports:
- protocol: TCP
port: 80
targetPort: web
-
Fügen Sie im Abschnitt
spec
des Services die folgende Zeile hinzu, um den Service für den Zugriff von außen freizugeben:spec: type: NodePort
Wir werden später behandeln, was hier im Detail passiert.
- Deployen Sie den Service
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f web-service.yaml
Aufgabe 3: Wordpress aufrufen
- Verwenden Sie
kubectl get all
, um einen Überblick über alle Dinge zu erhalten, die bereitgestellt wurden. - Verwenden Sie
curl
, um sicherzustellen, dass der Webserver Wordpress ausliefert
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl run -it --image=cmd.cat/bash/curl --rm --command -- bash
curl -sv server
- Setzen Sie den Namen Ihres Wordpress Frontend Services als Umgebungsvariable:
FRONTEND_SERVICE=server
- Das folgende Kommando gibt Ihnen die URL, unter der Sie auf Wordpress zugreifen können:
echo Wordpress Adresse: $(kubectl get nodes -o json | jq -r '.items[] | select(.metadata.labels["node-role.kubernetes.io/control-plane"] | not) | .status.addresses[] | select(.type=="ExternalIP") | .address' | head -n 1):$(k get service ${FRONTEND_SERVICE} -o json | jq .spec.ports[].nodePort)
Sie müssen es nicht vestehen, wir werden später mehr darüber reden wie NodePorts funktionieren.
- Öffnen Sie einen Wordpress im Browser
Cleanup
- Löschen Sie alle Objekte, die Sie erstellt haben.
- Beobachten Sie, wie sie mit
watch kubectl get all
verschwinden.