Implantar o WordPress no GKE com Persistent Disk e o Cloud SQL


Este tutorial mostra como configurar uma implantação WordPress de réplica única no Google Kubernetes Engine (GKE) usando um banco de dados MySQL. Em vez de instalar o MySQL, use o Cloud SQL, que fornece uma versão gerenciada do MySQL. O WordPress usa PersistentVolumes (PV) e PersistentVolumeClaims (PVC) para armazenar dados.

Um PV é uma representação do volume de armazenamento no cluster que é provisionado por um administrador ou provisionado dinamicamente pelo Kubernetes para atender a uma solicitação feita em um PVC. Um PVC é uma solicitação de armazenamento de uma determinada classe de armazenamento feita por um usuário e que pode ser preenchida por um PV. PVs e PVCs são independentes dos ciclos de vida do pod e preservam os dados por meio de reinicialização, reprogramação e até mesmo exclusão de pods. O WordPress usa o Persistent Disk como armazenamento para os PVs.

Contexto

O WordPress é uma ferramenta de blog que usa um banco de dados relacional para armazenar os artigos do blog e seus objetos e metadados relacionados e o sistema de arquivos local para armazenar recursos, como fotos em uma postagem do blog. Este tutorial usa a imagem oficial do Docker para WordPress do Docker Hub.

Em geral, o sistema de arquivos raiz de um contêiner não é adequado para armazenar dados permanentes. Os contêineres executados no GKE normalmente são entidades descartáveis, e o gerenciador do cluster pode excluir, despejar ou reagendar qualquer contêiner que se torne indisponível devido a falhas de nós ou outras causas. Quando os nós falham, todos os dados salvos no sistema de arquivos raiz de um contêiner são perdidos.

O uso de PVs com backup por disco permanente permite que você armazene os dados da plataforma do WordPress fora dos contêineres. Dessa forma, mesmo se o contêiner for excluído, os dados permanecem. Devido à classe de armazenamento padrão, seu disco permanente e, consequentemente, seus dados não serão movidos com seu pod se ele for reprogramado para outro nó. Há maneiras diferentes de lidar com a movimentação de dados, mas isso está fora do escopo deste tutorial. Para mais informações, consulte Volumes permanentes com Persistent Disk.

O WordPress requer um PV para armazenar dados. Neste tutorial, você usa a classe de armazenamento padrão para criar dinamicamente um disco permanente e um PVC para a implantação.

Objetivos

  • Crie um cluster do GKE.
  • Crie um PV e um PVC com backup pelo Persistent Disk.
  • Crie uma instância do Cloud SQL para MySQL.
  • Implante o WordPress.
  • Configure seu blog do WordPress.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  7. No Cloud Shell, ative as APIs do GKE e de administrador do Cloud SQL:
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

Como configurar o ambiente

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

    gcloud config set compute/region region
    

    Substitua:

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

    export PROJECT_ID=project-id
    

  3. Faça o download dos arquivos de manifesto do app a partir do repositório do GitHub:

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

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

    WORKING_DIR=$(pwd)
    

    Neste tutorial, você cria objetos do Kubernetes usando arquivos de manifesto em formato YAML.

crie um cluster do GKE;

Crie um cluster do GKE para hospedar seu contêiner do aplicativo do WordPress.

  • No Cloud Shell, crie um cluster do GKE chamado persistent-disk-tutorial:

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

    Depois de criar o novo cluster, conecte-se a ele:

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

Como criar um PV e um PVC com backup pelo Persistent Disk

Crie um PVC como o armazenamento necessário para o WordPress. O GKE tem um recurso StorageClass padrão instalado que permite provisionar dinamicamente os PVs que passaram por backup pelo Persistent Disk. Use o arquivo wordpress-volumeclaim.yaml para criar os PVCs necessários para a implantação.

Este arquivo de manifesto descreve um PVC que solicita 200 GB de armazenamento. Um recurso StorageClass não foi definido no arquivo, então este PVC usa o parâmetro StorageClass para provisionar um PV que passou por backup pelo Persistent Disk.

  1. No Cloud Shell, implante o arquivo de manifesto:

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

    Pode levar até dez segundos para provisionar o PV salvo pelo Persistent Disk e para vinculá-lo ao seu PVC. É possível verificar o status com este comando:

    kubectl get persistentvolumeclaim
    

    A saída mostra um PersistentVolumeClaim com status Pending, semelhante a este:

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

    Esse PersistentVolumeClaim permanecerá no estado Pending até ser usado posteriormente neste tutorial.

Como criar uma instância do Cloud SQL para MySQL

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

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. Adicione o nome da conexã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 um banco de dados para que o WordPress armazene os dados:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. Crie um usuário do banco de dados chamado wordpress e uma senha para o WordPress autenticar a instância:

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

    Se você fechar a sessão do Cloud Shell, perderá a senha. Anote a senha porque você precisará dela mais tarde no tutorial.

Você concluiu a configuração do banco de dados do seu novo blog do WordPress.

Como implantar o WordPress

Antes de implantar o WordPress, é preciso criar uma conta de serviço. Crie um segredo do Kubernetes para manter as credenciais da conta de serviço e outro secret para manter as credenciais do banco de dados.

Configurar uma conta de serviço e criar secrets

  1. Para permitir que seu app WordPress acesse a instância do MySQL por meio 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 e-mail 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
    

    Esse comando faz o download de uma cópia do arquivo key.json.

  5. Crie um secret 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 secret do Kubernetes para as credenciais da conta de serviço:

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

Implantar o WordPress

A próxima etapa é implantar seu contêiner do WordPress no cluster do GKE.

O arquivo de manifesto wordpress_cloudsql.yaml descreve uma implantação que cria um único pod que executa um contêiner com uma instância do WordPress. Esse contêiner lê a variável de ambiente WORDPRESS_DB_PASSWORD que contém a chave secreta cloudsql-db-credentials que você criou.

Este arquivo de manifesto também configura o contêiner do WordPress para se comunicar com o MySQL por meio do proxy do Cloud SQL em execução no contêiner secundário. O valor do endereço do host é definido na variável de ambiente WORDPRESS_DB_HOST.

  1. Prepare o arquivo de implantação substituindo a variável de ambiente INSTANCE_CONNECTION_NAME:

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

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    Enquanto o Persistent Disk é anexado ao nó de computação, o arquivo do manifesto leva alguns minutos para ser implantado.

  3. Assista à implantação para ver a mudança de status para running:

    kubectl get pod -l app=wordpress --watch
    

    Quando a saída mostrar o status Running, avance para a próxima etapa.

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

Expor o serviço do WordPress

Na etapa anterior, você implantou um contêiner do WordPress, mas ele não pode ser acessado de fora do cluster porque não tem um endereço IP externo. Para expor seu app do WordPress ao tráfego da Internet, crie e configure um Serviço do Kubernetes com um balanceador de carga externo anexado. Para saber mais sobre como expor apps usando 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 leva alguns minutos.

  2. Assista à implantaçã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 a saída mostrar um endereço IP externo, será possível prosseguir para a próxima etapa: O IP externo é diferente do exemplo a seguir.

    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.

Como configurar seu blog do WordPress

Nessa seção, você configurou seu blog do WordPress.

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

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

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

  4. Clique em Log In.

  5. Digite o nome de usuário e a senha que você criou anteriormente.

  6. Agora você tem um blog. Para acessar seu blog, insira o seguinte URL no navegador:

    http://external-ip-address
    

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Exclua o projeto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Excluir recursos individuais

Se você usou um projeto existente e não quer excluí-lo, exclua os recursos individuais.

  1. Exclua o serviço:

    kubectl delete service wordpress
    

    Aguarde até que o balanceador de carga provisionado para o serviço wordpress seja excluído. O balanceador de carga é excluído de forma assíncrona em segundo plano

    Assista ao processo de exclusão:

    watch gcloud compute forwarding-rules list
    

    O balanceador de carga é excluído quando você vê a seguinte saída:

    Listed 0 items.
    
  2. Exclua a implantação:

    kubectl delete deployment wordpress
    
  3. Exclua o PVC para WordPress:

    kubectl delete pvc wordpress-volumeclaim
    

    Esse comando também exclui automaticamente o PV e o Persistent Disk.

  4. Exclua o cluster do GKE:

    gcloud container clusters delete $CLUSTER_NAME
    
  5. Exclua a instância do Cloud SQL:

    gcloud sql instances delete $INSTANCE_NAME
    
  6. Remova o papel da conta de serviço:

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. Exclua a conta de serviço:

    gcloud iam service-accounts delete $SA_EMAIL
    

A seguir