Déployer WordPress sur GKE avec des disques persistants et Cloud SQL

Ce tutoriel explique comment configurer un déploiement WordPress à instance dupliquée unique sur Google Kubernetes Engine (GKE) à l'aide d'une base de données MySQL. Plutôt que d'installer MySQL, utilisez Cloud SQL, qui fournit une version gérée de MySQL. WordPress stocke les données à l'aide des ressources PersistentVolumes (PV) et PersistentVolumeClaims (PVC).

Un PV est une représentation du volume de stockage dans le cluster qui a été provisionné par un administrateur, ou provisionné de manière dynamique par Kubernetes, pour traiter une requête effectuée dans une PVC. Une PVC est une requête de stockage d'une certaine classe de stockage effectuée par un utilisateur et qui peut être traitée par un PV. Les PV et les PVC sont indépendants des cycles de vie des pods et préservent les données en redémarrant, en reprogrammant, mais également en supprimant des pods. WordPress utilise Google Persistent Disk comme espace de stockage pour soutenir les PVs.

Contexte

WordPress est un outil de création de blogs qui utilise une base de données relationnelle pour stocker les articles de blog ainsi que les métadonnées et objets associés, et le système de fichiers local pour stocker des éléments tels que des images dans un article de blog. Ce tutoriel utilise l'image Docker WordPress officielle de Docker Hub.

En général, le système de fichiers racine d'un conteneur ne convient pas pour stocker des données persistantes. Les conteneurs que vous exécutez sur GKE sont généralement des entités qui peuvent être supprimées, et le gestionnaire du cluster peut supprimer, expulser ou reprogrammer tout conteneur devenu indisponible en raison de défaillances de nœuds ou pour d'autres raisons. En cas de défaillance des nœuds, toutes les données enregistrées dans le système de fichiers racine d'un conteneur sont perdues.

L'utilisation de PV reposant sur un disque persistant vous permet de stocker vos données de plate-forme WordPress en dehors des conteneurs. Ainsi, même si les conteneurs sont supprimés, leurs données sont conservées. Avec la classe de stockage par défaut, votre disque persistant (et donc vos données) ne se déplace pas avec votre pod s'il est reprogrammé sur un autre nœud. Il existe différentes manières de déplacer les données, mais cela n'entre pas dans le cadre de ce tutoriel. Pour en savoir plus, consultez la page Volumes persistants avec disques persistants.

WordPress nécessite un PV pour le stockage des données. Dans le cadre de ce tutoriel, vous utilisez la classe de stockage par défaut pour créer dynamiquement un disque persistant Google et créer une PVC pour le déploiement.

Objectifs

  • Créer un cluster GKE
  • Créer un PV et une PVC reposant sur un disque persistant
  • Créer une instance Cloud SQL pour MySQL
  • Déployer WordPress
  • Configurer votre blog WordPress

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Avant de commencer

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Dans Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Cloud.

    Accéder à la page de sélection du projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Dans Cloud Console, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de Cloud Console, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel le SDK Cloud est déjà installé (y compris l'outil de ligne de commande gcloud), et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  5. Dans Cloud Shell, activez les API GKE et Cloud SQL Admin :
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

Configurer votre environnement

  1. Dans Cloud Shell, définissez la zone par défaut pour l'outil de ligne de commande gcloud :

    gcloud config set compute/zone zone
    

    Remplacez l'élément suivant :

  2. Téléchargez les fichiers manifestes d'application à partir du dépôt GitHub :

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  3. Accédez au répertoire qui contient le fichier wordpress-persistent-disks :

    cd kubernetes-engine-samples/wordpress-persistent-disks
    
  4. Définissez la variable d'environnement WORKING_DIR :

    WORKING_DIR=$(pwd)
    

    Dans le cadre de ce tutoriel, vous créez des objets Kubernetes à l'aide de fichiers manifestes au format YAML.

Créer un cluster GKE

Créez un cluster GKE sur lequel héberger votre conteneur d'applications WordPress.

  • Dans Cloud Shell, créez un cluster nommé persistent-disk-tutorial qui comporte trois nœuds :

    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
    

Créer un PV et une PVC reposant sur un disque persistant

Pour créer l'espace de stockage requis pour WordPress, vous devez créer une PVC. GKE dispose d'une ressource StorageClass par défaut qui vous permet de provisionner de manière dynamique les PV reposant sur un disque persistant. Créez les PVC requises pour le déploiement à l'aide du fichier wordpress-volumeclaim.yaml.

Ce fichier manifeste décrit une PVC qui demande 200 Go d'espace de stockage. Une ressource StorageClass n'a pas été définie dans le fichier. Par conséquent, cette PVC utilise la ressource StorageClass par défaut pour provisionner un PV reposant sur un disque persistant.

  1. Dans Cloud Shell, déployez le fichier manifeste :

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

    Il peut s'écouler jusqu'à dix secondes avant que le PV reposant sur un disque persistant ne soit provisionné et associé à votre PVC.

    Une fois ce processus terminé, le résultat ressemble à ce qui suit :

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

Créer une instance Cloud SQL pour MySQL

  1. Dans Cloud Shell, créez une instance nommée mysql-wordpress-instance :

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. Ajoutez le nom de la connexion de l'instance en tant que variable d'environnement :

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. Créez un utilisateur de base de données nommé wordpress et un mot de passe pour que WordPress puisse s'authentifier auprès de l'instance :

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

    Si vous fermez votre session Cloud Shell, vous perdez le mot de passe. Notez le mot de passe, car vous en aurez besoin dans la suite du tutoriel.

Vous avez terminé la configuration de la base de données pour votre nouveau blog WordPress.

Déployer WordPress

Pour pouvoir déployer WordPress, vous devez créer un compte de service. Créez un secret Kubernetes pour conserver les identifiants du compte de service et un autre pour conserver les identifiants de la base de données.

Configurer un compte de service et créer des secrets

  1. Pour autoriser votre application WordPress à accéder à l'instance MySQL via un proxy Cloud SQL, créez un compte de service :

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. Ajoutez l'adresse e-mail du compte de service en tant que variable d'environnement :

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. Ajoutez le rôle cloudsql.client à votre compte de service :

    gcloud projects add-iam-policy-binding $DEVSHELL_PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. Créez une clé pour le compte de service :

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

    Cette commande télécharge une copie du fichier key.json.

  5. Créez un secret Kubernetes pour les identifiants MySQL :

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. Créez un secret Kubernetes pour les identifiants du compte de service :

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

Déployer WordPress

L'étape suivante consiste à déployer votre conteneur WordPress dans le cluster GKE.

Le fichier manifeste wordpress_cloudsql.yaml décrit un déploiement qui crée un seul pod exécutant un conteneur avec une instance WordPress. Ce conteneur lit la variable d'environnement WORDPRESS_DB_PASSWORD contenant le secret cloudsql-db-credentials que vous avez créé.

Ce fichier manifeste configure également le conteneur WordPress de sorte qu'il communique avec MySQL via le proxy Cloud SQL exécuté dans le conteneur side-car. La valeur d'adresse de l'hôte est définie dans la variable d'environnement WORDPRESS_DB_HOST.

  1. Remplacez les variables d'environnement pour préparer le fichier de déploiement :

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. Déployez le fichier manifeste wordpress_cloudsql.yaml :

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    Le déploiement de ce fichier manifeste prend quelques minutes lorsque le disque persistant est associé au nœud de calcul.

  3. Regardez le déploiement afin de voir l'état passer à running :

    kubectl get pod -l app=wordpress --watch
    

    Lorsque le résultat affiche l'état suivant, vous pouvez passer à l'étape suivante.

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

Exposer le service WordPress

À l'étape précédente, vous avez déployé un conteneur WordPress. Toutefois, il n'est actuellement pas accessible en dehors de votre cluster, car il ne possède pas d'adresse IP externe. Pour exposer votre application WordPress au trafic provenant d'Internet, créez et configurez un équilibreur de charge.

  1. Créez un service de type:LoadBalancer :

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

    La création d'un équilibreur de charge peut prendre quelques minutes.

  2. Regardez le déploiement et attendez qu'une adresse IP externe ait été attribuée au service :

    kubectl get svc -l app=wordpress --watch
    
  3. Lorsque le résultat affiche une adresse IP externe, vous pouvez passer à l'étape suivante :

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. Notez l'adresse IP, car vous en aurez besoin plus tard.

Configurer votre blog WordPress

Dans cette section, vous allez configurer votre blog WordPress.

  1. Dans votre navigateur, accédez à l'URL suivante, en remplaçant external-ip-address par l'adresse IP externe du service qui expose votre instance WordPress :

    http://external-ip-address
    
  2. Sur la page WordPress installation (Installation de WordPress), sélectionnez une langue, puis cliquez sur Continue (Continuer).

  3. Complétez la page Information needed (Informations requises), puis cliquez sur Install WordPress (Installer WordPress).

  4. Cliquez sur Log In (Se connecter).

  5. Saisissez le nom d'utilisateur et le mot de passe que vous avez créés précédemment.

  6. Vous disposez désormais d'un blog. Pour accéder à votre blog, accédez à l'URL suivante dans votre navigateur :

    http://external-ip-address
    

Nettoyer

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud Platform, procédez comme suit :

Supprimer le projet

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer .
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les ressources individuelles

Si vous avez utilisé un projet existant et que vous ne souhaitez pas le supprimer, supprimez les ressources individuelles.

  1. Supprimez le service :

    kubectl delete service wordpress
    

    Attendez que l'équilibreur de charge provisionné pour le service wordpress soit supprimé. L'équilibreur de charge est supprimé de manière asynchrone en arrière-plan.

    Regardez le processus de suppression :

    watch gcloud compute forwarding-rules list
    

    Lorsque le résultat suivant s'affiche, cela signifie que l'équilibreur de charge est supprimé :

    Listed 0 items.
    
  2. Supprimez le déploiement :

    kubectl delete deployment wordpress
    
  3. Supprimez la PVC pour WordPress :

    kubectl delete pvc wordpress-volumeclaim
    

    Cette commande supprime également automatiquement le PV et le disque persistant.

  4. Supprimez le cluster GKE :

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Supprimez l'instance Cloud SQL :

    gcloud sql instances delete $INSTANCE_NAME
    
  6. Supprimez le rôle du compte de service :

    gcloud projects remove-iam-policy-binding $DEVSHELL_PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. Supprimez le compte de service :

    gcloud iam service-accounts delete $SA_EMAIL
    

Étapes suivantes