Wordpress auf GKE mit Persistent Disk und Cloud SQL bereitstellen


In dieser Anleitung wird gezeigt, wie Sie ein WordPress-Deployment mit einem einzigen Replikat in Google Kubernetes Engine (GKE) unter Verwendung einer MySQL-Datenbank einrichten. Statt MySQL zu installieren, verwenden Sie Cloud SQL, das eine verwaltete Version von MySQL bereitstellt. WordPress verwendet PersistentVolumes (PVs) und PersistentVolumeClaims (PVCs) zum Speichern von Daten.

Ein PV ist eine Darstellung des Speicher-Volumes im Cluster, das von einem Administrator manuell oder von Kubernetes dynamisch zur Verarbeitung einer Anfrage bereitgestellt wird, die in einem PVC gestellt wurde. Ein PVC ist eine vom Nutzer gesendete Anfrage zur Speicherung einer bestimmten Speicherklasse, die von einem PV verarbeitet werden kann. PVs und PVCs sind von Pod-Lebenszyklen unabhängig und behalten Daten auch dann bei, wenn Pods neu gestartet, neu geplant oder sogar gelöscht werden. WordPress nutzt nichtflüchtigen Speicher als Speicher für die PVs.

Hintergrund

WordPress ist ein Blogging-Tool, das die Blog-Artikel und ihre zugehörigen Objekte und Metadaten in einer relationalen Datenbank speichert. Inhalte wie Bilder in einem Blogpost werden dagegen im lokalen Dateisystem gespeichert. In dieser Anleitung wird das offizielle WordPress-Docker-Image von Docker Hub verwendet.

Im Allgemeinen eignet sich das Root-Dateisystem eines Containers nicht zum Speichern von nichtflüchtigen Daten. Die Container, die Sie in GKE ausführen, sind normalerweise entfernbare Entitäten. Der Clustermanager kann jeden Container löschen, bereinigen oder neu planen, der aufgrund von Knotenfehlern oder anderen Ursachen nicht mehr verfügbar ist. Wenn Knoten fehlschlagen, gehen alle Daten verloren, die im Root-Dateisystem eines Containers gespeichert sind.

Wenn Sie PVs mit Persistent Disk verwenden, können Sie die Daten der WordPress-Plattform außerhalb der Container speichern. Dadurch bleiben die Daten erhalten, auch wenn die Container gelöscht werden. Bei Verwendung der Standardspeicherklasse wandert Ihr nichtflüchtiger Speicher (und damit Ihr Datenbestand) nicht mit dem Pod mit, wenn dieser für einen anderen Knoten neu geplant wird. Es gibt verschiedene Möglichkeiten, das Verschieben der Daten zu verwalten. Eine Erläuterung dieser Möglichkeiten würde allerdings den Rahmen dieser Anleitung sprengen. Weitere Informationen finden Sie unter Bestehenden nichtflüchtigen Speicher als PersistentVolumes verwenden.

Für WordPress ist ein PV zum Speichern der Daten erforderlich. In dieser Anleitung verwenden Sie die Standardspeicherklasse, um einen nichtflüchtigen Speicher dynamisch zu erstellen und ein PVC für das Deployment zu erstellen.

Ziele

  • GKE-Cluster erstellen
  • PV und PVC auf Basis von Persistent Disk erstellen
  • Cloud SQL for MySQL-Instanz erstellen
  • WordPress bereitstellen
  • WordPress-Blog einrichten

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  7. Aktivieren Sie in Cloud Shell die GKE APIs und die Cloud SQL Admin APIs:
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

Umgebung einrichten

  1. Legen Sie in Cloud Shell die Standardregion für die Google Cloud CLI fest:

    gcloud config set compute/region region
    

    Dabei gilt:

    • region: Wählen Sie eine Region aus, die geografisch in Ihrer Nähe liegt. Weitere Informationen finden Sie unter Regionen und Zonen.
  2. Legen Sie die Umgebungsvariable PROJECT_ID auf Ihre Google Cloud-Projekt-ID fest (project-id).

    export PROJECT_ID=project-id
    

  3. Laden Sie die Manifestdatei der Anwendung aus dem GitHub-Repository herunter:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Wechseln Sie in das Verzeichnis mit der Datei wordpress-persistent-disks:

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. Legen Sie die Umgebungsvariable WORKING_DIR fest:

    WORKING_DIR=$(pwd)
    

    Für diese Anleitung erstellen Sie Kubernetes-Objekte mit Manifestdateien im YAML-Format.

GKE-Cluster erstellen

Sie erstellen einen GKE-Cluster, um den WordPress-Anwendungscontainer zu hosten.

  • Erstellen Sie in Cloud Shell einen GKE-Cluster mit dem Namen persistent-disk-tutorial:

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create-auto $CLUSTER_NAME
    

    Stellen Sie nach dem Erstellen eine Verbindung zum neuen Cluster her:

    gcloud container clusters get-credentials $CLUSTER_NAME --region REGION
    

PV und PVC auf Basis von Persistent Disk erstellen

Erstellen Sie einen PVC als Speicher, der für WordPress erforderlich ist. In GKE ist eine StorageClass-Standardressource installiert, mit der Sie PVs dynamisch bereitstellen können, die Persistent Disk als Speicher verwenden. Zum Erstellen der PVCs, die für das Deployment erforderlich sind, verwenden Sie die Datei wordpress-volumeclaim.yaml.

Diese Manifestdatei beschreibt ein PVC, das 200 GB Speicher anfordert. Da in der Datei keine StorageClass-Ressource definiert wurde, verwendet dieses PVC die StorageClass-Standardressource, um ein PV mit Persistent Disk bereitzustellen.

  1. Stellen Sie in Cloud Shell die Manifestdatei bereit:

    kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
    

    Es kann bis zu zehn Sekunden dauern, bis das PV mit Persistent Disk bereitgestellt und an das PVC gebunden wurde. Sie können den Status mit dem folgenden Befehl prüfen:

    kubectl get persistentvolumeclaim
    

    Die Ausgabe zeigt einen PersistentVolumeClaim mit dem Status Pending, ähnlich der folgenden:

    NAME                    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Pending                                      standard-rwo   5s
    

    Dieser PersistentVolumeClaim verbleibt im Zustand Pending, bis Sie ihn später in dieser Anleitung verwenden.

Cloud SQL for MySQL-Instanz erstellen

  1. Erstellen Sie in Cloud Shell eine Instanz namens mysql-wordpress-instance:

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. Fügen Sie den Namen der Instanzverbindung als Umgebungsvariable hinzu:

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. Erstellen Sie eine Datenbank für WordPress, um die Daten zu speichern:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. Erstellen Sie einen Datenbanknutzer namens wordpress und ein Passwort für WordPress zur Authentifizierung bei der Instanz:

    CLOUD_SQL_PASSWORD=$(openssl rand -base64 18)
    gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \
        --password $CLOUD_SQL_PASSWORD
    

    Wenn Sie Ihre Cloud Shell-Sitzung schließen, geht das Passwort verloren. Notieren Sie sich das Passwort, da Sie es später in der Anleitung benötigen.

Damit haben Sie die Datenbank für Ihren neuen WordPress-Blog eingerichtet.

WordPress bereitstellen

Bevor Sie WordPress bereitstellen können, müssen Sie ein Dienstkonto erstellen. Sie erstellen ein Kubernetes-Secret für die Anmeldedaten des Dienstkontos und ein weiteres Secret für die Anmeldedaten der Datenbank.

Dienstkonto konfigurieren und Secrets erstellen

  1. Damit die WordPress-Anwendung über einen Cloud SQL-Proxy auf die MySQL-Instanz zugreifen kann, müssen Sie ein Dienstkonto erstellen:

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. Fügen Sie die E-Mail-Adresse des Dienstkontos als Umgebungsvariable hinzu:

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. Fügen Sie Ihrem Dienstkonto die Rolle cloudsql.client hinzu:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. Erstellen Sie einen Schlüssel für das Dienstkonto:

    gcloud iam service-accounts keys create $WORKING_DIR/key.json \
        --iam-account $SA_EMAIL
    

    Mit diesem Befehl wird eine Kopie der Datei key.json heruntergeladen.

  5. Erstellen Sie ein Kubernetes-Secret für die MySQL-Anmeldedaten:

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. Erstellen Sie ein Kubernetes-Secret für die Anmeldedaten des Dienstkontos:

    kubectl create secret generic cloudsql-instance-credentials \
        --from-file $WORKING_DIR/key.json
    

WordPress erstellen

Im nächsten Schritt stellen Sie den WordPress-Container im GKE-Cluster bereit.

Die Manifestdatei wordpress_cloudsql.yaml beschreibt ein Deployment, das einen einzelnen Pod erstellt, der einen Container mit einer WordPress-Instanz ausführt. Dieser Container liest die Umgebungsvariable WORDPRESS_DB_PASSWORD, die das von Ihnen erstellte Secret cloudsql-db-credentials enthält.

Diese Manifestdatei konfiguriert außerdem den WordPress-Container für die Kommunikation mit MySQL über den Cloud SQL-Proxy, der im Sidecar-Container ausgeführt wird. Der Wert der Hostadresse wird in der Umgebungsvariable WORDPRESS_DB_HOST festgelegt.

  1. Ersetzen Sie zur Vorbereitung der Bereitstellungsdatei die Umgebungsvariable INSTANCE_CONNECTION_NAME:

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. Stellen Sie die Manifestdatei wordpress_cloudsql.yaml bereit:

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    Das Deployment dieser Manifestdatei dauert ein paar Minuten. In diesem Zeitraum wird Persistent Disk an den Compute-Knoten angehängt.

  3. Beobachten Sie das Deployment, damit Sie die Statusänderung in running sehen:

    kubectl get pod -l app=wordpress --watch
    

    Wenn die Ausgabe den Status Running anzeigt, können Sie mit dem nächsten Schritt fortfahren:

    NAME                     READY     STATUS    RESTARTS   AGE
    wordpress-387015-02xxb   2/2       Running   0          2m47s
    

WordPress-Dienst freigeben

Im vorherigen Schritt haben Sie einen WordPress-Container bereitgestellt, auf den jedoch von außerhalb des Clusters derzeit nicht zugegriffen werden kann, da er keine externe IP-Adresse hat. Durch das Erstellen und Konfigurieren eines Kubernetes-Dienstes mit einem angehängten externen Load-Balancer können Sie die WordPress-Anwendung für Traffic aus dem Internet freigeben. Weitere Informationen zum Freigeben von Anwendungen mithilfe von Diensten in GKE finden Sie in der Anleitung.

  1. Erstellen Sie einen Dienst von type:LoadBalancer:

    kubectl create -f $WORKING_DIR/wordpress-service.yaml
    

    Das Erstellen eines Load-Balancers dauert einige Minuten.

  2. Beobachten Sie das Deployment und warten Sie, bis dem Dienst eine externe IP-Adresse zugewiesen wurde:

    kubectl get svc -l app=wordpress --watch
    
  3. Wenn die Ausgabe eine externe IP-Adresse anzeigt, können Sie mit dem nächsten Schritt fortfahren: Ihre externe IP-Adresse unterscheidet sich vom folgenden Beispiel:

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. Notieren Sie sich das Adressfeld EXTERNAL_IP für die spätere Verwendung.

WordPress-Blog einrichten

In diesem Abschnitt richten Sie Ihren WordPress-Blog ein.

  1. Rufen Sie in Ihrem Browser die folgende URL auf und ersetzen Sie dabei external-ip-address durch die EXTERNAL_IP-Adresse des Dienstes, der Ihre WordPress-Instanz freigibt:

    http://external-ip-address
    
  2. Wählen Sie auf der Seite WordPress installation (WordPress-Installation) eine Sprache aus und klicken Sie dann auf Continue (Weiter).

  3. Füllen Sie die Seite Information needed (Erforderliche Informationen) aus und klicken Sie dann auf Install WordPress (WordPress installieren).

  4. Klicken Sie auf Log In (Anmelden).

  5. Geben Sie den zuvor erstellten Nutzernamen und das Passwort ein.

  6. Sie haben jetzt eine Blog-Website. Rufen Sie Ihren Blog im Browser über die folgende URL auf:

    http://external-ip-address
    

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Einzelne Ressourcen löschen

Wenn Sie ein vorhandenes Projekt verwendet haben und es nicht löschen möchten, können Sie die einzelnen Ressourcen löschen.

  1. Löschen Sie den Dienst:

    kubectl delete service wordpress
    

    Warten Sie, bis der für den Dienst wordpress bereitgestellte Load-Balancer gelöscht wurde. Der Load-Balancer wird asynchron im Hintergrund gelöscht.

    Beobachten Sie den Löschvorgang:

    watch gcloud compute forwarding-rules list
    

    Der Load-Balancer ist gelöscht, wenn Sie die folgende Ausgabe sehen:

    Listed 0 items.
    
  2. Löschen Sie das Deployment:

    kubectl delete deployment wordpress
    
  3. Löschen Sie das PVC für WordPress:

    kubectl delete pvc wordpress-volumeclaim
    

    Mit diesem Befehl werden auch das PV und Persistent Disk automatisch gelöscht.

  4. Löschen Sie den GKE-Cluster:

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Löschen Sie die Cloud SQL-Instanz:

    gcloud sql instances delete $INSTANCE_NAME
    
  6. Entfernen Sie die Rolle aus dem Dienstkonto:

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. Löschen Sie das Dienstkonto:

    gcloud iam service-accounts delete $SA_EMAIL
    

Nächste Schritte