Implante seus sites do WordPress no GKE em minutos

Alvaro David
google-cloud-brasil
6 min readNov 29, 2022

O WordPress ainda é um dos mais populares criadores de sites do mundo, e com os serviços de hospedagem do Google Cloud, seu site do WordPress tem melhor desempenho, escalabilidade, maior segurança, mais controle e mais flexibilidade.

Como recomendação inicial, o Compute Engine é a opção de implantação mais simples e rápida do WordPress no Google Cloud, sendo ideal para tráfego baixo e médio com uma escalabilidade básica.

Porém, à medida que o site vai crescendo, começamos a ter tráfego intenso e vamos precisar de escalonamento automático. Para esse momento o Google Kubernetes Engine se torna a opção recomendada.

O WordPress é uma ferramenta que usa um banco de dados relacional para armazenar os dados e o sistema de arquivos local para armazenar recursos, como fotos em uma postagem. Em geral, o sistema de arquivos raiz de um container não é o adequado para armazenar dados permanentes, quando um dos nós falha, todos os dados salvos no sistema de arquivos raiz de um container são perdidos.

O uso de Persistent Volumes (PV) 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.

Criar um Cluster do GKE

No Google Cloud Console procuramos a seção de GKE, depois clique em CRIAR e selecionamos Standard:

Criar um cluster
Modos de clusters no GKE
Criar um cluster padrão

Uma vez criado, vamos a conectarnos ao cluster usando o Cloud Shell:

Cluster no GKE
Conexão ao Cluster

Dentro do repositório de samples no GitHub temos o arquivo de manifesto wordpress-volumeclaim.yaml para criar os Persistent Volume Claims (PVC) necessários para a implantação, para obter o arquivo executamos no Cloud Shell:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernete-engine-samples/wordpress-persistent-disks

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.

# Executamos
kubectl apply -f wordpress-volumeclaim.yaml

# Pode levar até dez segundos para provisionar o PV salvo pelo
# Persistent Disk e para vinculá-lo ao seu PVC.
# Para verificar o status
kubectl get persistentvolumeclaim

# Output esperado
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

Como o WordPress usa um banco de dados relacional vamos a usar o Cloud SQL, que fornece uma versão gerenciada do MySQL

Na console, na seção de Databases, clique em “SQL”, e depois em “Criar Instância”.”

Seção Cloud SQL

Selecionamos MySQL

Selecionar mecanismo de banco de dados

Crie uma instância chamada mysql-wordpress-instance

Criar uma instância do MySQL

Crie um banco de dados para que o WordPress armazene os dados:

Bancos de dados
Banco de dados wordpress

Crie um usuário do banco de dados chamado wordpress e uma senha para o WordPress autenticar a instância:

Usuários
Criar conta de usuário

Configurar uma conta de serviço e criar secrets

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. Na seção de IAM e ADMINISTRADOR:

Contas de Serviço
Conta de serviço cloudsql-proxy

Adicione o role cloudsql.client à sua conta de serviço:

E clique em CONCLUIR:

Criar conta de Serviço

No final, crie uma chave para a conta de serviço:

Criar uma nova chave
Chave privada do tipo JSON
Chave criada salva no computador

Fazer download de uma chave para uma conta de serviço só deve ser feita em casos específicos e tem que ser protegida de agentes externos, para maior detalhe visite Práticas recomendadas para trabalhar com contas de serviço.

Agora vamos a usar Secret do Kubernetes para proteger os dados sensíveis, no Cloud Shell executamos:

# Crie um secret do Kubernetes para as credenciais do MySQL
kubectl create secret generic cloudsql-db-credentials \
--from-file=username.txt \
--from-file=password.txt

Criamos os arquivos username.txt e password.txt com os dados para que os dados sensíveis não fiquem no histórico do terminal. A recomendação é utilizar o Secret Manager.

Crie um secret do Kubernetes para as credenciais da conta de serviço, como a chave está no seu computador, vamos fazer upload do arquivo para o Cloud Shell:

Upload arquivos para o Cloud Shell
Selecionar arquivo para fazer upload
# Criamos o secret
kubectl create secret generic cloudsql-instance-credentials \
--from-file key.json

Implante o WordPress

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, este post usa a imagem oficial do Docker para WordPress do Docker Hub. Esse contêiner lê a variável de ambiente WORDPRESS_DB_PASSWORD WORDPRESS_DB_PASSWORD que contém a chave secreta cloudsql-db-credentials que você criou.

Este arquivo de manifesto também configura o container do WordPress para se comunicar com o MySQL por meio do proxy do Cloud SQL. O valor do endereço do host é definido na variável de ambiente WORDPRESS_DB_HOST.

Como último passo, precisamos indicar o INSTANCE_CONNECTION_NAME dentro do arquivo de manifesto. Para obter esse dado vamos para a seção de Cloud SQL e procuramos pelo “Nome da conexão” e executamos:

Nome da conexão
# Adicione o nome da conexão da instância como uma variável de ambiente
export INSTANCE_CONNECTION_NAME=[YOUR-RPOJECT-ID]:southamerica-east1:mysql-wordpress-instance

# Prepare o arquivo de implantação substituindo a variável de ambiente INSTANCE_CONNECTION_NAME
cat wordpress_cloudsql.yaml.template | envsubst > \
wordpress_cloudsql.yaml

# Implante o arquivo de manifesto
kubectl create -f wordpress_cloudsql.yaml

# Verifique a implantação
kubectl get pod app=wordpress

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.

# Crie um serviço de type:LoadBalancer
kubectl create -f wordpress-service.yaml

# Aguarde até que o serviço tenha um endereço IP externo atribuído
kubectl get svc -l app=wordpress --watch

# Output esperado
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress 10.51.243.233 [CLUSTER-IP] 80:32418/TCP 1m

Finalmente com a IP externa pode concluir a instalação do WordPress:

Configuração do WordPress

Conclusão

Implantar o WordPress no Google Kubernetes Engine pode ser um primeiro passo para a modernização da infraestrutura, com os serviços gerenciados do Google Cloud esse passo é mais simples!.

Como seguintes passos podemos configurar um nome de domínio, configurar um balanceamento de carga HTTPS e integrar mais recursos disponíveis dentro do Google Cloud.

Em futuros posts iremos explorar mais recursos dentro do Google Kubernetes Engine.

--

--