Agent de masquage d'adresses IP


Vous trouverez sur cette page des informations sur le fonctionnement du masquage d'adresses IP dans Google Kubernetes Engine (GKE) et sur les options de configuration pour différents scénarios.

Présentation du masquage d'adresses IP

Le masquage d'adresses IP est une forme de traduction d'adresses réseau source (SNAT, Source Network Address Translation) qui permet de traduire plusieurs adresses IP en une seule. GKE peut utiliser le masquage d'adresses IP pour modifier les adresses IP sources des paquets envoyés depuis les pods.

Pour obtenir une présentation plus générale du masquage d'adresses IP dans toute mise en œuvre de Kubernetes, consultez le guide de l'utilisateur de l'agent de masquage d'adresses IP.

Masquage d'adresses IP GKE

Lorsque le masquage d'adresses IP s'applique à un paquet émis par un pod, GKE modifie l'adresse IP source du paquet en remplaçant l'adresse IP du pod par l'adresse IP du nœud sous-jacent. Le masquage de l'adresse IP source d'un paquet est utile lorsqu'un destinataire est configuré pour recevoir des paquets provenant uniquement des adresses IP des nœuds du cluster.

Sur les nœuds Linux, GKE configure les règles iptables. GKE utilise le DaemonSet ip-masq-agent pour configurer le plan de données approprié.

Le masquage d'adresses IP n'est pas compatible avec les pools de nœuds Windows Server.

Masquage d'adresses IP pour les clusters Standard

Dans les clusters Standard, le comportement du masquage d'adresses IP du cluster est régi par trois facteurs :

Le tableau suivant récapitule les configurations de masquage d'adresses IP pour les clusters GKE Standard :

Configuration du cluster Comportement SNAT résultant

Le DaemonSet ip-masq-agent est présent dans le cluster, et une liste nonMasqueradeCIDRs personnalisée existe dans le ConfigMap ip-masq-agent.

GKE conserve les adresses IP des pods sources pour les paquets envoyés aux destinations spécifiées dans la liste nonMasqueradeCIDRs.

GKE remplace les adresses IP des pods sources par les adresses IP des nœuds sources pour les paquets envoyés aux destinations non spécifiées dans la liste nonMasqueradeCIDRs.

Le DaemonSet ip-masq-agent est présent dans le cluster, mais il n'y a aucune liste nonMasqueradeCIDRs personnalisée dans le ConfigMap ip-masq-agent ou le ConfigMap ip-masq-agent est inexistant.

GKE conserve les adresses IP des pods sources pour les paquets envoyés à un ensemble de destinations non masquées par défaut.

GKE remplace les adresses IP des pods sources par les adresses IP des nœuds sources pour les paquets envoyés vers des destinations en dehors des destinations non masquées par défaut.

Le DaemonSet ip-masq-agent n'est pas présent dans le cluster et vous avez créé le cluster sans l'option --disable-default-snat.

GKE conserve les adresses IP des pods sources pour les paquets envoyés à un ensemble de destinations non masquées par défaut.

GKE remplace les adresses IP des pods sources par les adresses IP des nœuds sources pour les paquets envoyés vers des destinations en dehors des destinations non masquées par défaut.

Le DaemonSet ip-masq-agent n'est pas présent dans le cluster et vous avez créé le cluster avec l'option --disable-default-snat.

GKE conserve les adresses IP des pods sources pour les paquets envoyés à toutes les destinations.

Consultez la section Conserver les sources d'adresses IPv4 des pods vers les destinations Internet pour connaître les points importants à prendre en compte concernant le routage lorsque vous conservez les adresses sources IPv4 des pods et que vous devez acheminer des paquets vers Internet.

Masquage d'adresses IP pour les clusters Autopilot

Dans les clusters Autopilot, GKE déploie toujours un DaemonSet ip-masq-agent. À l'exception des paquets envoyés par des pods vers les plages de nœuds, de pods ou de services du cluster, vous pouvez contrôler le comportement de masquage d'adresses IP à l'aide d'une règle EgressNATPolicy. Pour utiliser une règle EgressNATPolicy, votre cluster Autopilot doit répondre aux deux exigences suivantes :

  • Le cluster doit utiliser GKE version 1.23.4-gke.1600 ou ultérieure, ou version 1.22.7-gke.1500 ou ultérieure.
  • Le cluster doit avoir été créé avec GKE Dataplane V2 activé.

Le tableau suivant récapitule les configurations de masquage d'adresses IP pour les clusters GKE Autopilot :

Configuration du cluster Autopilot Comportement SNAT résultant

Le cluster inclut une règle EgressNATPolicy personnalisée dont spec.action est NoSNAT contenant des destinations non masquées spécifiées dans spec.destinations[].

GKE conserve les adresses IP des pods sources pour les paquets envoyés aux destinations spécifiées dans spec.destinations[] de la règle EgressNATPolicy. GKE effectue cette opération en traduisant spec.destinations[] en une liste nonMasqueradeCIDRs dans un ConfigMap ip-masq-agent.

GKE remplace les adresses IP des pods sources par les adresses IP des nœuds sources pour les paquets envoyés aux destinations non spécifiées dans spec.destinations[] de la règle EgressNATPolicy.

Le cluster n'inclut pas de règle EgressNATPolicy personnalisée.

Les règles EgressNATPolicy par défaut et gérées par GKE s'appliquent toutes deux, ce qui entraîne le comportement suivant :

  • GKE conserve les adresses IP des pods sources pour les paquets envoyés à un ensemble de destinations non masquées par défaut.
  • GKE remplace les adresses IP des pods sources par les adresses IP des nœuds sources pour les paquets envoyés vers des destinations en dehors des destinations non masquées par défaut.

Exemples de configuration

Développez les sections suivantes pour afficher des exemples de masquage d'adresses IP et de configuration en fonction du type de cluster.

Documentation de référence sur la configuration avancée

Lorsque ip-masq-agent est déployé automatiquement

Dans les clusters en mode Autopilot, GKE déploie toujours un DaemonSet ip-masq-agent.

Dans les clusters Standard, GKE déploie un DaemonSet ip-masq-agent lorsque l'option --disable-default-snat n'est pas définie et que le cluster utilise l'une des combinaisons de configuration suivantes :

  • Le cluster n'utilise pas GKE Dataplane V2 et l'application des règles de réseau est activée.

  • Le cluster utilise une plage d'adresses IP de pods qui ne correspond pas à 10.0.0.0/8.

Pour que le DaemonSet ip-masq-agent soit efficace, vous devez également spécifier la liste nonMasqueradeCIDRs dans le ConfigMap de ip-masq-agent. Pour en savoir plus, consultez la section Comment configurer un agent de masquage d'adresses IP.

Lorsqu'un DaemonSet ip-masq-agent est présent dans un cluster, GKE met à jour et rapproche un pod de diffusion sur chaque nœud du cluster.

Destinations non masquées par défaut

Les destinations non masquées par défaut sont les suivantes :

  • 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

Les destinations non masquées par défaut s'appliquent aux clusters ayant les configurations suivantes :

Les destinations non masquées par défaut ne s'appliquent pas aux clusters ayant les configurations suivantes :

Effet de l'option --disable-default-snat

L'option --disable-default-snat modifie le comportement SNAT par défaut de GKE de manière à ce que les adresses IP des pods sources soient conservées pour les paquets envoyés à toutes les destinations. GKE implémente le comportement SNAT par défaut en ne déployant aucun DaemonSet ip-masq-agent dans le cluster.

L'option --disable-default-snat n'a aucun effet lorsqu'un cluster inclut un DaemonSet ip-masq-agent :

  • Comme les clusters Autopilot incluent toujours un DaemonSet ip-masq-agent, l'option --disable-default-snat n'a aucun effet sur les clusters Autopilot.

Vous pouvez définir l'option --disable-default-snat en mettant à jour un cluster après sa création. Si aucun DaemonSet ip-masq-agent n'est déployé dans le cluster, la désactivation du SNAT par défaut prend effet une fois que le cluster a remplacé tous ses nœuds, ce qui peut parfois prendre plusieurs heures. Ceci est dû au fait que GKE respecte les intervalles de maintenance que vous avez configurées lorsqu'il remplace les nœuds du cluster. Si vous n'avez configuré aucun intervalle de maintenance, vous devez remplacer manuellement les nœuds du cluster avant que l'option --disable-default-snat n'ait un effet.

Masquage de liaison locale

La plage 169.254.0.0/16 est utilisée pour les adresses IP de liaison locale. Le masquage de liaison locale consiste à remplacer une adresse IP de pod source par une adresse IP de nœud source pour les paquets envoyés aux destinations 169.254.0.0/16.

Les clusters Autopilot conservent toujours les adresses IP des pods sources pour les paquets envoyés aux destinations 169.254.0.0/16.

Par défaut, les clusters standards conservent également les adresses IP des pods sources pour les paquets envoyés aux destinations 169.254.0.0/16.

Vous pouvez activer le masquage d'adresses IP de liaison locale dans un cluster standard en effectuant les deux opérations suivantes :

Conteneurs et pods de diagnostic avec hostNetwork: true

À moins que vous ne spécifiez une adresse IP source personnalisée pour les paquets, les pods exécutés avec hostNetwork: true et les conteneurs de diagnostic envoient des paquets dont les sources correspondent à l'adresse IP du nœud. Pour les pods exécutés avec hostNetwork: true, GKE attribue au pod l'adresse IP du nœud. GKE ne gère pas les adresses IP pour les conteneurs de diagnostic, y compris les conteneurs permettant de déboguer les problèmes de nœuds à l'aide de la boîte à outils.

Les clusters Autopilot n'acceptent pas l'exécution de pods avec spec.hostNetwork: true. Comme les nœuds d'un cluster Autopilot ne sont pas accessibles via SSH, vous ne pouvez pas exécuter de conteneurs de diagnostic sur ces nœuds.

Conserver les sources d'adresses IPv4 des pods vers les destinations Internet

Si la configuration du masquage d'adresses IP de votre cluster est l'une des suivantes, GKE conserve les sources des adresses IP des pods pour les paquets envoyés à toutes les destinations, y compris les destinations Internet :

  • Dans les clusters standards avec un DaemonSet ip-masq-agent, si vous avez défini nonMasqueradeCIDRs sur 0.0.0.0 dans le ConfigMap ip-masq-agent.
  • Dans les clusters standards sans DaemonSet ip-masq-agent, si vous avez défini l'option --disable-default-snat.

Dans les clusters publics et privés, les sources IPv4 des pods sont des adresses IPv4 internes, ce qui signifie qu'elles ne sont pas routables sur Internet. Par conséquent, lorsque vous conservez les adresses IPv4 des pods sources pour les paquets envoyés sur Internet, vous devez utiliser une technique comme celle-ci afin d'acheminer les paquets après qu'ils ont quitté les nœuds du cluster :

  • Assurez-vous que votre réseau VPC dispose d'une route par défaut avec le saut suivant de la passerelle Internet par défaut et configurez une passerelle Cloud NAT pour fournir des services NAT publics au moins aux plages d'adresses IPv4 secondaires du sous-réseau utilisées par les pods de votre cluster. Pour en savoir plus, consultez la section Interaction GKE dans la présentation de Cloud NAT.
  • Configurez votre réseau VPC pour utiliser une route par défaut personnalisée dont le saut suivant est une instance de VM ou un équilibreur de charge réseau passthrough interne, où la VM ou les backends de l'équilibreur de charge ont été configurés pour acheminer les paquets vers Internet pour le compte des pods.

Restaurer le comportement SNAT par défaut

Pour restaurer le comportement SNAT par défaut lorsqu'un DaemonSet ip-masq-agent est présent dans un cluster, supprimez le ConfigMap ip-masq-agent associé. Le DaemonSet ip-masq-agent rétablit le comportement de masquage d'adresses IP par défaut sur les nœuds qu'il gère.

Pour restaurer le comportement SNAT par défaut lorsqu'un DaemonSet ip-masq-agent n'est pas présent dans un cluster, vous devez mettre à niveau le pool de nœuds (assurez-vous que --disable-default-snat n'est pas défini sur le cluster).

Effet de la règle NAT de sortie dans les clusters Autopilot

La règle NAT de sortie de GKE vous permet de configurer le masquage d'adresses IP sur les clusters Autopilot. Vous pouvez utiliser la définition de ressource personnalisée (CRD) de la règle NAT de sortie GKE pour modifier les adresses IP sources des paquets envoyés depuis les pods.

Pour des raisons de sécurité ou d'épuisement des adresses IP, vous pouvez masquer les adresses IP des pods vers les plages d'adresses IP des nœuds pour le trafic sortant vers les réseaux sur site. Par exemple, vous pouvez utiliser une plage non-RFC-1918 pour les clusters Autopilot et une plage RFC-1918 pour les nœuds. Toutefois, si les pods doivent communiquer avec des réseaux sur site qui utilisent également la plage non-RFC-1918, les adresses IP peuvent se chevaucher. Pour éviter les pertes de trafic, vous pouvez configurer une règle NAT de sortie pour ne pas annoncer les plages non-RFC-1918 des pods sur les réseaux sur site. La règle NAT de sortie masque la plage non-RFC-1918 des pods pour utiliser la plage RFC-1918 du nœud à la place. Assurez-vous qu'aucune plage de nœuds ne chevauche une plage sur site, car cela peut entraîner une boucle de trafic.

GKE applique le comportement de masquage d'adresses IP pour les clusters Autopilot en procédant comme suit :

  1. GKE déploie le contrôleur NAT de sortie et le ip-masq-agent.
  2. Vous créez la règle NAT de sortie.
  3. Le contrôleur GKE traduit la règle dans le ConfigMap de ip-masq-agent.
  4. Le DaemonSet ip-masq-agent lit le ConfigMap, puis GKE applique le comportement de masquage d'adresses IP.

Règles générées automatiquement

GKE accepte deux règles NAT de sortie générées automatiquement :

  • Par défaut : ces règles sont modifiables.
  • Gérées par GKE : ces règles sont fixes et ne peuvent pas être modifiées.

Règle par défaut

GKE prédéfinit un ensemble de plages d'adresses IP par défaut. Lorsque des paquets sont envoyés à ces destinations, votre cluster ne masque pas les sources d'adresses IP et conserve les adresses IP des pods sources. Pour modifier ces plages d'adresses IP par défaut, consultez la section Modifier et déployer la règle NAT de sortie.

Le fichier manifeste suivant décrit une règle NAT de sortie par défaut :

    Name:         default
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:45Z
      Generation:          2
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
          f:status:
        Manager:      egress-nat-controller
        Operation:    Update
        Time:         2022-03-16T21:05:45Z
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            f:destinations:
        Manager:         kubectl
        Operation:       Update
        Time:            2022-03-17T01:58:13Z
      Resource Version:  189346
      UID:               06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.0.0.0/8
        Cidr:  172.16.0.0/12
        Cidr:  192.168.0.0/16
        Cidr:  240.0.0.0/4
        Cidr:  192.0.2.0/24
        Cidr:  198.51.100.0/24
        Cidr:  203.0.113.0/24
        Cidr:  100.64.0.0/10
        Cidr:  198.18.0.0/15
        Cidr:  192.0.0.0/24
        Cidr:  192.88.99.0/24
    Status:
    Events:  <none>

Les plages CIDR sont identiques aux plages de destination non masquées par défaut.

Règle gérée par GKE

La règle NAT de sortie de GKE réserve une plage statique d'adresses IP requises pour préserver le fonctionnement du cluster. Cette plage statique contient les plages d'adresses IP des pods, des services et des nœuds du cluster, et peut chevaucher la règle par défaut.

Vous pouvez identifier cette règle par un hachage dynamique de 8 octets (gke-{CLUSTER_SHORT_HASH}) que GKE attribue. Vous ne pouvez pas modifier cette règle.

Le fichier manifeste suivant décrit une règle gérée par GKE nommée gke-bbfa6c0e-1 :

    Name:         gke-bbfa6c0e-1
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         EgressNATPolicy
    Metadata:
      Creation Timestamp:  2022-03-16T21:05:46Z
      Generation:          1
      Managed Fields:
        API Version:  networking.gke.io/v1
        Fields Type:  FieldsV1
        fieldsV1:
          f:spec:
            .:
            f:action:
            f:destinations:
          f:status:
        Manager:         egress-nat-controller
        Operation:       Update
        Time:            2022-03-16T21:05:46Z
      Resource Version:  11699
      UID:               0201b5de-a6f6-4926-822b-31ed7cdee2c6
    Spec:
      Action:  NoSNAT
      Destinations:
        Cidr:  10.119.128.0/17
        Cidr:  10.120.0.0/22
        Cidr:  10.128.0.0/20
    Status:
    Events:  <none>

Étapes suivantes