Esegui il deployment di WordPress su GKE con Persistent Disk e Cloud SQL


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

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

Premesse

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

In generale, il file system radice di un container non è adatto per archiviare dati permanenti. I container che esegui su GKE sono in genere entità eliminabili e il gestore dei cluster può eliminare, rimuovere o ripianificare tutti i container che non sono più disponibili a causa di errori dei nodi o di altre cause. In caso di errore dei nodi, tutti i dati salvati nel file system radice di un container andranno 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, i dati rimangono invariati anche se i container vengono eliminati. Con la classe di archiviazione predefinita, il Persistent Disk (e quindi i dati) non si sposta con il pod se il pod viene ripianificato su un altro nodo. Esistono diversi modi per gestire lo spostamento dei dati, ma questo non rientra nell'ambito di questo tutorial. Per ulteriori informazioni, consulta Volumi permanenti con Persistent Disk.

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

Obiettivi

  • Creare un cluster GKE.
  • Crea un volume permanente e una PVC supportati da un Persistent Disk.
  • Creare un'istanza Cloud SQL per MySQL.
  • Esegui il deployment di WordPress.
  • Configura il tuo blog WordPress.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

  7. In Cloud Shell, abilita le API GKE e Cloud SQL Admin:
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

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 ulteriori informazioni, consulta Regioni e zone.
  2. Imposta la variabile di ambiente PROJECT_ID sul tuo ID progetto Google Cloud (project-id).

    export PROJECT_ID=project-id
    

  3. Scarica i file manifest dell'app dal 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, creerai oggetti Kubernetes utilizzando file manifest in formato YAML.

Crea un cluster GKE

Puoi creare 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
    

    Dopo averlo creato, connettiti al nuovo cluster:

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

Creazione di un volume permanente e di una PVC supportata da un Persistent Disk

Crea una PVC come spazio di archiviazione richiesto per WordPress. GKE ha installato una risorsa StorageClass predefinita che consente di eseguire il provisioning dinamico dei volumi permanenti supportati da un Persistent Disk. Puoi utilizzare il file wordpress-volumeclaim.yaml per creare le PVC necessarie per il deployment.

Questo file manifest descrive una PVC che richiede 200 GB di spazio di archiviazione. Nel file non è stata definita alcuna risorsa StorageClass, pertanto questa richiesta di volume permanente utilizza la risorsa StorageClass predefinita per eseguire il provisioning di un volume permanente supportato dal Persistent Disk.

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

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

    Possono essere necessari fino a dieci secondi per eseguire il provisioning dell'oggetto PV supportato da Persistent Disk e per associarlo alla PVC. Puoi controllare lo stato con il seguente comando:

    kubectl get persistentvolumeclaim
    

    L'output mostra un PersistentVolumeClaim con uno 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 istanza come variabile di ambiente:

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

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. Crea un utente del database denominato wordpress e una password per WordPress per eseguire l'autenticazione nell'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, perderai 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. Puoi creare un secret Kubernetes per conservare le credenziali dell'account di servizio e un altro secret per conservare 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 dell'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 l'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 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 dell'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 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 in modo che comunichi 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 computing.

  3. Guarda il deployment per vedere che lo stato passa a running:

    kubectl get pod -l app=wordpress --watch
    

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

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

Esponi 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 la tua app WordPress al traffico da internet creando e configurando un servizio Kubernetes con un bilanciatore del carico esterno collegato. Per saperne di più sull'esposizione delle app utilizzando i servizi in GKE, consulta la guida illustrativa.

  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. Controlla 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 andare al passaggio successivo. Tieni presente che il tuo IP esterno è diverso dall'esempio riportato di seguito.

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. Annota il campo indirizzo EXTERNAL_IP per utilizzarlo in seguito.

Configurare il blog WordPress

In questa sezione devi configurare il tuo blog WordPress.

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

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

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

  4. Fai clic su Log In (Accedi).

  5. Inserisci il nome utente e la password creati in precedenza.

  6. Ora hai un blog. Per visitare il blog, nel browser vai al seguente URL:

    http://external-ip-address
    

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina le singole risorse

Se hai utilizzato un progetto esistente e non vuoi eliminarlo, elimina le singole risorse.

  1. Elimina il servizio:

    kubectl delete service wordpress
    

    Attendi che sia stato eseguito il provisioning del bilanciatore del carico per l'eliminazione del servizio wordpress. Il bilanciatore del carico viene eliminato in modo asincrono in background.

    Guarda il processo di eliminazione:

    watch gcloud compute forwarding-rules list
    

    Il bilanciatore del carico viene eliminato quando vedi il seguente output:

    Listed 0 items.
    
  2. Elimina il deployment:

    kubectl delete deployment wordpress
    
  3. Elimina la PVC per WordPress:

    kubectl delete pvc wordpress-volumeclaim
    

    Questo comando elimina automaticamente anche l'oggetto PV e il Persistent Disk.

  4. Elimina il cluster GKE:

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Elimina l'istanza Cloud SQL:

    gcloud sql instances delete $INSTANCE_NAME
    
  6. Rimuovi il ruolo dall'account di servizio:

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. Elimina l'account di servizio:

    gcloud iam service-accounts delete $SA_EMAIL
    

Passaggi successivi