Configura las Herramientas de redes para un clúster de producción básico


Este instructivo está dirigido a los arquitectos de nube y administradores de operaciones interesados en implementar una aplicación web en un clúster de Google Kubernetes Engine (GKE) y exponerla con un balanceador de cargas HTTPS.

Objetivos

En este instructivo aprenderás realizar las siguientes tareas:

  • Crear un clúster de GKE.
  • Crear una dirección IP global y una zona de Cloud DNS con Terraform.
  • Configurar el balanceo de cargas HTTPS.
  • Implementar una aplicación web de muestra.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

Configurar tu proyecto

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

    Go to project selector

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  3. Habilita las API de Google Kubernetes Engine, Cloud DNS.

    Habilita las API

  • Debes tener un nombre de dominio. El nombre de dominio no debe tener más de 63 caracteres. Puedes usar Google Domains o algún otro registrador.

Configura tu entorno

En este instructivo, usarás Cloud Shell para administrar recursos alojados en Google Cloud. Cloud Shell tiene preinstalado el software que necesitas para este instructivo, incluidos Docker, kubectl y la CLI de gcloud.

  1. Establece las variables de entorno:

    PROJECT_ID=$(gcloud config get-value project)
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region us-central1
    
  2. Clona el repositorio de código:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. Cambia al directorio de trabajo:

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

Crear un clúster de GKE

El siguiente archivo de Terraform crea un clúster de 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"
}

El siguiente archivo de Terraform crea una dirección IP global y una zona de 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. Inicializa Terraform mediante este comando:

    terraform init
    
  2. Observa los cambios en la infraestructura:

    terraform plan
    

    Cuando se te solicite, ingresa tu dominio, como my-domain.net.

  3. Aplica la configuración de Terraform:

    terraform apply --auto-approve
    

    Cuando se te solicite, ingresa tu dominio, como my-domain.net.

    El resultado es similar a este:

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

Crea un balanceador de cargas de aplicaciones externo

  1. En el siguiente manifiesto, se describe un ManagedCertificate, FrontendConfig, Deployment, Service y también 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

    Reemplaza DOMAIN_NAME por tu nombre de dominio, como my-domain.net.

    Este manifiesto tiene las siguientes propiedades:

    • networking.gke.io/managed-certificates: El nombre del ManagedCertificate.
    • networking.gke.io/v1beta1.FrontendConfig: El nombre del recurso FrontendConfig.
    • kubernetes.io/ingress.global-static-ip-name: El nombre de la dirección IP.
    • kubernetes.io/ingress.class: Indica al controlador de Ingress de GKE que crea un balanceador de cargas de aplicaciones externo.
  2. Aplica el manifiesto al clúster:

    kubectl apply -f kubernetes-manifests.yaml
    
  3. Verifica si se creó el Ingress:

    kubectl describe ingress frontend
    

    El resultado es similar a este:

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

    El Ingress puede tardar varios minutos en aprovisionarse.

Probar la aplicación

  1. Verifica el estado del certificado SSL:

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

    El certificado SSL puede tardar hasta 30 minutos en aprovisionarse. El siguiente resultado indica que el certificado SSL está listo:

    NAME                      AGE   STATUS
    networking-managed-cert   28m   Active
    
  2. Ejecuta un comando curl:

    curl -Lv https://DOMAIN_NAME
    

    El resultado es similar a este:

    *   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
    

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

    Borra un proyecto de Google Cloud:

    gcloud projects delete PROJECT_ID

Borra los recursos individuales

  1. Borra los recursos de Kubernetes:

    kubectl delete -f kubernetes-manifests.yaml
    
  2. Borra los recursos de Terraform:

    terraform destroy --auto-approve
    

    Cuando se te solicite, ingresa tu dominio, como my-domain.net.

¿Qué sigue?