Configura il networking per un cluster di produzione di base

Questo tutorial è rivolto agli architetti cloud e agli amministratori delle operazioni interessati a eseguire il deployment di un'applicazione web in un cluster Google Kubernetes Engine (GKE) e a esporla con un bilanciatore del carico HTTPS.

Obiettivi

In questo tutorial imparerai a:

  • Creare un cluster GKE.
  • Crea un indirizzo IP globale e una zona Cloud DNS con Terraform.
  • Configura il bilanciamento del carico HTTPS.
  • Esegui il deployment di un'applicazione web di esempio.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

Configura il progetto

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  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

    • Devi essere proprietario di un nome di dominio. Il nome di dominio non deve contenere più di 63 caratteri. Puoi utilizzare Google Domains o un altro registrar.

    Configura l'ambiente

    In questo tutorial utilizzerai Cloud Shell per gestire le risorse ospitate su Google Cloud. Cloud Shell è preinstallato con il software necessario per questo tutorial, tra cui Terraform, kubectl e gcloud CLI.

    1. Imposta le variabili di ambiente:

      PROJECT_ID=$(gcloud config get-value project)
      gcloud config set project $PROJECT_ID
      gcloud config set compute/region us-central1
      
    2. Clona il repository di codice:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
      
    3. Passa alla directory di lavoro:

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

Crea un cluster GKE

Il seguente file Terraform crea un cluster 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"
}

Il seguente file Terraform crea un indirizzo IP globale e una zona 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. Inizializza Terraform:

    terraform init
    
  2. Visualizza le modifiche all'infrastruttura:

    terraform plan
    

    Quando richiesto, inserisci il tuo dominio, ad esempio my-domain.net.

  3. Applica la configurazione Terraform:

    terraform apply --auto-approve
    

    Quando richiesto, inserisci il tuo dominio, ad esempio my-domain.net.

    L'output è simile al seguente:

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

Crea un bilanciatore del carico delle applicazioni esterno

  1. Il seguente manifest descrive un ManagedCertificate, FrontendConfig, Deployment, Service e 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

    Sostituisci DOMAIN_NAME con il tuo nome di dominio, ad esempio my-domain.net.

    Questo manifest ha le seguenti proprietà:

    • networking.gke.io/managed-certificates: il nome del ManagedCertificate. Questa risorsa esegue il provisioning di un certificato SSL gestito da Google (classico).
    • networking.gke.io/v1beta1.FrontendConfig: il nome della risorsa FrontendConfig.
    • kubernetes.io/ingress.global-static-ip-name: il nome dell'indirizzo IP.
    • kubernetes.io/ingress.class: indica al controller GKE Ingress di creare un bilanciatore del carico delle applicazioni esterno.
  2. Applica il manifest al cluster:

    kubectl apply -f kubernetes-manifests.yaml
    
  3. Verifica che Ingress sia stato creato:

    kubectl describe ingress frontend
    

    L'output è simile al seguente:

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

    Il provisioning di Ingress potrebbe richiedere diversi minuti.

Test dell'applicazione

  1. Controlla lo stato del certificato SSL:

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

    Il provisioning del certificato SSL potrebbe richiedere fino a 30 minuti. Il seguente output indica che il certificato SSL è pronto:

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

    curl -Lv https://DOMAIN_NAME
    

    L'output è simile al seguente:

    *   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
    

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Elimina singole risorse

  1. Elimina le risorse Kubernetes:

    kubectl delete -f kubernetes-manifests.yaml
    
  2. Elimina le risorse Terraform:

    terraform destroy --auto-approve
    

    Quando richiesto, inserisci il tuo dominio, ad esempio my-domain.net.

Passaggi successivi