IP-Masquerade-Agent


Auf dieser Seite werden die Funktionsweise der IP-Maskierung in GKE und die Konfigurationsoptionen für den IP-Masquerade-Agent erläutert.

Übersicht

Die IP-Maskierung ist eine Form von Network Address Translation (NAT), die verwendet wird, um n:1-IP-Adressübersetzungen durchzuführen. So können mehrere Clients über eine einzige IP-Adresse auf ein Ziel zugreifen. Ein GKE-Cluster verwendet IP-Maskierung, damit Ziele außerhalb des Clusters nur Pakete von Knoten-IP-Adressen anstelle von Pod-IP-Adressen empfangen. Das ist in Umgebungen nützlich, in denen nur Pakete von Knoten-IP-Adressen empfangen werden sollen.

In den folgenden Abschnitten wird beschrieben, wie Sie die IP-Maskierung in Ihrem GKE-Cluster konfigurieren.

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 für zonale Cluster oder eine Region für regionale oder Autopilot-Cluster 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 Standardzone für Compute Engine fest:
    gcloud config set compute/zone COMPUTE_ZONE
  • Wenn Sie mit Autopilot oder regionalen Clustern arbeiten, legen Sie die Compute-Standardregion fest:
    gcloud config set compute/region COMPUTE_REGION
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update

Maskierung in GKE

GKE verwendet iptables-Regeln zusammen mit dem DaemonSet ip-masq-agent, um die Quell-IP-Adresse von Paketen zu ändern, die von Pods an bestimmte Ziele gesendet werden. Wenn ein Pod ein Paket an eine Ziel-IP-Adresse in einem angegebenen Maskierungsbereich sendet, wird die IP-Adresse des Knotens als Quelladresse des Pakets (anstelle der IP-Adresse des Pods) verwendet.

GKE führt wie in dieser Tabelle eine IP-Maskierung durch:

Clusterkonfiguration SNAT-Verhalten

GKE behält die Quell-Pod-IP-Adressen für Pakete bei, die an Ziele in der nonMasqueradeCIDRs-Liste gesendet werden.

GKE ändert die Quell-Pod-IP-Adressen in Quellknoten-IP-Adressen für Pakete an Ziele, die nicht in der nonMasqueradeCIDRs-Liste angegeben sind.

  • Entweder ist ip-masq-agent nicht installiert oder Sie haben keine nonMasqueradeCIDRs-Liste in der ConfigMap ip-masq-agent angegeben und
  • Sie haben den Cluster ohne
    das --disable-default-snat-Flag erstellt.

GKE behält die Quell-Pod-IP-Adressen für Pakete bei, die an eine Reihe von Standardzielen ohne Maskierung gesendet werden. Diese Standardeinstellungen hängen von der GKE-Version und dem Image-Typ des Knotens ab.

GKE ändert Quell-Pod-IP-Adressen in Quellknoten-IP-Adressen für Pakete, die an Ziele außerhalb der Standardziele ohne Maskierung gesendet werden.

  • Entweder ist ip-masq-agent nicht installiert oder Sie haben keine nonMasqueradeCIDRs-Liste in der ConfigMap ip-masq-agent angegeben und
  • Sie haben den Cluster mit
    dem --disable-default-snat-Flag erstellt.

GKE behält die Quell-Pod-IP-Adressen für Pakete bei, die an alle Ziele gesendet werden.

Ändern Sie dieses Verhalten, indem Sie dafür sorgen, dass ip-masq-agent installiert ist und in der ConfigMap ip-masq-agent eine nonMasqueradeCIDRs-Liste angegeben wurde.

Weitere Informationen finden Sie im Nutzerhandbuch zum IP-Masquerade-Agent in der Kubernetes-Dokumentation.

Wenn ip-masq-agent eingeschlossen ist

Das DaemonSet ip-masq-agent wird automatisch als Add-on mit dem Argument --nomasq-all-reserved-ranges im GKE-Cluster installiert, wenn eine oder mehrere der folgenden Bedingungen zutreffen:

  • Der Cluster hat eine Netzwerkrichtlinie.
  • Der CIDR-Bereich des Pods liegt nicht innerhalb von 10.0.0.0/8.
  • Der Cluster wurde ohne das Flag --disable-default-snat erstellt und Workload Identity ist aktiviert.

Sie können die Zielbereiche ändern. Geben Sie dazu nonMasqueradeCIDRs in der ConfigMap ip-masq-agent an. Wenn Ihr Cluster ip-masq-agent nicht enthält, können Sie ip-masq-agent manuell installieren.

Standardziele ohne Maskierung

In der folgenden Tabelle werden die GKE-Standardzielbereiche ohne Maskierung für Cluster erstellt, die ohne das Flag --disable-default-snat erstellt wurden, sofern einer der folgenden Punkte zutrifft:

  • ip-masq-agent wurde nicht bereitgestellt oder
  • nonMasqueradeCIDRs ist nicht in der ConfigMap ip-masq-agent angegeben.
GKE-Versionen Imagetyp des Knotens Zielbereiche Hinweise
Alle Versionen Alle Image-Typen 169.254.0.0/16
(Link-Local-Bereich)
Sie können dieses Verhalten ändern. Setzen Sie dazu in der ConfigMap ip-masq-agent masqLinkLocal auf True.
Versionen vor 1.14 Container-Optimized OS mit "containerd" (cos_containerd)
oder ip-masq-agent startete mit dem Argument --nomasq-all-reserved-ranges
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Sie können dieses Verhalten ändern. Geben Sie dazu in der ConfigMap ip-masq-agent eine Liste von CIDRs in nonMasqueradeCIDRs an.

Weitere Informationen zur Verwendung reservierter Adressbereiche außerhalb des RFC 1918-Bereichs finden Sie unter den gültigen Bereichen von VPC-Netzwerken.
Andere Image-Typen ohne ip-masq-agent aktiviert 10.0.0.0/8
Versionen 1.14.1-gke.14, 1.14.2-gke.1 und höher Alle Image-Typen 10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4

Maskierungsregeln in iptables prüfen

Stellen Sie eine SSH-Verbindung zu einem der ip-masq-agent-Knoten her und führen Sie den folgenden Befehl aus:

iptables -t nat -L IP-MASQ

Hier ist eine Beispielausgabe von einem Cluster, auf dem das Daemonset ip-masq-agent nicht ausgeführt wird. Die Knotenpoolversion ist älter als 1.14 und es wird ein cos_coinainerd-Image verwendet (siehe Tabelle im Bereich oben):

RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

ConfigMap-Parameter ip-masq-agent

Mit den folgenden optionalen Schlüsseln in der ConfigMap ip-masq-agent können Sie Zielbereiche ohne Maskierung angeben und das Verhalten von ip-masq-agent ändern. Die ConfigMap-Datei muss in YAML oder JSON geschrieben und config genannt werden.

  • nonMasqueradeCIDRs: Eine Liste von Strings in CIDR-Schreibweise, die die Ziel-IP-Adressbereiche angeben, für die GKE keine IP-Maskierung verwendet. Wenn Sie eine leere Liste angeben, verwendet GKE die IP-Maskierung für alle Zieladressen. Wenn keine Angabe gemacht wird, verwendet GKE die IP-Maskierung für die Standard-Zieladressen.
  • masqLinkLocal: Ein boolescher Wert, der angibt, ob Traffic als Link-Local-Präfix (169.254.0.0/16) maskiert wird. Der Standardwert ist false.
  • resyncInterval: Stellt die Zeitspanne dar, bevor ip-masq-agent seine Konfiguration wieder lädt (wobei in /etc/config/ip-masq-agent aus ConfigMap geschrieben wird). Das Format ist Nx, wobei N eine Ganzzahl und x eine Zeiteinheit wie s oder ms ist. Wenn nicht angegeben, ist der Standardwert 60 Sekunden.

nonMasqueradeCIDRs angeben

Die folgende ConfigMap bewahrt die Quelladresse für an 10.0.0.0/8 gesendete Pakete:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

Die folgende ConfigMap zeigt, wie Sie die IP-Maskierung für alle Zieladressen verwenden, indem Sie eine leere Liste für nonMasqueradeCIDRs angeben:

nonMasqueradeCIDRs:
resyncInterval: 60s
masqLinkLocal: true

Wenn ip-masq-agent die IP-Maskierung für den Link-Local-Bereich aktivieren soll, setzen Sie den Wert des Schlüssels masqLinkLocal in der ConfigMap-Datei auf true.

Beispiel:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true

ConfigMap dem Cluster hinzufügen

Führen Sie im Shell- oder Terminalfenster den folgenden Befehl aus, um dem Cluster eine ConfigMap hinzuzufügen:

kubectl create configmap configmap-name \
  --from-file config \
  --namespace kube-system

Dabei ist configmap-name der Name, den Sie für die ConfigMap-Ressource auswählen, z. B. ip-masq-agent.

Beispiel:

kubectl create configmap ip-masq-agent --from-file config --namespace kube-system

Nach der Synchronisierung sollten die Änderungen unter iptables angezeigt werden:

iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

Eine ip-masq-agent-Ressource manuell erstellen (optional)

Sie müssen ip-masq-agent gegebenenfalls manuell erstellen und konfigurieren. Dazu müssen Sie die ip-masq-agent-Ressource in Ihrem Cluster bereitstellen.

  1. Speichern Sie das folgende Manifest lokal in einer Datei mit dem Namen ip-masq-agent.yaml.

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          k8s-app: ip-masq-agent
      template:
        metadata:
          labels:
            k8s-app: ip-masq-agent
        spec:
          hostNetwork: true
          containers:
          - name: ip-masq-agent
            image: k8s.gcr.io/networking/ip-masq-agent-amd64:v2.6.0
            args:
                - --masq-chain=IP-MASQ
                # To non-masquerade reserved IP ranges by default, uncomment the line below.
                # - --nomasq-all-reserved-ranges
            securityContext:
              privileged: true
            volumeMounts:
              - name: config
                mountPath: /etc/config
          volumes:
            - name: config
              configMap:
                # Note this ConfigMap must be created in the same namespace as the
                # daemon pods - this spec uses kube-system
                name: ip-masq-agent
                optional: true
                items:
                  # The daemon looks for its config in a YAML file at /etc/config/ip-masq-agent
                  - key: config
                    path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"
    
  2. Führen Sie diesen Befehl aus:

    kubectl apply -f ip-masq-agent.yaml
    

Dadurch sollte ein DaemonSet namens ip-masq-agent erstellt werden, das auf allen Knoten in Ihrem Cluster ausgeführt wird.

Weitere Informationen zum Konfigurieren des Tools ip-masq-agent finden Sie unter Agent mithilfe einer ConfigMap konfigurieren.

Beschränkungen

Für Cluster, auf denen ip-masq-agent ausgeführt wird, gelten die folgenden Einschränkungen:

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

Nächste Schritte