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 Google Cloud Console.

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
    

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 Google Cloud Console.

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 dans 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.11.0-gke.23@sha256:f50757332ee45c0fb9f5856552a3ed16548c1de3c33c4e520a02d22e30af96ae
            args:
            # 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 la section 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 du pool d'adresses IP ip-masq-agent ne rétablit pas les paramètres de masquage d'adresses 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 étapes suivantes fournissent des informations de dépannage :

  • Confirmez l'état de l'objet ip-masq-agent. Si le ConfigMap n'est pas défini, le trafic vers toutes les destinations par défaut n'est pas masqué et conserve l'adresse IP du pod. Le trafic vers d'autres destinations conserve l'adresse IP du nœud.
  • Vérifiez si la chaîne IP-MASQ est correctement renseignée dans les tables d'adresses IP NAT en exécutant la commande sudo iptables -t nat -L IP-MASQ dans le nœud concerné. Si la liste nonMasqueradeCIDRs définie dans le ConfigMap n'apparaît pas dans les tables d'adresses IP NAT, vérifiez que le fichier de configuration utilisé pour créer le ConfigMap ne contient pas de fautes de frappe.
  • Vérifiez que la destination que le pod tente d'atteindre est incluse dans l'objet nonMasqueradeCIDRs du ConfigMap. Si la destination ne se trouve pas dans nonMasqueradeCIDRs, le trafic conserve l'adresse IP du nœud.
  • Vérifiez que la destination autorise à la fois les plages d'adresses IP des nœuds et des pods.
  • Si le trafic n'est pas accessible depuis le nœud ou le pod, exécutez un test de connectivité.

Étape suivante