Utiliser un agent de masquage d'adresses IP


Vous trouverez sur cette page des informations sur le fonctionnement du masquage d'adresses IP dans GKE et sur les options de configuration de l'agent de masquage d'adresses IP.

Présentation

Le masquage d'adresses IP est une forme de traduction d'adresses réseau (NAT, Network Address Translation) permettant de traduire plusieurs adresses IP en une seule, ce qui permet à plusieurs clients d'accéder à une destination à l'aide d'une seule adresse IP. Dans un cluster GKE, le masquage d'adresses IP permet aux destinations situées en dehors du cluster de ne recevoir des paquets qu'en provenance d'adresses IP de nœud, et non d'adresses IP de pod. Ce procédé est utile dans le cas des environnements qui ne s'attendent à recevoir des paquets qu'en provenance d'adresses IP de nœud.

Dans les sections suivantes, nous allons voir comment configurer le masquage d'adresses IP dans votre cluster GKE.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

Configurez les paramètres gcloud par défaut à l'aide de l'une des méthodes suivantes :

  • Utilisez gcloud init pour suivre les instructions permettant de définir les paramètres par défaut.
  • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

Utiliser gcloud init

Si le message d'erreur One of [--zone, --region] must be supplied: Please specify location s'affiche, effectuez les tâches ci-dessous.

  1. Exécutez gcloud init et suivez les instructions :

    gcloud init

    Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

    gcloud init --console-only
  2. Suivez les instructions pour autoriser gcloud à utiliser votre compte Google Cloud.
  3. Créez ou sélectionnez une configuration.
  4. Choisissez un projet Google Cloud.
  5. Choisissez une zone Compute Engine par défaut pour les clusters zonaux ou une région pour les clusters régionaux ou Autopilot.

Utiliser gcloud config

  • Définissez votre ID de projet par défaut :
    gcloud config set project PROJECT_ID
  • Si vous utilisez des clusters zonaux, définissez votre zone de calcul par défaut :
    gcloud config set compute/zone COMPUTE_ZONE
  • Si vous utilisez des clusters Autopilot ou régionaux, définissez votre région de calcul par défaut :
    gcloud config set compute/region COMPUTE_REGION
  • Mettez à jour gcloud vers la dernière version :
    gcloud components update

Masquage d'adresses IP dans GKE

GKE se sert des règles iptables, ainsi que du DaemonSet ip-masq-agent, pour modifier l'adresse IP source des paquets envoyés depuis les pods vers certaines destinations. Lorsqu'un pod envoie un paquet à une adresse IP de destination dans une plage de masquage spécifiée, l'adresse IP du nœud est utilisée comme adresse source du paquet (et non comme adresse IP du pod).

GKE effectue un masquage d'adresses IP comme résumé dans ce tableau :

Configuration du cluster Comportement SNAT

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.

  • Soit ip-masq-agent n'est pas installé, soit vous n'avez pas spécifié de liste nonMasqueradeCIDRs dans le fichier ConfigMap de ip-masq-agent, 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. Ces valeurs par défaut dépendent de la version de GKE et du type d'image de nœud.

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.

  • Soit ip-masq-agent n'est pas installé, soit vous n'avez pas spécifié de liste nonMasqueradeCIDRs dans le fichier ConfigMap de ip-masq-agent, 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.

Modifiez ce comportement en vous assurant que ip-masq-agent est installé et que vous avez spécifié une liste nonMasqueradeCIDRs dans le fichier ConfigMap de ip-masq-agent.

Des informations supplémentaires sont disponibles dans le guide de l'utilisateur de l'agent de masquage d'adresses IP de la documentation de Kubernetes.

Lorsque le DaemonSet ip-masq-agent est inclus

Si l'une des conditions suivantes est remplie, le DaemonSet ip-masq-agent est automatiquement installé en tant que module complémentaire avec l'argument --nomasq-all-reserved-ranges dans un cluster GKE :

  • Le cluster utilise une règle de réseau.
  • La plage CIDR du cluster n'est pas 10.0.0.0/8.
  • Le cluster a été créé sans l'option --disable-default-snat et Workload Identity est activé.

Vous pouvez modifier les plages de destination en spécifiant nonMasqueradeCIDRs dans le fichier ConfigMap de ip-masq-agent. Si votre cluster n'inclut pas ip-masq-agent, vous pouvez installer ip-masq-agent manuellement.

Destinations non masquées par défaut

Le tableau suivant récapitule les plages de destination GKE non masquées par défaut pour les clusters créés sans l'option --disable-default-snat, à condition que l'une des affirmations suivantes soit vraie :

  • ip-masq-agent n'est pas déployé, ou
  • nonMasqueradeCIDRs n'est pas spécifié dans le fichier ConfigMap de ip-masq-agent.
Versions de GKE Type d'image de nœud Plages de destination Remarques
Toutes les versions Tous les types d'images 169.254.0.0/16
(plage d'adresses IP de liaison locale)
Vous pouvez modifier ce comportement en définissant masqLinkLocal sur True dans le fichier ConfigMap de ip-masq-agent.
Versions antérieures à 1.14 Container-optimized OS avec containerd (cos_containerd)
ou ip-masq-agent lancé avec l'argument --nomasq-all-reserved-ranges
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Vous pouvez modifier ce comportement en spécifiant une liste de plages CIDR dans nonMasqueradeCIDRs, dans le fichier ConfigMap de ip-masq-agent.

Consultez les plages valides des réseaux VPC pour en savoir plus sur l'utilisation des plages d'adresses réservées non-RFC 1918.
Autres types d'images sans le DaemonSet ip-masq-agent activé 10.0.0.0/8
Versions 1.14.1-gke.14, 1.14.2-gke.1 et versions ultérieures Tous les types d'images 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

Vérifier les règles de masquage dans iptables

Connectez-vous en SSH à l'un des nœuds ip-masq-agent et exécutez la commande suivante :

iptables -t nat -L IP-MASQ

Voici un exemple de résultat d'un cluster qui n'exécute pas le Daemonset ip-masq-agent, avec le pool de nœuds sur une version antérieure à 1.14 et qui utilise une image cos_cointainerd (consultez le tableau de la section ci-dessus pour plus de détails) :

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

Paramètres du fichier ConfigMap de ip-masq-agent

Les clés suivantes dans le fichier ConfigMap de ip-masq-agent vous permettent de spécifier des plages de destination non masquées et de modifier le comportement de ip-masq-agent. Le fichier ConfigMap doit être écrit au format YAML ou JSON et doit s'appeler config.

  • nonMasqueradeCIDRs : liste de chaînes au format CIDR spécifiant les plages d'adresses IP de destination pour lesquelles GKE n'utilise pas le masquage d'adresses IP. Si vous spécifiez une liste vide, GKE utilise le masquage d'adresses IP pour toutes les adresses de destination. S'il n'est pas spécifié, GKE utilise le masquage d'adresses IP pour les adresses de destination par défaut.
  • masqLinkLocal : valeur booléenne indiquant si le trafic à destination du préfixe de liaison locale (169.254.0.0/16) doit être masqué. La valeur par défaut est false.
  • resyncInterval : délai avant que ip-masq-agent ne recharge sa configuration (en écrivant dans /etc/config/ip-masq-agent depuis ConfigMap). Le format est Nx, N étant un entier et x une unité de temps, telle que s ou ms. Si elle n'est pas spécifiée, la valeur par défaut est 60 secondes.

Spécifier nonMasqueradeCIDRs

Le fichier ConfigMap suivant conserve l'adresse source pour les paquets envoyés vers la plage 10.0.0.0/8 :

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

Le fichier ConfigMap suivant vous montre comment utiliser le masquage d'adresses IP pour toutes les adresses de destination en spécifiant une liste vide pour nonMasqueradeCIDRs :

nonMasqueradeCIDRs:
resyncInterval: 60s
masqLinkLocal: true

Afin que le DaemonSet ip-masq-agent active le masquage d'adresses IP pour la plage de liaison locale, définissez la clé masqLinkLocal sur la valeur true dans le fichier ConfigMap.

Exemple :

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

Ajouter un fichier ConfigMap au cluster

Pour ajouter un fichier ConfigMap au cluster, exécutez la commande suivante à partir de la fenêtre d'interface système ou de terminal :

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

configmap-name est le nom que vous choisissez pour la ressource ConfigMap, par exemple ip-masq-agent.

Exemple :

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

Une fois la synchronisation terminée, les modifications doivent s'afficher dans iptables :

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

Créer manuellement une ressource ip-masq-agent (facultatif)

Vous devrez peut-être créer et configurer manuellement ip-masq-agent. Pour ce faire, vous devez déployer une ressource ip-masq-agent dans le cluster.

  1. Enregistrez le fichier manifeste suivant dans un fichier nommé ip-masq-agent.yaml localement :

    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. Exécutez la commande suivante :

    kubectl apply -f ip-masq-agent.yaml
    

Un DaemonSet nommé ip-masq-agent est alors créé. Il s'exécutera sur tous les nœuds de votre cluster.

Pour configurer l'outil ip-masq-agent, reportez-vous à la section Configurer l'agent à l'aide d'un fichier ConfigMap.

Restrictions

Les clusters exécutant ip-masq-agent sont soumis aux restrictions suivantes :

  • Si vous activez la visibilité intranœud et utilisez ip-masq-agent défini sur le paramètre nonMasqueradeCIDRs, nonMasqueradeCIDRs doit inclure le CIDR des pods. Sinon vous risquez de rencontrer des problèmes de connectivité intranœud.

Étape suivante