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 de 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.

Objetivos

  • Crie um cluster do GKE.
  • Crie um PV e um PVC suportados por um disco persistente.
  • Crie uma instância do Cloud SQL para MySQL.
  • Implemente o WordPress.
  • Configure o seu blogue do WordPress.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify 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 GKE e Cloud SQL Admin:
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

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
    

Limpar

Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

Elimine 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.

Elimine os recursos individuais

Se usou um projeto existente e não o quer eliminar, elimine os recursos individuais.

  1. Elimine o serviço:

    kubectl delete service wordpress
    

    Aguarde que o balanceador de carga aprovisionado para o serviço wordpress seja eliminado. O balanceador de carga é eliminado de forma assíncrona em segundo plano.

    Veja o processo de eliminação:

    watch gcloud compute forwarding-rules list
    

    O balanceador de carga é eliminado quando vê o seguinte resultado:

    Listed 0 items.
    
  2. Elimine a implementação:

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

    kubectl delete pvc wordpress-volumeclaim
    

    Este comando também elimina automaticamente o PV e o disco persistente.

  4. Elimine o cluster do GKE:

    gcloud container clusters delete $CLUSTER_NAME --location=$REGION
    
  5. Elimine a instância do Cloud SQL:

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

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

    gcloud iam service-accounts delete $SA_EMAIL
    

O que se segue?