Public NAT mit GKE verwenden

Auf dieser Seite erfahren Sie, wie Sie eine Public NAT-Beispielkonfiguration mit der Google Kubernetes Engine (GKE) konfigurieren. Lesen Sie vor der Einrichtung von Public NAT die Public NAT-Übersicht.

Vorbereitung

Führen Sie die folgenden Schritte aus, bevor Sie Public NAT einrichten.

IAM-Berechtigungen abrufen

Die Rolle roles/compute.networkAdmin berechtigt Sie, ein NAT-Gateway in Cloud Router zu erstellen, NAT-IP-Adressen zu reservieren und zuzuweisen sowie Subnetzwerke (Subnetze) anzugeben, deren Traffic eine Netzwerkadressübersetzung vom NAT-Gateway verwenden sollte.

Google Cloudeinrichten

Zuvor sollten Sie jedoch die folgenden Elemente in Google Cloudeinrichten.

  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, select or create a Google Cloud project.

    Go to project selector

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

  4. Install the Google Cloud CLI.

  5. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Install the Google Cloud CLI.

  10. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  11. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  12. GKE-Beispiel einrichten

    Verwenden Sie dieses Beispiel, wenn Sie eine einfache Public NAT-Konfiguration sehen möchten, die mit GKE funktioniert.

    Schritt 1: VPC-Netzwerk und Subnetz erstellen

    Wenn Sie bereits ein Netzwerk und ein Subnetz haben, können Sie diesen Schritt überspringen.

    Console

    1. Rufen Sie in der Google Cloud Console die Seite VPC-Netzwerke auf.

      Zur VPC-Netzwerkseite

    2. Klicken Sie auf VPC-Netzwerk erstellen.

    3. Geben Sie als Name custom-network1 ein.

    4. Wählen Sie unter Subnetze für Modus für Subnetzerstellung die Option Benutzerdefiniert aus.

    5. Geben Sie unter Neues Subnetz für Name den Wert subnet-us-east-192 ein.

    6. Wählen Sie unter Region die Option us-east4 aus.

    7. Geben Sie für IP-Adressbereich den Wert 192.168.1.0/24 ein.

    8. Klicken Sie auf Fertig und dann auf Erstellen.

    gcloud

    1. Erstellen Sie in Ihrem Projekt ein neues VPC-Netzwerk (Virtual Private Cloud) im benutzerdefinierten Modus:

      gcloud compute networks create custom-network1 \
          --subnet-mode custom

      Ausgabe:

      NAME             MODE     IPV4_RANGE   GATEWAY_IPV4
      custom-network1  custom

    2. Geben Sie das Subnetzpräfix für die erste Region an. In diesem Beispiel weisen Sie 192.168.1.0/24 der Region us-east4 zu.

      gcloud compute networks subnets create subnet-us-east-192 \
         --network custom-network1 \
         --region us-east4 \
         --range 192.168.1.0/24

      Ausgabe:

      NAME                REGION    NETWORK          RANGE
      subnet-us-east-192  us-east4  custom-network1  192.168.1.0/24

    Terraform

    Sie können ein Terraform-Modul verwenden, um ein benutzerdefiniertes VPC-Netzwerk und ein Subnetz zu erstellen.

    module "test-vpc-module" {
      source       = "terraform-google-modules/network/google"
      version      = "~> 10.0"
      project_id   = var.project_id # Replace this with your project ID in quotes
      network_name = "custom-network1"
      mtu          = 1460
    
      subnets = [
        {
          subnet_name   = "subnet-us-east-192"
          subnet_ip     = "192.168.1.0/24"
          subnet_region = "us-east4"
        }
      ]
    }

    Schritt 2: Privaten Cluster erstellen

    Console

    1. Rufen Sie in der Google Cloud Console die Seite Kubernetes-Cluster auf.

      Zur Seite „Kubernetes-Cluster“

    2. Klicken Sie auf Cluster erstellen.

    3. Geben Sie für Name nat-test-cluster ein.

    4. Legen Sie für Standorttyp den Wert Zonal fest.

    5. Legen Sie für Zone den Wert us-east4‑c fest.

    6. Klicken Sie im Navigationsbereich auf Netzwerk.

    7. Wählen Sie Privater Cluster aus.

    8. Entfernen Sie die Markierung aus dem Kästchen Mit externer IP-Adresse auf Steuerungsebene zugreifen.

    9. Geben Sie für IP-Bereich der Steuerungsebene den Wert 172.16.0.0/28 ein.

    10. Legen Sie für Netzwerk den Wert custom-network1 fest.

    11. Klicken Sie zum Erstellen und Starten des Clusters auf Erstellen.

    gcloud

    gcloud container clusters create "nat-test-cluster" \
        --zone "us-east4-c" \
        --username "admin" \
        --cluster-version "latest" \
        --machine-type "e2-medium" \
        --disk-type "pd-standard" \
        --disk-size "100" \
        --scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
        --num-nodes "3" \
        --enable-private-nodes \
        --enable-private-endpoint \
        --master-ipv4-cidr "172.16.0.0/28" \
        --enable-ip-alias \
        --network "projects/PROJECT_ID/global/networks/custom-network1" \
        --subnetwork "projects/PROJECT_ID/regions/us-east4/subnetworks/subnet-us-east-192" \
        --max-nodes-per-pool "110" \
        --enable-master-authorized-networks \
        --addons HorizontalPodAutoscaling,HttpLoadBalancing \
        --enable-autoupgrade \
        --enable-autorepair
    

    Terraform

    Sie können eine Terraform-Ressource verwenden, um einen privaten Cluster zu erstellen.

    resource "google_container_cluster" "primary" {
      project            = var.project_id
      name               = "nat-test-cluster"
      location           = "us-east4-c"
      initial_node_count = 3
      network            = var.network # Replace with a reference or self link to your network, in quotes
      subnetwork         = var.subnet  # Replace with a reference or self link to your subnet, in quotes
      private_cluster_config {
        master_ipv4_cidr_block  = "172.16.0.0/28"
        enable_private_endpoint = true
        enable_private_nodes    = true
      }
      ip_allocation_policy {
      }
      master_authorized_networks_config {
      }
    }

    Schritt 3: Firewallregel erstellen, die SSH-Verbindungen zulässt

    Console

    1. Rufen Sie in der Google Cloud Console die Seite Firewallrichtlinien auf.

      Zur Seite „Firewallrichtlinien“

    2. Klicken Sie auf Firewallregel erstellen.

    3. Geben Sie als Name allow-ssh ein.

    4. Geben Sie für Netzwerk den Wert custom-network1 ein.

    5. Legen Sie für Traffic-Richtung die Option Eingehender Traffic fest.

    6. Legen Sie für Aktion bei Übereinstimmung die Option Zulassen fest.

    7. Legen Sie für Ziele die Option Alle Instanzen im Netzwerk fest.

    8. Legen Sie für Quellfilter die Option IPv4-Bereiche fest.

    9. Legen Sie für Quell-IP-Bereiche den Wert 35.235.240.0/20 fest.

    10. Legen Sie für Protokolle und Ports die Option Angegebene Protokolle und Ports fest.

    11. Klicken Sie das Kästchen tcp an und geben Sie Port 22 ein.

    12. Klicken Sie auf Erstellen.

    gcloud

    gcloud compute firewall-rules create allow-ssh \
        --network custom-network1 \
        --source-ranges 35.235.240.0/20 \
        --allow tcp:22

    Terraform

    Sie können eine Terraform-Ressource verwenden, um eine Firewallregel zu erstellen.

    resource "google_compute_firewall" "rules" {
      project = var.project_id
      name    = "allow-ssh"
      network = var.network
      allow {
        protocol = "tcp"
        ports    = ["22"]
      }
      source_ranges = ["35.235.240.0/20"]
    }

    Schritt 4: IAP-SSH-Berechtigungen für einen Ihrer Knoten erstellen

    Verwenden Sie in einem späteren Schritt IAP zum Herstellen einer Verbindung zu Ihrem Knoten.

    Console

    1. Rufen Sie in der Google Cloud Console die Seite Identity-Aware Proxy auf.

      Zur Seite „Identity-Aware Proxy“

    2. Wählen Sie den Tab SSH- und TCP-Ressourcen aus.

    3. Aktivieren Sie das Kästchen neben dem ersten Knoten in der Liste unter Alle Tunnelressourcen > us-east4‑c. Der Name lautet in etwa gke-nat-test-cluster-default-pool-b50db58d-075t.

    4. Notieren Sie sich den Namen des Knotens. Sie brauchen ihn später zum Testen der Konnektivität.

    5. Klicken Sie im rechten Bereich auf Hauptkonto hinzufügen.

    6. Um Nutzern, Gruppen oder Dienstkonten Zugriff auf die Ressourcen zu gewähren, geben Sie im Feld Neue Hauptkonten ihre E‑Mail-Adressen ein.

      Wenn Sie diese Funktion lediglich testen, können Sie Ihre eigene E‑Mail-Adresse eingeben.

    7. Wählen Sie in der Drop-down-Liste Rolle die Option Cloud IAP > Nutzer IAP-gesicherter Tunnel aus, um Hauptkonten über die TCP-Weiterleitungsfunktion von Cloud IAP Zugriff auf die Ressourcen zu gewähren.

    8. Klicken Sie auf Speichern.

    gcloud

    Verwenden Sie für diesen Schritt die Anleitungen der Console.

    Schritt 5: Beim Knoten anmelden und kontrollieren, dass keine Internetverbindung hergestellt werden kann

    Console

    1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

      Zur Seite „VM-Instanzen“

    2. Suchen Sie den Knoten, für den Sie IAP-SSH-Berechtigungen erstellt haben. Klicken Sie in der Spalte Verbinden auf den Drop-down-Pfeil SSH und wählen Sie Im Browserfenster öffnen aus.

      Wenn Sie zum ersten Mal eine Verbindung zur Instanz herstellen, generiertGoogle Cloud die SSH-Schlüssel für Sie.

    3. Suchen Sie in der Eingabeaufforderung des Knotens nach der Prozess-ID des Containers kube-dns:

      pgrep '^kube-dns$'
    4. Greifen Sie auf den Container zu:

      sudo nsenter --target PROCESS_ID --net /bin/bash
    5. Versuchen Sie von kube-dns aus, eine Internetverbindung herzustellen:

      curl example.com

      Sie sollten kein Ergebnis erhalten. Andernfalls haben Sie den Cluster möglicherweise nicht als privaten Cluster erstellt oder es liegt ein anderes Problem vor. Informationen zur Fehlerbehebung finden Sie unter VMs können unerwartet ohne Public NAT auf das Internet zugreifen.

      Zum Beenden des Befehls müssen Sie möglicherweise Ctrl+C eingeben.

    gcloud

    1. Suchen Sie den Namen eines Ihrer Clusterknoten:

      gcloud compute instances list

      Ein Knotenname sieht in etwa so aus: gke-nat-test-cluster-default-pool-1a4cbd06-3m8v. Notieren Sie sich den Knotennamen und verwenden Sie diesen Namen überall dort, wo in den folgenden Befehlen NODE_NAME angezeigt wird.

    2. Stellen Sie eine Verbindung zum Knoten her:

      gcloud compute ssh NODE_NAME \
          --zone us-east4-c \
          --tunnel-through-iap
    3. Suchen Sie in der Eingabeaufforderung des Knotens nach der Prozess-ID des Containers kube-dns:

      pgrep '^kube-dns$'
    4. Greifen Sie auf den Container zu:

      sudo nsenter --target PROCESS_ID --net /bin/bash
    5. Versuchen Sie von kube-dns aus, eine Internetverbindung herzustellen:

      curl example.com

      Sie sollten kein Ergebnis erhalten. Um den Befehl zu beenden, müssen Sie möglicherweise Ctrl+C eingeben.

    Schritt 6: NAT-Konfiguration mit Cloud Router erstellen

    Sie müssen den Cloud Router in derselben Region erstellen, in der sich auch die Instanzen befinden, die Public NAT verwenden. Public NAT wird nur zum Platzieren von NAT-Informationen auf den VMs verwendet. Es wird nicht in das eigentliche NAT-Gateway eingebunden.

    Diese Konfiguration ermöglicht allen Instanzen in der Region, Public NAT für alle primären und Alias-IP-Bereiche zu verwenden. Außerdem werden die externen IP-Adressen für das NAT-Gateway automatisch zugeordnet. Weitere Informationen finden Sie in der Dokumentation zur Google Cloud CLI.

    Console

    1. Rufen Sie in der Google Cloud Console die Seite Cloud NAT auf.

      Zur Seite „Cloud NAT“

    2. Klicken Sie auf Erste Schritte oder NAT-Gateway erstellen.

    3. Geben Sie für Name des Gateways den Wert nat-config ein.

    4. Legen Sie für VPC-Netzwerk den Wert custom-network1 fest.

    5. Legen Sie für Region den Wert us-east4 fest.

    6. Wählen Sie für Cloud Router die Option Neuen Router erstellen aus.

      1. Geben Sie als Name nat-router ein.
      2. Klicken Sie auf Erstellen.
    7. Klicken Sie auf Erstellen.

    gcloud

    1. Erstellen Sie einen Cloud Router:

      gcloud compute routers create nat-router \
          --network custom-network1 \
          --region us-east4
    2. Fügen Sie eine Konfiguration zum Router hinzu:

      gcloud compute routers nats create nat-config \
          --router-region us-east4 \
          --router nat-router \
          --nat-all-subnet-ip-ranges \
          --auto-allocate-nat-external-ips

    Terraform

    Sie können eine Terraform-Ressource verwenden, um einen Cloud Router zu erstellen.

    resource "google_compute_router" "router" {
      project = var.project_id
      name    = "nat-router"
      network = var.network
      region  = "us-east4"
    }

    Sie können zum Erstellen einer NAT-Konfiguration ein Terraform-Modul verwenden.

    module "cloud-nat" {
      source                             = "terraform-google-modules/cloud-nat/google"
      version                            = "~> 5.0"
      project_id                         = var.project_id
      region                             = "us-east4"
      router                             = google_compute_router.router.name
      name                               = "nat-config"
      source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
    }

    Schritt 7: Noch einmal versuchen, eine Verbindung zum Internet herzustellen

    Es kann bis zu drei Minuten dauern, bis die NAT-Konfiguration wirksam wird. Warten Sie daher mindestens eine Minute, bevor Sie noch einmal versuchen, auf das Internet zuzugreifen.

    Wenn Sie noch nicht in kube-dns angemeldet sind, stellen Sie die Verbindung wieder her, indem Sie der Anleitung unter Schritt 5 folgen. Führen Sie nach der Anmeldung den Befehl curl noch einmal aus:

    curl example.com

    Die Ausgabe sollte Folgendes enthalten:

    
    <html>
    <head>
    <title>Example Domain</title>
    ...
    ...
    ...
    </head>
    
    <body>
    <div>
        <h1>Example Domain</h1>
        <p>This domain is established to be used for illustrative examples in documents. You can use this
        domain in examples without prior coordination or asking for permission.</p>
        <p><a href="http://www.iana.org/domains/example">More information...</a></p>
    </div>
    </body>
    </html>
    

    Nächste Schritte