WordPress in GKE mit Persistent Disks 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 verwendet Google Persistent Disk 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 Google Persistent Disk dynamisch einzurichten und ein PVC für das Deployment zu erstellen.

Lernziele

  • 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 dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

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 dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Vorbereitung

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Aktivieren Sie Cloud Shell in der Cloud Console.

    Cloud Shell aktivieren

    Unten in der Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Cloud SDK einschließlich des gcloud-Befehlszeilentools vorinstalliert ist. Die Werte sind bereits für Ihr aktuelles Projekt festgelegt. Das Initialisieren der Sitzung kann einige Sekunden dauern.

  5. 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 Standardzone für das gcloud-Befehlszeilentool fest:

    gcloud config set compute/zone zone
    

    Dabei gilt:

    • zone: Wählen Sie eine Zone aus, die geografisch in Ihrer Nähe liegt. Beispiel: us-west1-a 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/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 Cluster namens persistent-disk-tutorial mit drei Knoten:

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create $CLUSTER_NAME \
        --num-nodes=3 --enable-autoupgrade --no-enable-basic-auth \
        --no-issue-client-certificate --enable-ip-alias --metadata \
        disable-legacy-endpoints=true
    

PV und PVC auf Basis von Persistent Disk erstellen

Für den von WordPress benötigten Speicher müssen Sie ein PVC erstellen. 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
    

    Wenn der Vorgang abgeschlossen ist, sollte die Ausgabe in etwa so aussehen:

    NAME                    STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Bound     pvc-89d49350-3c44-11e8-80a6-42010a800002   200G       RWO            standard       5s
    

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 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, erstellen Sie ein Dienstkonto:

    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 folgenden Status anzeigt, können Sie mit dem nächsten Schritt fortfahren:

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

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: Beachten Sie, dass sich Ihre externe IP-Adresse vom Beispiel unten unterscheidet.

    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

So vermeiden Sie, dass Ihr Google Cloud Platform-Konto für die in dieser Anleitung genutzten Ressourcen unnötig mit Gebühren belastet wird:

Projekt löschen

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite "Ressourcen verwalten"

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen .
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

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
    

Weitere Informationen