Este tutorial mostra como empacotar um aplicativo da Web em uma imagem de contêiner do Docker e executar essa imagem de contêiner em um cluster do Google Kubernetes Engine (GKE). Em seguida, você implanta o aplicativo da Web como um conjunto de réplicas com balanceamento de carga que pode ser dimensionado de acordo com as necessidades de seus usuários ## Objetivos - Empacote um aplicativo da Web de amostra em uma imagem do Docker - Carregue a imagem do Docker no Artifact Registry - Criar um cluster do GKE - Implante o aplicativo de amostra no cluster - Gerencie o escalonamento automático para a implantação - Exponha o aplicativo de amostra à Internet - Implantar uma nova versão do aplicativo de amostra ## Custos Este tutorial usa os seguintes componentes faturáveis ​​do Google Cloud: Para gerar uma estimativa de custo com base no uso projetado, use a calculadora de preços Ao concluir este tutorial, você poderá evitar a cobrança contínua excluindo os recursos que criou. Para obter mais informações, consulte Limpar ## Antes de começar Siga as etapas a seguir para ativar a API do Kubernetes Engine: - Faça login na sua conta do Google Cloud. Se você é novo no Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em cenários do mundo real. Novos clientes também recebem US$ 300 em créditos gratuitos para executar, testar e implantar cargas de trabalho - No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud - Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto - Ative as APIs do Artifact Registry e do Google Kubernetes Engine - No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud - Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto - Ative as APIs do Artifact Registry e do Google Kubernetes Engine Opção A: usar o Cloud Shell Você pode seguir este tutorial usando o Cloud Shell, que vem pré-instalado com o gcloud, estivador, e ferramentas de linha de comando kubectl usadas neste tutorial. Se você usa o Cloud Shell, não precisa instalá-los ferramentas de linha de comando em sua estação de trabalho Para usar o Cloud Shell: - Acesse o console do Google Cloud Clique no Ative o Cloud Shell botão na parte superior da janela do console do Google Cloud Uma sessão do Cloud Shell é aberta dentro de um novo quadro na parte inferior do console do Google Cloud e exibe um prompt de linha de comando Opção B: usar ferramentas de linha de comando localmente Se preferir seguir este tutorial em sua estação de trabalho, siga estas etapas para instalar as ferramentas necessárias Instale a CLI do Google Cloud Usando a CLI gcloud, instale a ferramenta de linha de comando Kubernetes kubectlis usado para se comunicar com o Kubernetes, que é o sistema de orquestração de clusters do GKE: componentes gcloud instalar kubectl Instale o Docker Community Edition (CE) em sua estação de trabalho. Você usa isso para criar uma imagem de contêiner para o aplicativo Instale a ferramenta de controle de origem Git para buscar o aplicativo de amostra do GitHub ## Crie um repositório Neste tutorial, você armazena uma imagem no Artifact Registry e a implanta do registro. Artifact Registry é o registro de contêiner recomendado em Google Cloud. Para este início rápido, você criará um repositório chamado olá-repo Colocou o Variável PROJECT_IDenvironment para o ID do projeto do Google Cloud ( ). Você usará essa variável de ambiente ao criar a imagem do contêiner e enviá-la ao seu repositório PROJECT_ID exportar PROJECT_ID= PROJECT_ID Confirme se o A variável PROJECT_IDenvironment tem o valor correto: echo $PROJECT_ID Defina o ID do projeto para a CLI do Google Cloud: gcloud config set projeto $PROJECT_ID Saída: Propriedade atualizada [núcleo/projeto] Crie o hello-reporepository com o seguinte comando: repositórios de artefatos gcloud criar hello-repo \ --repository-format=docker \ --location= REGIÃO\ --description="Repositório do Docker"Substituir com uma região para o repositório, como REGIÃO us-west1. Para ver uma lista de locais disponíveis, execute o comando: lista de locais de artefatos gcloud ## Criando a imagem do contêiner Neste tutorial, você implanta um exemplo de web aplicativo chamado hello-app, um servidor web escrito em Go que responde a todas as requisições com a mensagem Olá Mundo! na porta 8080 O GKE aceita imagens do Docker como o formato de implantação do aplicativo Antes de implantar hello-app para GKE, você deve empacotar a código-fonte hello-app como uma imagem do Docker Para criar uma imagem do Docker, você precisa do código-fonte e de um Dockerfile. Um Dockerfile contém instruções sobre como a imagem é construída Faça o download do código hello-appsource e Dockerfile executando os seguintes comandos: git clone httpsgithub.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/hello-app Crie e marque a imagem do Docker para Olá-aplicativo: construção do docker -t REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Este comando instrui o Docker a construir a imagem usando o Dockerfile no diretório atual, salve-o em seu ambiente local e marque-o com um nome, como us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1. A imagem é enviada para o Artifact Registry na próxima seção - O A variável PROJECT_ID associa a imagem do contêiner ao hello-reporepository em seu projeto do Google Cloud - O us-west1-docker.pkg.devprefix refere-se ao Artifact Registry, host regional para seu repositório - O Execute o docker imagescommand para verificar se a compilação foi bem-sucedida: imagens do docker Saída: ID DA IMAGEM DA TAG DO REPOSITÓRIO TAMANHO CRIADO us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 segundos atrás 54 MB ## Executando seu contêiner localmente (opcional) Teste sua imagem de contêiner usando seu mecanismo Docker local: docker run --rm -p 8080:8080 REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Se você estiver usando o Cloud Shell, clique no Botão de visualização da Web e, em seguida, selecione o Número da porta 8080. O GKE abre o URL de visualização em seu serviço de proxy em uma nova janela do navegador Caso contrário, abra uma nova janela de terminal (ou uma guia do Cloud Shell) e execute o seguinte comando para verificar se o contêiner funciona e responde às solicitações com "Hello, World curl httplocalhost:8080 Depois de ver uma resposta bem-sucedida, você pode fechar o contêiner pressionando Ctrl+Cna guia onde o o comando docker run está em execução ## Enviando a imagem do Docker para o Artifact Registry Você deve fazer upload da imagem do contêiner para um registro para que o cluster do GKE possa fazer o download e executar a imagem do contêiner. Neste tutorial, você armazenará seu contêiner no Artifact Registry Configure a ferramenta de linha de comando do Docker para autenticar no Artifact Registry: gcloud auth configure-docker REGION-docker.pkg.dev Envie a imagem do Docker que você acabou de criar para o repositório: docker push REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 ## Como criar um cluster do GKE Agora que a imagem do Docker está armazenada no Artifact Registry, crie um GKE agrupar para correr olá-app. Um cluster do GKE consiste em um pool de instâncias de VM do Compute Engine executando o Kubernetes, a orquestração de cluster de código aberto sistema que alimenta o GKE Nuvem Shell Defina sua zona ou região do Compute Engine. Dependendo do modo de operação que você escolher usar no GKE, especifique uma zona ou região padrão. Se você usar o modo Standard, seu cluster será zonal (para este tutorial), portanto, defina sua zona de computação padrão. Se você usar o modo Autopilot, seu cluster é regional, então defina sua região de computação padrão. Escolha uma zona ou região mais próxima do repositório do Artifact Registry que você criou Cluster padrão, como us-west1-a: gcloud config set computação/zona Cluster de piloto automático COMPUTE_ZONE, como us-west1: gcloud config set computação/região COMPUTE_REGION - Crie um cluster chamado Olá-cluster: Cluster padrão: gcloud container clusters criam hello-cluster cluster de piloto automático: gcloud container clusters create-auto hello-cluster A criação e a verificação de integridade do cluster do GKE levam alguns minutos - Após a conclusão do comando, execute o seguinte comando para ver os três nós do cluster: kubectl obter nós Saída: NOME STATUS FUNÇÕES IDADE VERSÃO gke-hello-cluster-default-pool-229c0700-cbtd Pronto 92s v1.18.12-gke.1210 gke-hello-cluster-default-pool-229c0700-fc5j Ready 91s v1.18.12-gke.1210 gke-hello-cluster-default-pool-229c0700-n9l7 Ready 92s v1.18.12-gke.1210 Console Go to the Google Kubernetes Enginepage in the Google Cloud console Go to Google Kubernetes Engine Click Create Choose Standard or Autopilot mode and click Configure In the Namefield, enter the name hello-cluster Select a zone or region: Standardcluster: Under Location type, select Zonaland then select a Compute Engine zone from the Zonedrop-down list, such as us-west1-a Autopilotcluster: Select a Compute Engine region from the Regiondrop-down list, such as us-west1 - Click Create. This creates a GKE cluster Wait for the cluster to be created. When the cluster is ready, a green check mark appears next to the cluster name ## Deploying the sample app to GKE You are now ready to deploy the Docker image you built to your GKE cluster Kubernetes represents applications as Pods, which are scalable units holding one or more containers. The Pod is the smallest deployable unit in Kubernetes. Usually, you deploy Pods as a set of replicas that can be scaled and distributed together across your cluster. One way to deploy a set of replicas is through a Kubernetes Deployment In this section, you create a Kubernetes Deployment to run hello-app on your cluster. This Deployment has replicas (Pods). One Deployment Pod contains only one container: the hello-app Docker image You also create a HorizontalPodAutoscaler resource that scales the number of Pods from 3 to a number between 1 and 5, based on CPU load Cloud Shell Ensure that you are connected to your GKE cluster gcloud container clusters get-credentials hello-cluster --zone COMPUTE_ZONE Create a Kubernetes Deployment for your hello-appDocker image kubectl create deployment hello-app --image= REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Set the baseline number of Deployment replicas to 3 kubectl scale deployment hello-app --replicas=3 Create a HorizontalPodAutoscalerresource for your Deployment kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5 To see the Pods created, run the following command: kubectl get pods Output: NAME READY STATUS RESTARTS AGE hello-app-784d7569bc-hgmpx 1/1 Running 0 10s hello-app-784d7569bc-jfkz5 1/1 Running 0 10s hello-app-784d7569bc-mnrrl 1/1 Running 0 15s Console Go to the Workloadspage in the Google Cloud console Click Deploy In the Specify containersection, select Existing container image In the Image pathfield, click Select In the Select container imagepane, select the hello-appimage you pushed to Artifact Registry and click Select In the Containersection, click Done, then click Continue In the Configurationsection, under Labels, enter appfor Keyand hello-appfor Value Under Configuration YAML, click View YAML. This opens a YAML configuration file representing the two Kubernetes API resources about to be deployed into your cluster: one Deployment, and one HorizontalPodAutoscalerfor that Deployment Click Close, then click Deploy When the Deployment Pods are ready, the Deployment detailspage opens Under Managed pods, note the three running Pods for the hello-appDeployment ## Exposing the sample app to the internet While Pods do have individually-assigned IP addresses, those IPs can only be reached from inside your cluster. Also, GKE Pods are designed to be ephemeral, starting or stopping based on scaling needs. And when a Pod crashes due to an error, GKE automatically redeploys that Pod, assigning a new Pod IP address each time What this means is that for any Deployment, the set of IP addresses corresponding to the active set of Pods is dynamic. We need a way to 1) group Pods together into one static hostname, and 2) expose a group of Pods outside the cluster, to the internet Kubernetes Services solve for both of these problems Services group Pods into one static IP address, reachable from any Pod inside the cluster GKE also assigns a DNS hostname to that static IP. For example, hello-app.default.svc.cluster.local The default Service type in GKE is called ClusterIP, where the Service gets an IP address reachable only from inside the cluster To expose a Kubernetes Service outside the cluster, create a Service of type LoadBalancer This type of Service spawns an External Load Balancer IP for a set of Pods, reachable through the internet In this section, you expose the hello-app Deployment to the internet using a Service of type LoadBalancer Cloud Shell Use the kubectl exposecommand to generate a Kubernetes Service for the hello-appdeployment: kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080 Here, the --portflag specifies the port number configured on the Load Balancer, and the --target-portflag specifies the port number that the hello-appcontainer is listening on Run the following command to get the Service details for hello-app-service: kubectl get service Output: NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10s Copy the EXTERNAL_IPaddress to the clipboard (for instance: 203.0.113.0) Console Go to the Workloadspage in the Google Cloud console Click hello-app From the Deployment details page, click Actions > Expose In the Exposedialog, set the Target portto 8080. This is the port the hello-appcontainer listens on From the Service typedrop-down list, select Load balancer Click Exposeto create a Kubernetes Service for hello-app When the Load Balancer is ready, the Service detailspage opens Scroll down to the External endpointsfield, and copy the IP address Now that the hello-app Pods are exposed to the internet through a Kubernetes Service, you can open a new browser tab, and navigate to the Service IP address you copied to the clipboard. A Hello, World! message appears, along with a Hostname field. The Hostname corresponds to one of the three hello-app Pods serving your HTTP request to your browser ## Deploying a new version of the sample app In this section, you upgrade hello-app to a new version by building and deploying a new Docker image to your GKE cluster GKE's rolling update feature lets you update your Deployments without downtime. During a rolling update, your GKE cluster incrementally replaces the existing hello-app Pods with Pods containing the Docker image for the new version During the update, your load balancer service routes traffic only into available Pods Return to Cloud Shell, where you have cloned the hello app source code and Dockerfile. Update the function hello()in the main.gofile to report the new version 2.0.0 Build and tag a new hello-appDocker image docker build -t REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Push the image to Artifact Registry docker push REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Now you're ready to update your hello-app Kubernetes Deployment to use a new Docker image Cloud Shell Apply a rolling update to the existing hello-appDeployment with an image update using the kubectl set imagecommand: kubectl set image deployment/hello-app hello-app= REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Watch the running Pods running the v1image stop, and new Pods running the v2image start watch kubectl get pods Output: NAME READY STATUS RESTARTS AGE hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s hello-app-89dc45f48-scm66 1/1 Running 0 2m40s In a separate tab, navigate again to the hello-app-serviceExternal IP. You should now see the Versionset to 2.0.0 Console Go to the Workloadspage in the Google Cloud console Click hello-app On the Deployment detailspage, click Actions > Rolling update In the Rolling updatedialog, set the Image of hello-appfield to REGION-docker.pkg.dev/ PROJECT_ID/hello-repo/hello-app:v2 Click Update On the Deployment detailspage, inspect the Active Revisionssection. You should now see two Revisions, 1 and 2. Revision 1 corresponds to the initial Deployment you created earlier. Revision 2 is the rolling update you just started After a few moments, refresh the page. Under Managed pods, all of the replicas of hello-appnow correspond to Revision 2 In a separate tab, navigate again to the Service IP address you copied. The Versionshould be 2.0.0 ## Clean up To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, either delete the project that contains the resources, or keep the project and delete the individual resources Delete the Service:This deallocates the Cloud Load Balancer created for your Service: kubectl delete service hello-app-service Delete the cluster:This deletes the resources that make up the cluster, such as the compute instances, disks, and network resources: gcloud container clusters delete hello-cluster --zone COMPUTE_ZONE Delete your container images:This deletes the Docker images you pushed to Artifact Registry gcloud artifacts docker images delete REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 \ --delete-tags --quiet gcloud artifacts docker images delete \ REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 \ --delete-tags --quiet ## What's next Learn about Pricing for GKE and use the Pricing Calculator to estimate costs Read the Load Balancers tutorial, which demonstrates advanced load balancing configurations for web applications Configure a static IP and domain name for your application Explore other Kubernetes Engine tutorials Explore reference architectures, diagrams, tutorials, and best practices about Google Cloud. Take a look at our Cloud Architecture Center ## Try it for yourself If you're new to Google Cloud, create an account to evaluate how GKE performs in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.Try GKE free