Configurer un agent de masquage d'adresses IP dans les clusters standards


Cette page explique comment configurer des clusters créés en mode Google Kubernetes Engine (GKE) Standard pour effectuer un masquage d'adresses IP avec ip-masq-agent. Pour en savoir plus sur le masquage d'adresses IP en mode GKE Autopilot, consultez la section Utiliser la règle NAT de sortie pour configurer le masquage d'adresses IP dans les clusters Autopilot.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.

Vérifier l'état de ip-masq-agent

Cette section vous explique comment :

  • Déterminer si votre cluster possède un DaemonSet ip-masq-agent.
  • Vérifier la ressource ConfigMap ip-masq-agent.

Vérifier le DaemonSet ip-masq-agent

Pour vérifier si votre cluster exécute le DaemonSet ip-masq-agent, utilisez Google Cloud CLI ou la console Google Cloud .

gcloud

  1. Récupérez les identifiants de votre cluster :

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Remplacez CLUSTER_NAME par le nom de votre cluster.

  2. Recherchez ip-masq-agent dans l'espace de noms kube-system :

    kubectl get daemonsets/ip-masq-agent -n kube-system
    

    Si le DaemonSet ip-masq-agent existe, le résultat ressemble à ce qui suit :

    NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    ip-masq-agent   3         3         3       3            3           <none>          13d
    

    Si le DaemonSet ip-masq-agent n'existe pas, le résultat ressemble à ce qui suit :

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    
  3. Vérifiez si le DaemonSet ip-masq-agent exécute la dernière version :

    kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
    

    Cette commande doit renvoyer la même image de conteneur que celle spécifiée dans Déployer le DaemonSet ip-masq-agent.

Console

  1. Accédez à la page Charges de travail dans la console Google Cloud .

    Accéder à la page Charges de travail

  2. Pour Filtrer, procédez comme suit :

    1. Cliquez sur pour effacer le filtre Is system object: False (Est un objet système : Faux).
    2. Filtrez les propriétés suivantes :
      • Nom : ip-masq-agent.
      • Cluster : nom de votre cluster.

    Si le DaemonSet ip-masq-agent existe, vous pouvez voir l'enregistrement DaemonSet dans la table. Si le DaemonSet ip-masq-agent n'existe pas, aucune ligne n'est affichée.

Pour créer le ConfigMap ip-masq-agent et déployer le DaemonSet ip-masq-agent, consultez la section Configurer et déployer le ip-masq-agent.

Vérifier le ConfigMap ip-masq-agent

Pour vérifier si votre cluster exécute le ConfigMap ip-masq-agent, utilisez Google Cloud CLI ou la console Google Cloud .

gcloud

  1. Récupérez les identifiants de votre cluster :

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Remplacez CLUSTER_NAME par le nom de votre cluster.

  2. Décrivez le ConfigMap ip-masq-agent dans l'espace de noms kube-system :

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    Si le ConfigMap ip-masq-agent existe, le résultat ressemble à ce qui suit :

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    
    Events:  <none>
    

    Si le ConfigMap ip-masq-agent n'existe pas, le résultat ressemble à ce qui suit :

    Error from server (NotFound): configmaps "ip-masq-agent" not found
    

Console

  1. Accédez à la page Configuration de la console Google Cloud .

    Accéder à la page "Configuration"

  2. Pour Filtrer, procédez comme suit :

    1. Cliquez sur pour effacer le filtre Is system object: False (Est un objet système : Faux).
    2. Filtrez les propriétés suivantes :
      • Nom : ip-masq-agent.
      • Cluster : nom de votre cluster.

    Si le ConfigMap ip-masq-agent existe, vous pouvez voir l'enregistrement ConfigMap dans la table. Si le ConfigMap ip-masq-agent n'existe pas, aucune ligne n'est affichée.

Si le cluster dispose déjà du ConfigMap ip-masq-agent, vous pouvez le configurer et le déployer.

Configurer et déployer la ressource ip-masq-agent

Cette section explique comment créer ou modifier le ConfigMap ip-masq-agent, et comment déployer ou supprimer le DaemonSet ip-masq-agent. Pour déterminer les tâches à effectuer, vous devez d'abord déterminer si votre cluster dispose déjà du ConfigMap ip-masq-agent et du DaemonSet ip-masq-agent.

Créer le ConfigMap ip-masq-agent

Les étapes suivantes montrent comment créer le ConfigMap ip-masq-agent. Si votre cluster dispose déjà du ConfigMap ip-masq-agent, modifiez plutôt un ConfigMap ip-masq-agent existant.

  1. Créez un fichier de configuration à l'aide du modèle suivant et enregistrez-le localement. Vous pouvez utiliser n'importe quel nom pour la copie locale de ce fichier de configuration.

    nonMasqueradeCIDRs:
      - CIDR_1
      - CIDR_2
    masqLinkLocal: false
    resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    

    Remplacez les éléments suivants :

    • CIDR_1 et CIDR_2 : plages d'adresses IP au format CIDR 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. Si vous avez besoin de plus de deux CIDR, ajoutez d'autres entrées à la liste nonMasqueradeCIDRs en suivant le même format. Au minimum, la propriété nonMasqueradeCIDRs doit inclure les plages d'adresses IP de nœud et de pod de votre cluster.

    • SYNC_INTERVAL : nombre de secondes après lesquelles chaque pod ip-masq-agent vérifie le contenu du ConfigMap ip-masq-agent et écrit les modifications apportées à son fichier /etc/config/ip-masq-agent local. Valeur par défaut : 60.

    • UNIT_OF_TIME : unité de temps de l'intervalle resyncInterval. Les valeurs valides incluent s (pour les secondes) ou ms (pour les millisecondes). Valeur par défaut : s.

    Définissez masqLinkLocal sur "false" (valeur par défaut), sauf si vous devez activer le masquage des paquets envoyés pour associer des adresses IPv4 locales. Pour en savoir plus, consultez la section Masquage vers des destinations de liaisons locales.

  2. Créez la ressource ConfigMap :

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

    Remplacez LOCAL_CONFIG_FILE_PATH par le chemin d'accès au fichier de configuration que vous avez créé à l'étape précédente.

  3. Décrivez le ConfigMap ip-masq-agent dans l'espace de noms kube-system :

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    Le résultat ressemble à ce qui suit :

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    Events:  <none>
    
    

    Ce résultat inclut le paramètre config avec vos modifications de configuration. Vous pouvez maintenant déployer le DaemonSet ip-masq-agent.

Modifier un ConfigMap ip-masq-agent existant

Vous pouvez modifier le contenu d'un ConfigMap ip-masq-agent existant en procédant comme suit :

  1. Ouvrez le ConfigMap dans un éditeur de texte :

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Modifiez le contenu du fichier ConfigMap :

    apiVersion: v1
    data:
      config: |
        nonMasqueradeCIDRs:
          - CIDR_1
          - CIDR_2
        masqLinkLocal: false
        resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    kind: ConfigMap
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    

    Remplacez les éléments suivants :

    • CIDR_1 et CIDR_2 : plages d'adresses IP au format CIDR 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. Si vous avez besoin de plus de deux CIDR, ajoutez d'autres entrées à la liste nonMasqueradeCIDRs en suivant le même format. Au minimum, la propriété nonMasqueradeCIDRs doit inclure les plages d'adresses IP de nœud et de pod de votre cluster.

    • SYNC_INTERVAL : nombre de secondes après lesquelles chaque pod ip-masq-agent vérifie le contenu du ConfigMap ip-masq-agent et écrit les modifications apportées à son fichier /etc/config/ip-masq-agent local. Valeur par défaut : 60.

    • UNIT_OF_TIME : unité de temps de l'intervalle resyncInterval. Les valeurs valides incluent s (pour les secondes) ou ms (pour les millisecondes). Valeur par défaut : s.

    Définissez masqLinkLocal sur "false" (valeur par défaut), sauf si vous devez activer le masquage des paquets envoyés pour associer des adresses IPv4 locales. Pour en savoir plus, consultez la section Masquage vers des destinations de liaisons locales.

  3. Décrivez le ConfigMap ip-masq-agent dans l'espace de noms kube-system :

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    Le résultat ressemble à ce qui suit :

    Name:         ip-masq-agent
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    config:
    ----
    nonMasqueradeCIDRs:
      - 198.15.5.92/24
      - 10.0.0.0/8
    masqLinkLocal: false
    resyncInterval: 60s
    
    BinaryData
    ====
    
    Events:  <none>
    

    Ce résultat inclut le paramètre config qui correspond à la valeur de configuration du fichier que vous avez créé.

Déployer le DaemonSet ip-masq-agent

Après avoir créé ou modifié votre ConfigMap ip-masq-agent, déployez le DaemonSet ip-masq-agent.

  1. Enregistrez le fichier manifeste suivant en tant que fichier 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: gke.gcr.io/ip-masq-agent:v2.12.3-gke.4@sha256:b5db41ddaf863b660da330322714f668101482b528829c50c53229d901d11af5
            args:
            - --v=2
            - --logtostderr=false
            - --log_file=/dev/stdout
            - --log_file_max_size=0
            # The masq-chain must be IP-MASQ
            - --masq-chain=IP-MASQ
            # To non-masquerade reserved IP ranges by default,
            # uncomment the following line.
            # - --nomasq-all-reserved-ranges
            # Must be set to false when using Dataplane V2.
            - --random-fully=false
            securityContext:
              privileged: false
              capabilities:
                drop: ["ALL"]
                add: ["NET_ADMIN", "NET_RAW"]
              allowPrivilegeEscalation: false
              seccompProfile:
                type: RuntimeDefault
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          volumes:
          - name: config-volume
            configMap:
              name: ip-masq-agent
              optional: true
              items:
              - key: config
                path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"

    Ce fichier manifeste crée un volume nommé config-volume qui est installé comme spécifié par le volumeMount du conteneur.

    Si vous devez modifier ce fichier manifeste, tenez compte des conditions suivantes :

    • Le nom du volume peut être choisi librement, mais il doit correspondre au nom volumeMount du conteneur.

    • Le nom du ConfigMap doit correspondre au nom du configMap référencé dans le volume config-volume du pod.

    • Le nom de la chaîne (--masq-chain) doit être IP-MASQ. Sinon, GKE ne remplace pas les règles de masquage par défaut.

    • Les pods DaemonSet lisent les données à partir du fichier ip-masq-agent. Le contenu du fichier ip-masq-agent correspond à la valeur de la clé config dans le ConfigMap.

    • Si vous utilisez des plages d'adresses IP réservées non masquées par défaut, annulez la mise en commentaire de la ligne - --nomasq-all-reserved-ranges dans la section arg.

  2. Déployez le DaemonSet :

    kubectl apply -f LOCAL_FILE_PATH
    

    Remplacez LOCAL_FILE_PATH par le chemin d'accès au fichier que vous avez créé à l'étape précédente.

Vous pouvez mettre à jour manuellement le DaemonSet ip-masq-agent que vous avez créé. Pour en savoir plus, consultez Mettre à jour un DaemonSet.

Supprimer la ressource ip-masq-agent

Cette section explique comment supprimer le DaemonSet ip-masq-agent et le ConfigMap ip-masq-agent. La suppression de ip-masq-agent ne rétablit pas les paramètres de masquage d'adresse IP existants sur les nœuds.

Supprimer le DaemonSet ip-masq-agent

Si vous avez créé manuellement le DaemonSet ip-masq-agent, vous pouvez le supprimer en exécutant la commande suivante :

kubectl delete daemonsets ip-masq-agent -n kube-system

Supprimer le ConfigMap ip-masq-agent

Pour supprimer complètement le ConfigMap ip-masq-agent, exécutez la commande suivante :

kubectl delete configmap ip-masq-agent -n kube-system

Dépannage

Les sections suivantes fournissent des conseils de dépannage.

Dépannage d'ordre général

Les étapes suivantes vous aident à diagnostiquer les problèmes liés au masquage d'adresse IP :

Problème : l'adresse IP du pod devient l'adresse IP du nœud

Lorsque vous utilisez un agent de masquage d'adresses IP, vous pouvez remarquer que l'adresse IP source du pod utilise de manière inattendue l'adresse IP du nœud lorsque vos pods communiquent avec des destinations externes.

Le problème est dû à une liste SNAT (Source Network Address Translation) personnalisée manquante ou incomplète. Lorsque vous utilisez un agent de masquage d'adresses IP, le SNAT par défaut du cluster est utilisé lorsque le ConfigMap est manquant ou qu'il ne contient pas de liste nonMasqueradeCIDRs. Lorsqu'un paquet quitte un pod, la SNAT par défaut remplace l'adresse IP source du pod par l'adresse IP interne du nœud. Pour en savoir plus sur SNAT, consultez Agent de masquage d'adresses IP.

Pour résoudre le problème, configurez une liste SNAT personnalisée en définissant une liste nonMasqueradeCIDRs dans le ConfigMap ip-masq-agent :

  1. Ouvrez le fichier ConfigMap ip-masq-agent :

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Examinez la liste nonMasqueradeCIDRs dans le ConfigMap. La liste nonMasqueradeCIDRs doit être présente et complète. Exemple :

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. Si la liste est manquante ou incomplète, ajoutez ou modifiez la liste nonMasqueradeCIDRs pour inclure les plages d'adresses IP de destination pour lesquelles vous souhaitez conserver les adresses IP de pod source. Cette liste doit également inclure les adresses que vous souhaitez utiliser avec Cloud NAT.

    Si vous ne souhaitez pas que le trafic externe utilise SNAT, définissez le champ nonMasqueradeCIDRs sur 0.0.0.0/0. Exemple :

    ...
    nonMasqueradeCIDRs:
      - 0.0.0.0/0
    ...
    

    Lorsque votre trafic n'utilise pas SNAT, tous les paquets envoyés depuis les pods conservent l'adresse IP du pod comme adresse IP source, quelle que soit la destination.

  4. Vérifiez l'adresse IP source des paquets sortants de vos pods. Pour vérifier cette adresse, effectuez une capture de paquets. Si cela n'est pas possible, vous pouvez vérifier l'adresse IP du nœud, qui doit être l'adresse IP source des paquets sortants soumis à SNAT, à l'aide de la commande suivante :

    kubectl get nodes -o wide
    

Étapes suivantes