Implemente o WordPress no GKE com o disco persistente e o Cloud SQL

Este tutorial mostra como configurar uma implementação do WordPress de réplica única no Google Kubernetes Engine (GKE) com uma base de dados MySQL. Em vez de instalar o MySQL, usa o Cloud SQL, que oferece uma versão gerida do MySQL. O WordPress usa PersistentVolumes (PV) e PersistentVolumeClaims (PVC) para armazenar dados.

Um PV é uma representação do volume de armazenamento no cluster aprovisionado por um administrador ou aprovisionado dinamicamente pelo Kubernetes para satisfazer um pedido feito num PVC. Um PVC é um pedido de armazenamento de uma determinada classe de armazenamento por um utilizador que pode ser cumprido por um PV. Os PVs e os PVCs são independentes dos ciclos de vida dos pods e preservam os dados através do reinício, da reprogramação e até da eliminação dos pods. O WordPress usa o Persistent Disk como armazenamento para suportar os PVs.

Contexto

O WordPress é uma ferramenta de blogues que usa uma base de dados relacional para armazenar os artigos do blogue e os respetivos objetos e metadados relacionados, e o sistema de ficheiros local para armazenar recursos, como imagens numa publicação de blogue. Este tutorial usa a imagem do Docker do WordPress oficial do Docker Hub.

Em geral, o sistema de ficheiros raiz de um contentor não é adequado para armazenar dados persistentes. Normalmente, os contentores que executa no GKE são entidades descartáveis, e o gestor do cluster pode eliminar, despejar ou reagendar quaisquer contentores que fiquem indisponíveis devido a falhas de nós ou outras causas. Quando os nós falham, todos os dados guardados no sistema de ficheiros raiz de um contentor são perdidos.

A utilização de PVs suportados por um disco persistente permite-lhe armazenar os dados da plataforma WordPress fora dos contentores. Desta forma, mesmo que os contentores sejam eliminados, os respetivos dados persistem. Com a classe de armazenamento predefinida, o disco persistente (e, por conseguinte, os seus dados) não se move com o pod se o pod for reagendado para outro nó. Existem diferentes formas de processar a movimentação dos dados, mas isso está fora do âmbito deste tutorial. Para mais informações, consulte o artigo Volumes persistentes com disco persistente.

O WordPress requer um PV para armazenar dados. Para este tutorial, vai usar a classe de armazenamento predefinida para criar dinamicamente um disco persistente e criar um PVC para a implementação.

Configurar o seu ambiente

  1. No Cloud Shell, defina a região predefinida para a CLI do Google Cloud:

    gcloud config set compute/region region
    

    Substitua o seguinte:

    • region: escolha uma região mais próxima de si. Para mais informações, consulte o artigo Regiões e zonas.
  2. Defina a variável de ambiente PROJECT_ID para o seu Google Cloud ID do projeto (project-id).

    export PROJECT_ID=project-id
    

  3. Transfira os ficheiros de manifesto da app a partir do repositório do GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Mude para o diretório com o ficheiro wordpress-persistent-disks:

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. Defina a variável de ambiente WORKING_DIR:

    WORKING_DIR=$(pwd)
    

    Para este tutorial, vai criar objetos do Kubernetes com ficheiros de manifesto no formato YAML.

Criar um cluster do GKE

Cria um cluster do GKE para alojar o contentor da app WordPress.

  • No Cloud Shell, crie um cluster do GKE com o nome persistent-disk-tutorial:

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

    Depois de criado, estabeleça ligação ao novo cluster:

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

Criar um PV e um PVC com base no disco persistente

Crie um PVC como o armazenamento necessário para o WordPress. O GKE tem um recurso StorageClass predefinido instalado que lhe permite aprovisionar dinamicamente PVs suportados por um disco persistente. Usa o ficheiro wordpress-volumeclaim.yaml para criar os PVCs necessários para a implementação.

Este ficheiro de manifesto descreve um PVC que pede 200 GB de armazenamento. Um recurso StorageClassA não foi definido no ficheiro, pelo que este PVC usa o recurso StorageClassA predefinido para aprovisionar um PV suportado por um disco persistente.

  1. No Cloud Shell, implemente o ficheiro de manifesto:

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

    O aprovisionamento do PV suportado pelo disco persistente e a sua associação ao PVC podem demorar até dez segundos. Pode verificar o estado com o seguinte comando:

    kubectl get persistentvolumeclaim
    

    O resultado mostra um PersistentVolumeClaim com o estado Pending, semelhante ao seguinte:

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

    Este PersistentVolumeClaim permanece no estado Pending até o usar mais tarde neste tutorial.

Criar uma instância do Cloud SQL para MySQL

  1. No Cloud Shell, crie uma instância com o nome mysql-wordpress-instance:

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. Adicione o nome da ligação da instância como uma variável de ambiente:

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. Crie uma base de dados para o WordPress armazenar os respetivos dados:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. Crie um utilizador da base de dados denominado wordpress e uma palavra-passe para o WordPress para autenticar na instância:

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

    Se fechar a sessão do Cloud Shell, perde a palavra-passe. Tome nota da palavra-passe, uma vez que vai precisar dela mais tarde no tutorial.

Concluiu a configuração da base de dados para o seu novo blogue do WordPress.

Implementar o WordPress

Antes de poder implementar o WordPress, tem de criar uma conta de serviço. Cria um segredo do Kubernetes para guardar as credenciais da conta de serviço e outro segredo para guardar as credenciais da base de dados.

Configure uma conta de serviço e crie segredos

  1. Para permitir que a sua app WordPress aceda à instância do MySQL através de um proxy do Cloud SQL, crie uma conta de serviço:

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. Adicione o endereço de email da conta de serviço como uma variável de ambiente:

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. Adicione a função cloudsql.client à sua conta de serviço:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. Crie uma chave para a conta de serviço:

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

    Este comando transfere uma cópia do ficheiro key.json.

  5. Crie um segredo do Kubernetes para as credenciais do MySQL:

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. Crie um segredo do Kubernetes para as credenciais da conta de serviço:

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

Implemente o WordPress

O passo seguinte é implementar o contentor do WordPress no cluster do GKE.

O ficheiro de manifesto wordpress_cloudsql.yaml descreve uma implementação que cria um único pod a executar um contentor com uma instância do WordPress. Este contentor lê a variável de ambiente WORDPRESS_DB_PASSWORD que contém o segredo cloudsql-db-credentials que criou.

Este ficheiro de manifesto também configura o contentor do WordPress para comunicar com o MySQL através do proxy do Cloud SQL em execução no contentor auxiliar. O valor do endereço do anfitrião é definido na variável de ambiente WORDPRESS_DB_HOST.

  1. Prepare o ficheiro substituindo a variável de ambiente INSTANCE_CONNECTION_NAME:

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. Implemente o wordpress_cloudsql.yaml ficheiro de manifesto:

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    A implementação deste ficheiro de manifesto demora alguns minutos enquanto um disco persistente está anexado ao nó de computação.

  3. Monitorize a implementação para ver a alteração do estado para running:

    kubectl get pod -l app=wordpress --watch
    

    Quando o resultado mostrar o estado Running, pode avançar para o passo seguinte.

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

Exponha o serviço WordPress

No passo anterior, implementou um contentor do WordPress, mas atualmente não é acessível a partir do exterior do cluster porque não tem um endereço IP externo. Pode expor a sua app WordPress ao tráfego da Internet através da criação e configuração de um serviço Kubernetes com um equilibrador de carga externo anexado. Para saber como expor apps através de serviços no GKE, consulte o guia de instruções.

  1. Crie um serviço de type:LoadBalancer:

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

    A criação de um balanceador de carga demora alguns minutos.

  2. Monitorize a implementação e aguarde até que o serviço tenha um endereço IP externo atribuído:

    kubectl get svc -l app=wordpress --watch
    
  3. Quando o resultado mostra um endereço IP externo, pode avançar para o passo seguinte. Tenha em atenção que o seu IP externo é diferente do exemplo seguinte.

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. Anote o campo de endereço EXTERNAL_IP para usar mais tarde.

Configurar o seu blogue do WordPress

Nesta secção, configura o seu blogue do WordPress.

  1. No navegador, aceda ao seguinte URL e substitua external-ip-address pelo endereço EXTERNAL_IP do serviço que expõe a sua instância do WordPress:

    http://external-ip-address
    
  2. Na página Instalação do WordPress, selecione um idioma e, de seguida, clique em Continuar.

  3. Preencha a página Informações necessárias e, de seguida, clique em Instalar WordPress.

  4. Clique em Log In.

  5. Introduza o nome de utilizador e a palavra-passe que criou anteriormente.

  6. Agora, tem um site de blogue. Para visitar o seu blogue, no navegador, aceda ao seguinte URL:

    http://external-ip-address