Zum Inhalt

Lab: Wordpress mit Front- und Backend

Ziel

  • Eine Anwendung mit Front- und Backend deployen

Hilfsmittel

  • Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und der 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.

Lab: Wordpress-Anwendung mit Front- und Backend

  1. Erstellen Sie ein Secret, das einen Schlüssel password mit dem Wert "mypassword" enthält
  2. Fügen Sie den Metadaten die Bezeichnung "exercise: wordpress" hinzu.
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"
    
  • Wenden Sie es an:
    kubectl apply -f secret.yaml
    
  1. Erstellen Sie ein Deployment für die DB
    • Den Metadaten des Deployments sollte ein Label exercise: wordpress hinzugefügt werden.
    • Das Deployment sollte einen einzelnen Pod hochskalieren
    • 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 mountPath /var/lib/mysql gemountet 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)
  • Erstellen Sie ein YAML-File db-deployment.yaml mit dem folgenden Inhalt:
    ---
    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
    
  • Wenden Sie es an:
    kubectl apply -f db-deployment.yaml
    
  • Überprüfen Sie in den Logs, ob der Datenbankserver up and running ist:
    $ kubectl logs deployments/db
    (...)
    [Note] mysqld: ready for connections.
    
  1. Erstellen Sie einen Service für die DB
    • Ein Label exercise: wordpress sollte zu den Deployment-Metadaten hinzugefügt werden.
    • Der Dienst sollte Port 3306 auf targetPort 3306 abbilden
  2. Vergessen Sie die labelSelectors nicht!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
  • Erstellen Sie einen Service db-service.yaml mit dem folgenden Inhalt:
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: db
      labels:
        exercise: wordpress
    spec:
      selector:
        app: blog
        component: db
      ports:
      - protocol: TCP
        port: 3306
        targetPort: 3306
    
  • Wenden Sie es an:
    kubectl apply -f db-service.yaml
    
  1. Erstellen Sie ein Deployment für das Wordpress-Frontend
    • Den Metadaten des Deployments sollte ein Label exercise: wordpress hinzugefügt werden
    • Das Deployment sollte einen einzelnen Pod hochskalieren
    • 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 geheime Passwort verweist
    • Der ContainerPort 80 sollte konfiguriert werden
  2. Vergessen Sie nicht die Labels und LabelSelectors!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
  • Erstellen Sie das Deployment web-deployment.yaml mit dem folgenden Inhalt:
    ---
    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
    
  • Wenden Sie es an:
    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'
    
  1. Erstellen Sie einen Service für die Wordpress-Anwendung
    • Ein Label exercise: wordpress sollte zu den Deployment-Metadaten hinzugefügt werden
    • Der Dienst sollte Port 80 auf targetPort "web" abbilden.
  2. Vergessen Sie nicht die labelSelectors!
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
  • Erstellen Sie ein YAML-File web-service.yaml mit dem folgenden Inhalt:
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: server
      labels:
        exercise: wordpress
    spec:
      selector:
        app: blog
        component: web
      ports:
      - protocol: TCP
        port: 80
        targetPort: web
    
  • Wenden Sie es an:
    kubectl apply -f web-service.yaml
    
  1. Verwenden Sie kubectl get all, um einen Überblick über alle Dinge zu erhalten, die bereitgestellt wurden.
  2. Öffnen Sie ein neues Terminal und erstellen Sie eine Port-Weiterleitung. Diese ist erforderlich, um WordPress im Browser zu öffnen. Wir werden das Port-Forwarding später genauer kennen lernen.
    kubectl port-forward service/server 8081:80 --address=127.0.0.1
    
  3. Verwenden Sie curl, um sicherzustellen, dass der Webserver wordpress ausliefert
  4. Öffnen Sie einen Browser-Tab unter https://code-[INSTANZ_NUMMER].labs.corewire.io/proxy/8081/wp-admin/install.php, um wordpress zu öffnen

Hinweis

Erinnern Sie sich noch an die früheren Übungen mit kubectl run -it --image=cmd.cat/bash/curl? Sie können mehr Befehle haben, indem Sie einfach den Namen des Bildes anhängen, z.B. --image=cmd.cat/bash/curl/lynx. Weitere Informationen finden Sie unter commando

Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
  • Alle Kubernetes Objekte anzeigen:
    $ kubectl get all
    
    NAME                          READY   STATUS    RESTARTS   AGE
    pod/db-746b464d67-bg7gn       1/1     Running   0          49m
    pod/server-857cdbccfb-2xwfq   1/1     Running   0          5m22s
    
    NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
    service/db       ClusterIP   10.42.80.39   <none>        3306/TCP   37m
    service/server   ClusterIP   10.42.61.38   <none>        80/TCP     5s
    
    NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/db       1/1     1            1           49m
    deployment.apps/server   1/1     1            1           5m23s
    
    NAME                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/db-746b464d67       1         1         1       49m
    replicaset.apps/server-857cdbccfb   1         1         1       5m23s
    
  • Durch den WebInstaller auf Wordpress zugreifen:
    $ kubectl run -it --image=cmd.cat/bash/curl --rm --command -- curl -sv server
    

Cleanup

  • Löschen Sie alle Objekte, die wir mit kubectl delete erstellt haben, indem Sie den Label-Selektor für diese speziellen Übungen verwenden.
  • Beobachten Sie, wie sie mit watch kubectl get all verschwinden.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete all --selector exercise=wordpress
kubectl delete secrets --selector exercise=wordpress