Public NAT mit GKE verwenden

Auf dieser Seite erfahren Sie, wie Sie eine öffentliche NAT-Beispielkonfiguration mit 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 Cloud einrichten

Zuvor sollten Sie jedoch die folgenden Elemente in Google Cloud einrichten.

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init

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 Namen custom-network1 ein.

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

  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 einen IP-Adressbereich von 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 ordnen 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 Virtual Private Cloud-Netzwerk und ein Subnetz zu erstellen.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.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 : Privaten Cluster erstellen

Console

  1. Rufen Sie in der Google Cloud Console die Seite mit den Kubernetes-Clustern 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 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 das Häkchen aus dem Kästchen Zugriffssteuerungsebene über die externe IP-Adresse.

  9. Geben Sie einen IP-Bereich der Steuerungsebene von 172.16.0.0/28 ein.

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

  11. Klicken Sie zum Erstellen und Starten der VM 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 der Firewall-Richtlinien auf.

    Zur Seite „Firewall-Richtlinien“

  2. Klicken Sie auf Firewallregel erstellen.

  3. Geben Sie als Namen allow-ssh ein.

  4. Geben Sie als Netzwerk den Wert custom-network1 ein.

  5. Legen Sie für Traffic-Richtung den Wert Ingress fest.

  6. Legen Sie für Aktion bei Übereinstimmung den Wert Zulassen fest.

  7. Legen Sie für Ziele den Wert Alle Instanzen im Netzwerk fest.

  8. Legen Sie unter 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 den Wert 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 zum Herstellen einer Verbindung zu Ihrem Knoten in einem späteren Schritt IAP.

Console

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

    Zur Seite "Identity-Aware Proxy"

  2. Klicken Sie auf den Tab SSH- und TCP-Ressourcen.

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

  4. Notieren Sie sich den Namen des Knotens. Sie verwenden 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: Auf dem Knoten anmelden und prüfen, ob 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 für in der Spalte Verbinden auf den Drop-down-Pfeil SSH und wählen Sie dann Im Browserfenster öffnen aus.

    Wenn Sie zum ersten Mal eine Verbindung zur Instanz herstellen, generiert Google 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 NODE_NAME in den folgenden Befehlen 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 wie die Instanzen erstellen, 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 zum Google Cloud CLI.

Console

  1. Wechseln Sie in der Google Cloud Console zur Seite Cloud NAT.

    Zur Seite „Cloud NAT“

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

  3. Geben Sie als Name des Gateways 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 Namen 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 ein Terraform-Modul verwenden, um eine NAT-Konfiguration zu erstellen.

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 bei kube-dns angemeldet sind, stellen Sie die Verbindung wieder her, indem Sie die unter Schritt 5 beschriebenen Schritte ausführen. Führen Sie nach der Anmeldung den Befehl curl noch einmal aus:

curl example.com

Die Ausgabe sollte folgenden Inhalt 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