Configure a rede para um cluster de produção básico

Este tutorial destina-se a arquitetos da nuvem e administradores de operações interessados em implementar uma aplicação Web num cluster do Google Kubernetes Engine (GKE) e expô-la com um equilibrador de carga HTTPS.

Objetivos

Neste tutorial, vai aprender a:

  • Crie um cluster do GKE.
  • Crie um endereço IP global e uma zona do Cloud DNS com o Terraform.
  • Configure o balanceamento de carga HTTPS.
  • Implemente uma app Web de exemplo.

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.

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

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

Configure o seu projeto

  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, click Create project to begin creating a new Google Cloud project.

    Roles required to create a project

    To create a project, you need the Project Creator role (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. Enable the Google Kubernetes Engine, Cloud DNS APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Roles required to create a project

    To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Google Kubernetes Engine, Cloud DNS APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

    • Tem de ser proprietário de um nome de domínio. O nome do domínio não pode ter mais de 63 carateres. Pode usar o Google Domains ou outra entidade de registo.

    Configure o seu ambiente

    Neste tutorial, vai usar o Cloud Shell para gerir recursos alojados no Google Cloud. O Cloud Shell está pré-instalado com o software necessário para este tutorial, incluindo o Terraform, o kubectl e a CLI gcloud.

    1. Defina variáveis de ambiente:

      PROJECT_ID=$(gcloud config get-value project)
      gcloud config set project $PROJECT_ID
      gcloud config set compute/region us-central1
      
    2. Clone o repositório de código:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
      
    3. Altere para o diretório de trabalho:

      cd kubernetes-engine-samples/autopilot/networking-tutorial
      

    Crie um cluster do GKE

    O seguinte ficheiro Terraform cria um cluster do GKE:

    
    terraform {
      required_version = "~> 1.3"
    }
    
    provider "google" {}
    
    variable "region" {
      type        = string
      description = "Region where the cluster will be created."
      default     = "us-central1"
    }
    
    variable "cluster_name" {
      type        = string
      description = "Name of the cluster"
      default     = "networking-cluster"
    }
    
    resource "google_container_cluster" "default" {
      name             = var.cluster_name
      description      = "Cluster for sample web application"
      location         = var.region
      enable_autopilot = true
    
      ip_allocation_policy {}
    }
    
    output "region" {
      value       = var.region
      description = "Compute region"
    }
    
    output "cluster_name" {
      value       = google_container_cluster.default.name
      description = "Cluster name"
    }
    

    O seguinte ficheiro Terraform cria um endereço IP global e uma zona do Cloud DNS:

    
    terraform {
      required_version = "~> 1.3"
    }
    
    variable "base_domain" {
      type        = string
      description = "Your base domain"
    }
    
    variable "name" {
      type        = string
      description = "Name of resources"
      default     = "networking-tutorial"
    }
    
    data "google_client_config" "current" {}
    
    resource "google_compute_global_address" "default" {
      name = var.name
    }
    
    resource "google_dns_managed_zone" "default" {
      name        = var.name
      dns_name    = "${var.name}.${var.base_domain}."
      description = "DNS Zone for web application"
    }
    
    resource "google_dns_record_set" "a" {
      name         = google_dns_managed_zone.default.dns_name
      type         = "A"
      ttl          = 300
      managed_zone = google_dns_managed_zone.default.name
    
      rrdatas = [google_compute_global_address.default.address]
    }
    
    resource "google_dns_record_set" "cname" {
      name         = join(".", compact(["www", google_dns_record_set.a.name]))
      type         = "CNAME"
      ttl          = 300
      managed_zone = google_dns_managed_zone.default.name
    
      rrdatas = [google_dns_record_set.a.name]
    }
    
    output "dns_zone_name_servers" {
      value       = google_dns_managed_zone.default.name_servers
      description = "Write these virtual name servers in your base domain."
    }
    
    output "domain" {
      value = trim(google_dns_record_set.a.name, ".")
    }
    
    1. Inicialize o Terraform:

      terraform init
      
    2. Veja as alterações de infraestrutura:

      terraform plan
      

      Quando lhe for pedido, introduza o seu domínio, como my-domain.net.

    3. Aplique a configuração do Terraform:

      terraform apply --auto-approve
      

      Quando lhe for pedido, introduza o seu domínio, como my-domain.net.

      O resultado é semelhante ao seguinte:

      Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
      
      Outputs:
      
      cluster_name = "networking-cluster"
      region = "us-central1"
      

    Crie um balanceador de carga de aplicações externo

    1. O manifesto seguinte descreve um ManagedCertificate, um FrontendConfig, um Deployment, um Service e um Ingress:

      ---
      apiVersion: networking.gke.io/v1
      kind: ManagedCertificate
      metadata:
        name: networking-managed-cert
      spec:
        domains:
          - DOMAIN_NAME
          - www.DOMAIN_NAME
      ---
      apiVersion: networking.gke.io/v1beta1
      kind: FrontendConfig
      metadata:
        name: networking-fc
      spec:
        redirectToHttps:
          enabled: true
          responseCodeName: MOVED_PERMANENTLY_DEFAULT
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: frontend
      spec:
        selector:
          matchLabels:
            app: frontend
        replicas: 2
        template:
          metadata:
            labels:
              app: frontend
          spec:
            containers:
            - name: echo-amd64
              image: us-docker.pkg.dev/google-samples/containers/gke/hello-app-cdn:1.0
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: frontend
      spec:
        type: LoadBalancer
        selector:
          app: frontend
        ports:
        - name: http
          port: 80
          targetPort: 8080
      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: frontend
        annotations:
          networking.gke.io/managed-certificates: networking-managed-cert
          networking.gke.io/v1beta1.FrontendConfig: networking-fc
          kubernetes.io/ingress.global-static-ip-name: networking-tutorial
          kubernetes.io/ingress.class: gce
        labels:
          app: frontend
      spec:
        defaultBackend:
          service:
            name: frontend
            port:
              number: 80

      Substitua DOMAIN_NAME pelo nome do seu domínio, como my-domain.net.

      Este manifesto tem as seguintes propriedades:

      • networking.gke.io/managed-certificates: o nome do ManagedCertificate. Este recurso aprovisiona um certificado SSL gerido pela Google (clássico).
      • networking.gke.io/v1beta1.FrontendConfig: o nome do recurso FrontendConfig.
      • kubernetes.io/ingress.global-static-ip-name: o nome do endereço IP.
      • kubernetes.io/ingress.class: indica ao controlador do GKE Ingress que crie um balanceador de carga de aplicações externo.
    2. Aplique o manifesto ao cluster:

      kubectl apply -f kubernetes-manifests.yaml
      
    3. Valide se o Ingress foi criado:

      kubectl describe ingress frontend
      

      O resultado é semelhante ao seguinte:

      ...
        Events:
          Type    Reason  Age   From                     Message
          ----    ------  ----  ----                     -------
          Normal  ADD     2m    loadbalancer-controller  default/frontend
          Normal  CREATE  1m    loadbalancer-controller  ip: 203.0.113.2
      ...
      

      O aprovisionamento do Ingress pode demorar vários minutos.

    Aplicação de teste

    1. Verifique o estado do certificado SSL:

      kubectl get managedcertificates.networking.gke.io networking-managed-cert
      

      O certificado SSL pode demorar até 30 minutos a ser aprovisionado. O resultado seguinte indica que o certificado SSL está pronto:

      NAME                      AGE   STATUS
      networking-managed-cert   28m   Active
      
    2. Executar um comando curl:

      curl -Lv https://DOMAIN_NAME
      

      O resultado é semelhante ao seguinte:

      *   Trying 34.160.115.33:443...
      * Connected to DOMAIN_NAME (34.160.115.33) port 443 (#0)
      ...
      * TLSv1.3 (IN), TLS handshake, Certificate (11):
      ...
      * Server certificate:
      *  subject: CN=DOMAIN_NAME
      ...
      > Host: DOMAIN_NAME
      

    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 recursos individuais

    1. Elimine os recursos do Kubernetes:

      kubectl delete -f kubernetes-manifests.yaml
      
    2. Elimine os recursos do Terraform:

      terraform destroy --auto-approve
      

      Quando lhe for pedido, introduza o seu domínio, como my-domain.net.

    O que se segue?