Knoteninterne Sichtbarkeit einrichten

In dieser Anleitung wird beschrieben, wie Sie die knoteninterne Sichtbarkeit in einem GKE-Cluster (Google Kubernetes Engine) einrichten, damit der gesamte Netzwerktraffic in Ihrem Cluster vom Google Cloud-Netzwerk gesehen wird.

Mit der knoteninternen Sichtbarkeit können Sie:

  • Flusslogs für den gesamten Traffic zwischen den Pods ansehen, einschließlich des Traffics zwischen Pods auf demselben Knoten,
  • Firewallregeln erstellen, die für den gesamten Traffic zwischen Pods gelten, auch für Pods auf demselben Knoten, und
  • Paketspiegelung verwenden, um Traffic zwischen Pods auf demselben Knoten zu klonen und zur Prüfung weiterzuleiten.

Wenn ein Pod ein Paket an einen anderen Pod auf demselben Knoten sendet, verlässt das Paket den Knoten und wird vom Google Cloud-Netzwerk verarbeitet. Das Paket wird anschließend sofort zum selben Knoten zurückgesendet und zum Ziel-Pod weitergeleitet.

Knoteninterne Sichtbarkeit ist standardmäßig deaktiviert.

Knoteninterne Sichtbarkeit ist erforderlich, wenn Ihr Cluster ein VPC-Netzwerk mit einer MTU von 1.500 Byte verwenden soll. Außerdem muss die GKE-Version des Clusters mindestens 1.15 sein. Weitere Informationen zu VPC-Netzwerken mit einem MTU-Wert von 1.500 finden Sie in der VPC-Dokumentation unter Maximale Übertragungseinheit.

Wichtige Punkte

Logvolumen wurde erhöht

Wenn die knoteninterne Sichtbarkeit aktiviert ist, kann das Volumen der Flusslogs zunehmen, da mehr Traffic von der VPC erfasst wird. Sie können die mit Flusslogs verbundenen Kosten verwalten, wenn Sie die Logeinstellungen anpassen.

Der gesamte Pod-zu-Pod-Traffic unterliegt Firewallregeln

Sämtlicher Traffic zwischen Pods, einschließlich Pods, die im Namensknoten bereitgestellt werden, ist für die VPC sichtbar, wenn die knoteninterne Sichtbarkeit aktiviert ist. Durch die Aktivierung der knoteninternen Sichtbarkeit unterliegt bisher uneingeschränkter Traffic unter Umständen Firewallregeln. Bewerten Sie die Firewalls auf Knotenebene mithilfe von Verbindungstests, damit legitimer Traffic nicht blockiert wird.

Vorbereitung

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

Mit den folgenden Methoden können Sie die gcloud-Einstellungen festlegen:

  • Verwenden Sie gcloud init, wenn Sie die Standardeinstellungen ansehen möchten.
  • Verwenden Sie gcloud config, um Ihre Projekt-ID, Zone und Region individuell festzulegen.

gcloud init verwenden

Wenn Sie die Fehlermeldung One of [--zone, --region] must be supplied: Please specify location erhalten, führen Sie diesen Abschnitt aus.

  1. Führen Sie gcloud init aus und folgen Sie der Anleitung:

    gcloud init

    Wenn Sie SSH auf einem Remote-Server verwenden, können Sie mit dem Flag --console-only verhindern, dass mit dem Befehl ein Browserfenster geöffnet wird:

    gcloud init --console-only
  2. Folgen Sie der Anleitung, um gcloud zur Verwendung Ihres Google Cloud-Kontos zu autorisieren.
  3. Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
  4. Wählen Sie ein Google Cloud-Projekt aus.
  5. Wählen Sie eine Compute Engine-Standardzone aus.

gcloud config verwenden

  • Legen Sie Ihre standardmäßige Projekt-ID fest:
    gcloud config set project project-id
  • Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Compute-Standardzone fest:
    gcloud config set compute/zone compute-zone
  • Wenn Sie mit regionalen Clustern arbeiten, legen Sie die Standardregion für Compute Engine fest:
    gcloud config set compute/region compute-region
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update

Tasks – Übersicht

Nachfolgend sehen Sie eine Übersicht über die ausgeführten Aufgaben, um die Einrichtung der knoteninternen Sichtbarkeit zu veranschaulichen:

  1. Aktivieren Sie Flusslogs für das Standardsubnetz in der Region us-central1.
  2. Erstellen Sie einen Cluster mit einem einzelnen Knoten, für den die knoteninterne Sichtbarkeit aktiviert ist.
  3. Sie erstellen in dem Cluster zwei Pods.
  4. Sie senden eine HTTP-Anfrage von einem Pod zum anderen.
  5. Sie sehen sich den Flusslogeintrag für die zwischen den Pods gesendete Anfrage an.

Beispiele in diesem Leitfaden:

  • us-central1 als Standardregion.
  • us-central1-a als Standardzone.

Flusslogs für ein Subnetz aktivieren

Sie können Flusslogs für ein Subnetz mit dem gcloud-Tool oder der Google Cloud Console aktivieren.

gcloud

  1. Aktivieren Sie Flusslogs für das Standardsubnetz in der Region us-central1:

    gcloud compute networks subnets update default --region us-central1 \
        --enable-flow-logs
    
  2. Prüfen Sie, ob für das Subnetz Flusslogs aktiviert sind:

    gcloud compute networks subnets describe default --region us-central1
    

    Die Ausgabe zeigt, dass Flusslogs aktiviert sind:

    ...
    enableFlowLogs: true
    ...
    ipCidrRange: 10.128.0.0/20
    region: https://www.googleapis.com/compute/v1/projects/abc-712099/regions/us-central1
    

Console

  1. Rufen Sie in der Cloud Console die Seite mit den VPC-Netzwerken für Google Kubernetes Engine auf.

    Seite "VPC-Netzwerke" aufrufen

  2. Klicken Sie in der Zeile us-central1 auf Standard.

  3. Klicken Sie auf Bearbeiten.

  4. Wählen Sie unter Fluss-Logs die Option Ein.

  5. Klicken Sie auf Speichern.

Cluster mit aktivierter knoteninterner Sichtbarkeit erstellen

Mit dem gcloud-Tool oder der Google Cloud Console können Sie einen Cluster erstellen, für den die knoteninterne Sichtbarkeit aktiviert ist.

gcloud

Erstellen Sie einen Cluster mit einem einzelnen Knoten, für den die knoteninterne Sichtbarkeit aktiviert ist:

gcloud container clusters create cluster-name \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

Console

  1. Rufen Sie in der Cloud Console das Kubernetes Engine-Menü auf.

    Zum Google Kubernetes Engine-Menü

  2. Klicken Sie auf Cluster erstellen.

  3. Geben Sie den Namen für den Cluster ein.

  4. Wählen Sie als Standorttyp Zonal aus.

  5. Wählen Sie in der Drop-down-Liste Zone die Option us-central1-a aus.

  6. Klicken Sie im Navigationsbereich unter Knotenpools auf default-pool.

  7. Geben Sie einen Namen für den Knotenpool ein.

  8. Wählen Sie die Knotenversion für Ihren Knoten aus.

  9. Geben Sie als Anzahl der Knoten den Wert 1 ein.

  10. Klicken Sie im Navigationsbereich unter Cluster auf Netzwerke.

  11. Klicken Sie auf das Kästchen Knoteninterne Sichtbarkeit aktivieren.

  12. Klicken Sie auf Erstellen.

Anmeldedaten für den Cluster abrufen

Rufen Sie die Anmeldedaten für den neuen Cluster ab:

gcloud container clusters get-credentials cluster-name \
    --zone us-central1-a

Die Anmeldedaten werden in der entsprechenden Konfigurationsdatei gespeichert, die sich normalerweise unter $HOME/.kube/config befindet.

Zwei Pods erstellen

  1. Erstellen Sie für den ersten Pod eine Datei namens pod-1.yaml, die auf dem folgenden Beispielmanifest basiert:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1
    spec:
      containers:
      - name: container-1
        image: gcr.io/google-samples/hello-app:2.0
    
  2. Erstellen Sie den Pod mit dem folgenden Befehl:

    kubectl apply -f pod-1.yaml
    
  3. Erstellen Sie für den zweiten Pod eine Datei namens pod-2.yaml, die auf dem folgenden Beispielmanifest basiert:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-2
    spec:
      containers:
      - name: container-2
        image: gcr.io/google-samples/node-hello:1.0
    
  4. Erstellen Sie den Pod mit dem folgenden Befehl:

    kubectl apply -f pod-2.yaml
    
  5. Sehen Sie sich die Pods an:

    kubectl get pod pod-1 pod-2 --output wide
    

    Die Ausgabe zeigt die IP-Adressen der Pods. Notieren Sie sich diese Adressen.

    NAME      READY     STATUS    RESTARTS   AGE       IP           ...
    pod-1     1/1       Running   0          1d        10.52.0.13   ...
    pod-2     1/1       Running   0          1d        10.52.0.14   ...
    

Anfrage von pod-1 an pod-2 senden

  1. Rufen Sie eine Shell für den Container in pod-1 ab:

    kubectl exec -it pod-1 sh
    
  2. Senden Sie in der Shell eine Anfrage an pod-2:

    wget -qO- pod-2-ip-address:8080
    

    Dabei ist pod-2-ip-address die IP-Adresse von pod-2, die Sie zuvor notiert haben.

    Die Ausgabe zeigt die Antwort des Containers, der auf pod-2 ausgeführt wird:

    Hello Kubernetes!
    
  3. Geben Sie exit ein, um die Shell zu verlassen und zur Hauptbefehlszeilenumgebung zurückzukehren.

Flusslogeinträge ansehen

Sie können Flusslogeinträge mit dem gcloud-Tool oder der Google Cloud Console ansehen.

gcloud

Rufen Sie einen Flusslogeintrag für die Anfrage von pod-1 an pod-2 auf:

gcloud logging read \
    'logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="pod-1-ip-address"'

Dabei gilt:

  • project-id ist die Projekt-ID.
  • pod-1-ip-address ist die IP-Adresse von pod-1.

Die Ausgabe zeigt einen Flusslogeintrag für eine Anfrage von pod-1 an pod-2. In diesem Beispiel hat pod-1 die IP-Adresse 10.56.0.13 und pod-2 die IP-Adresse 10.56.0.14.

...
jsonPayload:
  bytes_sent: '0'
  connection:
    dest_ip: 10.56.0.14
    dest_port: 8080
    protocol: 6
    src_ip: 10.56.0.13
    src_port: 35414
...

Console

  1. Rufen Sie in der Cloud Console die Seite mit den Stackdriver-Logs für Google Kubernetes Engine auf.

    Seite mit den Stackdriver-Logs aufrufen

  2. Klicken Sie rechts oben auf der Seite im Filterfeld auf den Abwärtspfeil und wählen Sie In erweiterten Filter umwandeln aus.

  3. Löschen Sie den im Filterfeld enthaltenen Text und geben Sie die folgende Abfrage ein:

    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_ip="pod-1-ip-address"
    

    Dabei gilt:

    • project-id ist die Projekt-ID.
    • pod-1-ip-address ist die IP-Adresse von pod-1.
  4. Maximieren Sie den angezeigten Logeintrag. Unter jsonPayload sehen Sie, dass die Anfrage von pod-1 an pod-2 gesendet wurde. Im folgenden Beispiel hat pod-1 die IP-Adresse 10.56.0.13 und pod-2 die IP-Adresse 10.56.0.14.

    jsonPayload: {
      bytes_sent:  "0"
      connection: {
        dest_ip:  "10.56.0.14"
        dest_port:  8080
        protocol:  6
        src_ip:  "10.56.0.13"
        src_port:  35414
    

Wie Sie wissen, hat Ihr Cluster nur einen Knoten. Daher befinden sich pod-1 und pod-2 auf demselben Knoten. Dennoch gibt es für die knoteninterne Kommunikation zwischen pod-1 und pod-2 Flusslogeinträge.

Knoteninterne Sichtbarkeit für einen vorhandenen Cluster aktivieren

Sie können die knoteninterne Sichtbarkeit für einen vorhandenen Cluster mit dem gcloud-Tool oder der Google Cloud Console aktivieren.

gcloud

gcloud beta container clusters update cluster-name \
    --enable-intra-node-visibility

Dabei ist cluster-name der Name des vorhandenen Clusters.

Console

  1. Rufen Sie in der Cloud Console das Kubernetes Engine-Menü auf.

    Zum Google Kubernetes Engine-Menü

  2. Klicken Sie auf die Schaltfläche Bearbeiten  (Stiftsymbol) des Clusters.

  3. Knoteninterne Sichtbarkeit aktivieren

  4. Klicken Sie auf Speichern.

Wenn Sie die knoteninterne Sichtbarkeit für einen vorhandenen Cluster aktivieren, werden sowohl Komponenten auf der Steuerebene als auch auf den Worker-Knoten neu gestartet.

Nachdem Sie dieses Feature aktiviert haben, können Sie prüfen, ob es aktiviert ist. Untersuchen Sie dazu die Routingregeln auf dem Knoten:

  1. Rufen Sie die IP-Regeln auf:

    ip rule show
    

    Die Ausgabe sieht etwa so aus:

    0:  from all lookup local
    30001:  from all fwmark 0x4000/0x4000 lookup main
    30002:  from all iif lo lookup main
    30003:  not from all iif eth0 lookup 1
    32766:  from all lookup main
    32767:  from all lookup default
    
  2. Rufen Sie die IP-Routen auf:

    ip route show table 1
    

    Die Ausgabe sieht etwa so aus:

    default via GKE-node-subnet-gw dev eth0
    

Knoteninterne Sichtbarkeit deaktivieren

Sie können die knoteninterne Sichtbarkeit für einen vorhandenen Cluster mit dem gcloud-Tool oder der Google Cloud Console deaktivieren.

gcloud

gcloud beta container clusters update cluster-name \
    --no-enable-intra-node-visibility

Dabei ist cluster-name der Name des vorhandenen Clusters.

Console

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

    Seite mit den Kubernetes-Clustern aufrufen

  2. Klicken Sie auf die Schaltfläche Bearbeiten  (Stiftsymbol) des Clusters.

  3. Wählen Sie im Drop-down-Menü Knoteninterne Sichtbarkeit die Option Deaktiviert aus.

  4. Klicken Sie auf Speichern.

Wenn Sie die knoteninterne Sichtbarkeit für einen vorhandenen Cluster deaktivieren, werden sowohl Komponenten auf der Steuerebene als auch auf den Worker-Knoten neu gestartet.

Beschränkungen

Cluster, bei denen die knoteninterne Sichtbarkeit aktiviert ist, sind mit folgenden Einschränkungen verbunden:

  • Wenn Sie die knoteninterne Sichtbarkeit aktivieren und ip-masq-agent mit dem Parameter nonMasqueradeCIDRs konfigurieren, muss nonMasqueradeCIDRs die Pod-CIDR enthalten. Andernfalls können Verbindungsprobleme zwischen den Knoten auftreten.

Nächste Schritte