Este tutorial demonstra como criar uma aplicação Web de vários níveis usando o Google Kubernetes Engine (GKE).
Neste tutorial, vai fazer o seguinte:
- Configure uma aplicação Web com um endereço IP externo e um balanceador de carga.
- Crie um cluster Redis com um único mestre (líder) e várias réplicas (seguidores).
O exemplo descreve os seguintes conceitos do Kubernetes:
- Configuração declarativa com ficheiros de manifesto YAML
- Implementações, que são recursos do Kubernetes que determinam a configuração de um conjunto de pods replicados
- Serviços para criar balanceadores de carga internos e externos para um conjunto de pods
Objetivos
Para implementar e executar a aplicação no GKE:- Configure o líder do Redis
- Configure dois seguidores do Redis
- Configure a interface Web
- Visite o Website
- Aumente a escala da interface Web
O diagrama seguinte mostra uma vista geral da arquitetura de cluster que cria ao concluir estes objetivos:
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização prevista,
use a calculadora de preços.
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
O Cloud Shell está pré-instalado com o software
necessário para este tutorial, incluindo
kubectl e a
CLI gcloud. Se não usar o Cloud Shell, tem de
instalar a CLI gcloud.
- 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.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Create or select 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Create or select 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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
Defina variáveis de ambiente:
export PROJECT_ID=PROJECT_ID export COMPUTE_LOCATION=COMPUTE_LOCATIONSubstitua o seguinte:
PROJECT_ID: o seu Google Cloud ID do projetoCOMPUTE_LOCATION: a localização do Compute Engine, comous-central1.
Clone o repositório do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesAltere para o diretório de trabalho:
cd kubernetes-engine-samples/quickstarts/guestbook/O manifesto seguinte descreve uma implementação do Kubernetes que executa um pod líder do Redis de réplica única:
Aplique o manifesto ao cluster:
kubectl apply -f redis-leader-deployment.yamlVerifique se o pod líder do Redis está em execução:
kubectl get podsO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE redis-leader-343230949-qfvrq 1/1 Running 0 43sA alteração do
STATUSdePendingparaRunningpode demorar vários minutos.O manifesto seguinte descreve um serviço para o líder do Redis:
Este manifesto inclui um conjunto de seletores de etiquetas. Estas etiquetas correspondem ao conjunto de etiquetas implementadas no passo anterior. Por conseguinte, este serviço encaminha o tráfego de rede para o pod principal do Redis criado num passo anterior.
A secção
portsdo manifesto declara um único mapeamento de portas. O serviço encaminha o tráfego emport: 6379para otargetPort: 6379dos contentores que correspondem às etiquetasselectorespecificadas. OcontainerPortusado na implementação tem de corresponder aotargetPortpara encaminhar o tráfego para a implementação.Aplique o manifesto ao cluster:
kubectl apply -f redis-leader-service.yamlVerifique se o GKE criou o serviço:
kubectl get serviceO resultado é semelhante ao seguinte:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 42s redis-leader 10.51.242.233 <none> 6379/TCP 12sO manifesto seguinte descreve uma implementação para os pods seguidores do Redis:
Aplique o manifesto ao cluster:
kubectl apply -f redis-follower-deployment.yamlVerifique se as duas réplicas seguidoras do Redis estão em execução:
kubectl get podsO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE redis-follower-76588f55b7-bnsq6 1/1 Running 0 27s redis-follower-76588f55b7-qvtws 1/1 Running 0 27s redis-leader-dd446dc55-kl7nl 1/1 Running 0 119sA alteração do
STATUSdePendingparaRunningpode demorar vários minutos.O manifesto seguinte descreve um serviço para os seguidores do Redis:
Este manifesto especifica que o serviço é executado na porta 6379. O campo
selectordo serviço corresponde aos pods seguidores do Redis criados no passo anterior.Aplique o manifesto ao cluster:
kubectl apply -f redis-follower-service.yamlVerifique se o GKE criou o serviço:
kubectl get serviceO resultado é semelhante ao seguinte:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 1m redis-leader 10.51.242.233 <none> 6379/TCP 49s redis-follower 10.51.247.238 <none> 6379/TCP 3sO manifesto seguinte descreve uma implementação para o servidor Web:
O ficheiro de manifesto especifica a variável de ambiente
GET_HOSTS_FROM=dns. Quando fornece a configuração à aplicação Web de front-end, a aplicação de front-end usa os nomes de anfitriãoredis-followereredis-leaderpara fazer uma procura de DNS. A pesquisa de DNS encontra os endereços IP dos serviços que criou nos passos anteriores. Este conceito é denominado deteção de serviços DNS.Aplique o manifesto ao cluster:
kubectl apply -f frontend-deployment.yamlVerifique se as réplicas estão em execução:
kubectl get pods -l app=guestbook -l tier=frontendO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE frontend-7b78458576-8kp8s 1/1 Running 0 37s frontend-7b78458576-gg86q 1/1 Running 0 37s frontend-7b78458576-hz87g 1/1 Running 0 37sAumente o número de agrupamentos
frontend:kubectl scale deployment frontend --replicas=5O resultado é semelhante ao seguinte:
deployment.extensions/frontend scaledValide o número de réplicas em execução:
kubectl get podsO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE frontend-88237173-3s3sc 1/1 Running 0 1s frontend-88237173-twgvn 1/1 Running 0 1s frontend-88237173-5p257 1/1 Running 0 23m frontend-88237173-84036 1/1 Running 0 23m frontend-88237173-j3rvr 1/1 Running 0 23m redis-leader-343230949-qfvrq 1/1 Running 0 54m redis-follower-132015689-dp23k 1/1 Running 0 37m redis-follower-132015689-xq9v0 1/1 Running 0 37mPode reduzir o número de
frontendpods usando o mesmo comando, substituindo5por1.Elimine o
frontendserviço:kubectl delete service frontendElimine o cluster do GKE:
gcloud container clusters delete guestbook- Saiba como configurar o ajuste de escala automático de pods horizontal.
- Saiba como implementar o WordPress no GKE com o disco persistente e o Cloud SQL.
- Saiba como configurar nomes de domínios com endereços IP estáticos.
- Explore outros tutoriais do Kubernetes Engine.
Prepare o ambiente
Para configurar o seu ambiente, siga estes passos:
Crie um cluster do GKE
Crie um cluster do GKE Autopilot ou Standard:
Autopilot
gcloud container clusters create-auto guestbook \
--location=${COMPUTE_LOCATION} \
Padrão
gcloud container clusters create guestbook \
--location=${COMPUTE_LOCATION} \
--num-nodes=4
Estabeleça ligação ao cluster
Configure o kubectl para comunicar com o cluster:
gcloud container clusters get-credentials guestbook \
--location=${COMPUTE_LOCATION}
Configure o líder do Redis
A aplicação usa o Redis para armazenar os respetivos dados. A aplicação escreve os respetivos dados numa instância principal do Redis e lê dados de várias instâncias seguidoras do Redis.
Crie o serviço líder do Redis
A aplicação Web tem de comunicar com o líder do Redis para escrever os respetivos dados. Pode criar um serviço para encaminhar o tráfego para o pod principal do Redis.
Um serviço é uma abstração do Kubernetes que define um conjunto lógico de pods e uma política para permitir o acesso aos pods. Quando cria um serviço, descreve que pods encaminhar com base nas etiquetas dos pods.
Configure seguidores do Redis
Embora o líder do Redis seja um único pod, pode torná-lo altamente disponível e satisfazer as exigências de tráfego adicionando alguns seguidores ou réplicas do Redis.
Crie o serviço seguidor do Redis
A aplicação Web tem de comunicar com os seguidores do Redis para ler os dados. Para tornar os seguidores do Redis detetáveis, tem de configurar um serviço.
Configure a interface Web da aplicação
Agora que tem armazenamento Redis para a sua aplicação, inicie os servidores Web. Tal como os seguidores do Redis, o front-end é implementado através de uma implementação do Kubernetes.
A aplicação Web usa um front-end PHP, que está configurado para comunicar com os serviços de seguidor ou líder do Redis, consoante o pedido seja de leitura ou escrita. O front-end expõe uma interface JSON e disponibiliza uma IU baseada em jQuery Ajax.
Exponha o front-end num endereço IP externo
Com a configuração atual, os serviços redis-follower e redis-leader que criou nos passos anteriores só estão acessíveis no cluster do GKE, porque o tipo predefinido de um serviço é ClusterIP.
Um serviço ClusterIP fornece um único endereço IP para o conjunto de pods para o qual o serviço está a apontar. Este endereço IP só está acessível no cluster.
Para tornar o serviço Web de front-end acessível externamente, pode
especificar type: LoadBalancer ou type: NodePort
na configuração do serviço, consoante os seus requisitos.
O manifesto seguinte descreve um serviço do tipo LoadBalancer:
A declaração de porta na secção ports especifica port: 80 e targetPort não está especificado. Quando omite a propriedade targetPort, esta assume por predefinição o valor do campo port. Neste caso, este serviço encaminha o tráfego externo na porta 80 para a porta 80 dos contentores na implementação frontend.
Aplique o manifesto ao cluster:
kubectl apply -f frontend-service.yaml
Quando o serviço frontend é criado, o GKE cria um balanceador de carga e um endereço IP externo. Estes recursos estão sujeitos a faturação.
Visite o Website da aplicação
Para aceder ao Website da aplicação, obtenha o endereço IP externo do
frontend serviço:
kubectl get service frontend
O resultado é semelhante ao seguinte:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.51.242.136 109.197.92.229 80:32372/TCP 1m
A coluna EXTERNAL-IP pode mostrar <pending> enquanto o balanceador de carga está a ser criado. Pode demorar alguns minutos. Se vir erros como
Does not have minimum availability, aguarde alguns minutos. Este erro temporário ocorre porque o GKE recria os nós para fazer as alterações.
Copie o endereço IP e abra a página no navegador:

Experimente adicionar algumas entradas escrevendo uma mensagem e clicando em Enviar. A mensagem que escreveu aparece no frontend. Esta mensagem indica que os dados foram adicionados com êxito ao Redis através dos serviços que criou.
Aumente a escala da interface Web
Suponha que a sua aplicação está em execução há algum tempo e recebe um aumento repentino de publicidade. Decide que seria uma boa ideia adicionar mais servidores Web ao seu frontend. Pode fazê-lo aumentando o número de pods.
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
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Elimine os recursos individuais
Se usou um projeto existente e não o quer eliminar, elimine os recursos individuais.