Deployment di WordPress su GKE con Persistent Disk e Cloud SQL

Questo tutorial mostra come configurare un deployment WordPress a replica singola su Google Kubernetes Engine (GKE) utilizzando un database MySQL. Anziché installare MySQL, utilizzi Cloud SQL, che fornisce una versione gestita di MySQL. WordPress utilizza PersistentVolumes (PV) e PersistentVolumeClaims (PVC) per archiviare i dati.

Un PV è una rappresentazione del volume di archiviazione nel cluster di cui è stato eseguito il provisioning da parte di un amministratore o dinamicamente da Kubernetes per soddisfare una richiesta effettuata in una richiesta di volume permanente. Un PVC è una richiesta di spazio di archiviazione di una determinata classe di archiviazione da parte di un utente che può essere soddisfatta da un PV. PV e PVC sono indipendenti dai cicli di vita dei pod e conservano i dati durante il riavvio, la riprogrammazione e persino l'eliminazione dei pod. WordPress utilizza Persistent Disk come spazio di archiviazione per supportare i PV.

Sfondo

WordPress è uno strumento di blogging che utilizza un database relazionale per archiviare gli articoli del blog e i relativi oggetti e metadati, nonché il file system locale per archiviare asset, come le immagini in un post del blog. Questo tutorial utilizza l'immagine Docker di WordPress ufficiale di Docker Hub.

In generale, il file system radice di un container non è adatto per archiviare dati persistenti. I container eseguiti su GKE sono in genere entità usa e getta e il gestore del cluster può eliminare, espellere o riprogrammare qualsiasi container che non è più disponibile a causa di errori dei nodi o di altre cause. Quando i nodi non funzionano, tutti i dati salvati nel file system root di un container vengono persi.

L'utilizzo di PV supportati da Persistent Disk consente di archiviare i dati della piattaforma WordPress al di fuori dei container. In questo modo, anche se i contenitori vengono eliminati, i relativi dati vengono conservati. Con la classe di archiviazione predefinita, il Persistent Disk (e quindi i tuoi dati) non si sposta con il pod se viene riprogrammato su un altro nodo. Esistono diversi modi per gestire lo spostamento dei dati, ma non rientrano nell'ambito di questo tutorial. Per ulteriori informazioni, vedi Volumi permanenti con Persistent Disk.

WordPress richiede un PV per archiviare i dati. Per questo tutorial, utilizzerai la classe di archiviazione predefinita per creare dinamicamente un Persistent Disk e creare un PVC per il deployment.

Configurazione dell'ambiente

  1. In Cloud Shell, imposta la regione predefinita per Google Cloud CLI:

    gcloud config set compute/region region
    

    Sostituisci quanto segue:

    • region: scegli la regione più vicina a te. Per maggiori informazioni, consulta Regioni e zone.
  2. Imposta la variabile di ambiente PROJECT_ID sull'Google Cloud ID progetto (project-id).

    export PROJECT_ID=project-id
    

  3. Scarica i file manifest dell'app da repository GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Passa alla directory con il file wordpress-persistent-disks:

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. Imposta la variabile di ambiente WORKING_DIR:

    WORKING_DIR=$(pwd)
    

    Per questo tutorial, crei oggetti Kubernetes utilizzando file manifest in formato YAML.

Crea un cluster GKE

Crea un cluster GKE per ospitare il container dell'app WordPress.

  • In Cloud Shell, crea un cluster GKE denominato persistent-disk-tutorial:

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

    Una volta creato, connettiti al nuovo cluster:

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

Creazione di un PV e di un PVC supportati da Persistent Disk

Crea un PVC come spazio di archiviazione richiesto per WordPress. GKE ha una risorsa StorageClass predefinita installata che ti consente di eseguire il provisioning dinamico dei PV supportati da Persistent Disk. Utilizzi il file wordpress-volumeclaim.yaml per creare le PVC richieste per il deployment.

Questo file manifest descrive una PVC che richiede 200 GB di spazio di archiviazione. Una risorsa StorageClass non è stata definita nel file, quindi questa PVC utilizza la risorsa StorageClass predefinita per eseguire il provisioning di un PV supportato da Persistent Disk.

  1. In Cloud Shell, esegui il deployment del file manifest:

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

    Potrebbero essere necessari fino a 10 secondi per eseguire il provisioning del PV supportato da Persistent Disk e per associarlo al PVC. Puoi controllare lo stato con il seguente comando:

    kubectl get persistentvolumeclaim
    

    L'output mostra un PersistentVolumeClaim con lo stato Pending, simile al seguente:

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

    Questo PersistentVolumeClaim rimane nello stato Pending finché non lo utilizzi più avanti in questo tutorial.

Creazione di un'istanza Cloud SQL per MySQL

  1. In Cloud Shell, crea un'istanza denominata mysql-wordpress-instance:

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. Aggiungi il nome della connessione dell'istanza come variabile di ambiente:

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. Crea un database per WordPress per archiviare i suoi dati:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. Crea un utente del database chiamato wordpress e una password per WordPress per l'autenticazione all'istanza:

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

    Se chiudi la sessione di Cloud Shell, perdi la password. Prendi nota della password perché ti servirà più avanti nel tutorial.

Hai completato la configurazione del database per il tuo nuovo blog WordPress.

Deployment di WordPress

Prima di poter eseguire il deployment di WordPress, devi creare un account di servizio. Crea un secret Kubernetes per contenere le credenziali dell'account di servizio e un altro secret per contenere le credenziali del database.

Configura un account di servizio e crea secret

  1. Per consentire all'app WordPress di accedere all'istanza MySQL tramite un proxy Cloud SQL, crea un account di servizio:

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. Aggiungi l'indirizzo email del account di servizio come variabile di ambiente:

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. Aggiungi il ruolo cloudsql.client al tuo account di servizio:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. Crea una chiave per il account di servizio:

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

    Questo comando scarica una copia del file key.json.

  5. Crea un secret di Kubernetes per le credenziali MySQL:

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. Crea un secret Kubernetes per le credenziali del account di servizio:

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

Esegui il deployment di WordPress

Il passaggio successivo consiste nell'eseguire il deployment del container WordPress nel cluster GKE.

Il file manifest wordpress_cloudsql.yaml descrive un deployment che crea un singolo pod che esegue un container con un'istanza di WordPress. Questo container legge la variabile di ambiente WORDPRESS_DB_PASSWORD che contiene il secret cloudsql-db-credentials che hai creato.

Questo file manifest configura anche il container WordPress per comunicare con MySQL tramite il proxy Cloud SQL in esecuzione nel container sidecar. Il valore dell'indirizzo host è impostato sulla variabile di ambiente WORDPRESS_DB_HOST.

  1. Prepara il file sostituendo la variabile di ambiente INSTANCE_CONNECTION_NAME:

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. Esegui il deployment del file manifest wordpress_cloudsql.yaml:

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    Il deployment di questo file manifest richiede alcuni minuti mentre un Persistent Disk è collegato al nodo di calcolo.

  3. Osserva il deployment per vedere lo stato cambiare in running:

    kubectl get pod -l app=wordpress --watch
    

    Quando l'output mostra lo stato Running, puoi passare al passaggio successivo.

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

Esporre il servizio WordPress

Nel passaggio precedente hai eseguito il deployment di un container WordPress, ma al momento non è accessibile dall'esterno del cluster perché non ha un indirizzo IP esterno. Puoi esporre il traffico da internet alla tua app WordPress creando e configurando un servizio Kubernetes con un bilanciatore del carico esterno collegato. Per scoprire di più sull'esposizione delle app utilizzando i servizi in GKE, consulta la guida pratica.

  1. Crea un servizio di type:LoadBalancer:

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

    La creazione di un bilanciatore del carico richiede alcuni minuti.

  2. Guarda il deployment e attendi che al servizio venga assegnato un indirizzo IP esterno:

    kubectl get svc -l app=wordpress --watch
    
  3. Quando l'output mostra un indirizzo IP esterno, puoi procedere al passaggio successivo. Tieni presente che il tuo IP esterno è diverso dall'esempio seguente.

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. Prendi nota del campo dell'indirizzo EXTERNAL_IP da utilizzare in un secondo momento.

Configurare il blog WordPress

In questa sezione, configuri il blog WordPress.

  1. Nel browser, vai al seguente URL, sostituendo external-ip-address con l'indirizzo EXTERNAL_IP del servizio che espone l'istanza WordPress:

    http://external-ip-address
    
  2. Nella pagina Installazione di WordPress, seleziona una lingua e poi fai clic su Continua.

  3. Completa la pagina Informazioni necessarie, quindi fai clic su Installa WordPress.

  4. Fai clic su Accedi.

  5. Inserisci il nome utente e la password che hai creato in precedenza.

  6. Ora hai un sito di blog. Per visitare il tuo blog, nel browser, vai all'URL seguente:

    http://external-ip-address