Como implantar o WordPress no GKE com discos permanentes 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 Google Persistent Disk como armazenamento para 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. Com a 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. Para este tutorial, use a classe de armazenamento padrão para criar dinamicamente o Google Persistent Disk e criar 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 tutorial, usamos os seguintes componentes faturáveis do Google Cloud Platform:

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

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Antes de começar

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. No Console do GCP, na página do seletor de projetos, selecione ou crie um projeto do GCP.

    Acesse a página do seletor de projetos

  3. Verifique se o faturamento foi ativado no projeto do Google Cloud Platform. Saiba como confirmar que o faturamento está ativado para seu projeto.

  4. No Console do Google Cloud Platform, acesse Cloud Shell.

    Acessar o Cloud Shell

    Na parte inferior do Console do GCP, uma sessão do Cloud Shell é aberta e um prompt de linha de comando é exibido. O Cloud Shell é um ambiente shell com o SDK do Cloud pré-instalado, que inclui a ferramenta de linha de comando gcloud e os valores já definidos para seu projeto atual. A inicialização da sessão pode levar alguns segundos.

  5. 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 zona padrão para a ferramenta de linha de comando gcloud:

    gcloud config set compute/zone zone
    

    Substitua o seguinte:

  2. 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
    
  3. Altere para o diretório com o arquivo wordpress-persistent-disks:

    cd kubernetes-engine-samples/wordpress-persistent-disks
    
  4. 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.

Criar um cluster do GKE

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

  • No Cloud Shell, crie um cluster chamado persistent-disk-tutorial que tenha três nós:

    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
    

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

Para criar o armazenamento necessário para o WordPress, é preciso criar um PVC. 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.

    Quando esse processo for concluído, a saída será semelhante à seguinte:

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

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 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 aplicativo do 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 $DEVSHELL_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
    

Implante 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. Substitua as variáveis de ambiente para preparar o arquivo de implantação:

    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 seguinte status, será possível passar para a próxima etapa.

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

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. Crie e configure um balanceador de carga para expôr seu aplicativo do WordPress ao tráfego da Internet.

  • Crie um serviço de type:LoadBalancer: kubectl create -f $WORKING_DIR/wordpress-service.yaml Demora alguns minutos para criar um balanceador de carga.
  1. 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
    

    Quando a saída mostrar um endereço IP externo, será possível prosseguir para a próxima etapa:

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    

    Anote o endereço IP porque você precisará dele mais tarde.

Como configurar seu blog do WordPress

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

  1. No seu navegador, acesse o seguinte URL:

    http://external-ip-address
    

    Substitua o seguinte:

    • external-ip-address: o endereço IP externo do serviço que expõe sua instância do WordPress.
  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
    

Como fazer a limpeza

Para evitar que os recursos usados neste tutorial sejam cobrados na conta do Google Cloud Platform, faça o seguinte:

Excluir o projeto

  1. No Console do GCP, acesse a página Gerenciar recursos.

    Acessar a página Gerenciar recursos

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

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 $DEVSHELL_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