Configurazione di un agente di mascheramento IP nei cluster standard


Questa pagina spiega come configurare i cluster creati in Google Kubernetes Engine (GKE) Standard per eseguire il mascheramento IP con ip-masq-agent. Per saperne di più sull'IP masquerading in modalità Autopilot di GKE, consulta Utilizzare il criterio NAT in uscita per configurare l'IP masquerading nei cluster Autopilot.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Controllo dello stato di ip-masq-agent

Questa sezione mostra come:

  • Determina se il cluster ha un DaemonSet ip-masq-agent.
  • Controlla la risorsa ip-masq-agent ConfigMap.

Controlla il DaemonSet ip-masq-agent

Per verificare se il cluster esegue il DaemonSet ip-masq-agent, utilizza Google Cloud CLI o la console Google Cloud .

gcloud

  1. Recupera le credenziali per il tuo cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Sostituisci CLUSTER_NAME con il nome del cluster.

  2. Cerca ip-masq-agent nello spazio dei nomi kube-system:

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

    Se esiste il DaemonSet ip-masq-agent, l'output è simile al seguente:

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

    Se il DaemonSet ip-masq-agent non esiste, l'output è simile al seguente:

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    
  3. Controlla se il DaemonSet ip-masq-agent esegue l'ultima versione:

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

    Questo comando deve restituire la stessa immagine container specificata in Deployment del DaemonSet ip-masq-agent.

Console

  1. Vai alla pagina Workload nella console Google Cloud .

    Vai a Carichi di lavoro

  2. Per il filtro , procedi nel seguente modo:

    1. Fai clic su per cancellare il filtro Is system object: False.
    2. Filtra le seguenti proprietà:
      • Nome: ip-masq-agent.
      • Cluster: il nome del cluster.

    Se esiste un DaemonSet ip-masq-agent, puoi visualizzare il record DaemonSet nella tabella. Se ip-masq-agent DaemonSet non esiste, non vengono visualizzate righe.

Per creare il ConfigMap ip-masq-agent ed eseguire il deployment del DaemonSet ip-masq-agent, consulta Configurazione ed esecuzione del deployment di ip-masq-agent.

Controllo di ConfigMap ip-masq-agent

Per verificare se il cluster esegue il ConfigMap ip-masq-agent, utilizza Google Cloud CLI o la console Google Cloud .

gcloud

  1. Recupera le credenziali per il tuo cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Sostituisci CLUSTER_NAME con il nome del cluster.

  2. Descrivi ConfigMap ip-masq-agent nello spazio dei nomi kube-system:

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

    Se esiste ConfigMap ip-masq-agent, l'output è simile al seguente:

    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>
    

    Se l'oggetto ConfigMap ip-masq-agent non esiste, l'output è simile al seguente:

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

Console

  1. Vai alla pagina Configurazione nella console Google Cloud .

    Vai a Configurazione

  2. Per il filtro , procedi nel seguente modo:

    1. Fai clic su per cancellare il filtro Is system object: False.
    2. Filtra le seguenti proprietà:
      • Nome: ip-masq-agent.
      • Cluster: il nome del cluster.

    Se esiste ConfigMap ip-masq-agent, puoi visualizzare il record ConfigMap nella tabella. Se ip-masq-agent ConfigMap non esiste, non vengono visualizzate righe.

Se il cluster ha già il ConfigMap ip-masq-agent, puoi configurarlo e deployarlo.

Configurazione e deployment di ip-masq-agent

Questa sezione mostra come creare o modificare il ConfigMap ip-masq-agent e come eseguire il deployment o eliminare il DaemonSet ip-masq-agent. Per determinare le attività da svolgere, devi prima stabilire se il tuo cluster dispone già di ConfigMap ip-masq-agent e DaemonSet ip-masq-agent.

Creazione di ConfigMap ip-masq-agent

I seguenti passaggi mostrano come creare ConfigMap ip-masq-agent. Se il tuo cluster ha già il ConfigMap ip-masq-agent, modifica un ConfigMap ip-masq-agent esistente.

  1. Crea un file di configurazione utilizzando il seguente modello e salvalo localmente. Puoi utilizzare qualsiasi nome per la copia locale di questo file di configurazione.

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

    Sostituisci quanto segue:

    • CIDR_1 e CIDR_2: gli intervalli di indirizzi IP in formato CIDR. Quando i pacchetti vengono inviati a queste destinazioni, il cluster non maschera le origini degli indirizzi IP e conserva gli indirizzi IP dei pod di origine. Se hai bisogno di più di due CIDR, aggiungi altre voci all'elenco nonMasqueradeCIDRs seguendo lo stesso formato. Come minimo, la proprietà nonMasqueradeCIDRs deve includere gli intervalli di indirizzi IP di nodi e pod del cluster.

    • SYNC_INTERVAL: il periodo di tempo dopo il quale ogni pod ip-masq-agent controlla i contenuti del ConfigMap e scrive le modifiche nel file /etc/config/ip-masq-agent locale.ip-masq-agent Il valore predefinito è 60.

    • UNIT_OF_TIME: l'unità di tempo per resyncInterval. I valori validi includono s (per i secondi) o ms (per i millisecondi). Il valore predefinito è s.

    Imposta masqLinkLocal su false (valore predefinito) a meno che tu non debba attivare il mascheramento per i pacchetti inviati agli indirizzi IPv4 link-local. Per ulteriori informazioni, vedi Mascheramento per destinazioni link-local.

  2. Crea la risorsa ConfigMap:

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

    Sostituisci LOCAL_CONFIG_FILE_PATH con il percorso del file di configurazione che hai creato nel passaggio precedente.

  3. Descrivi ConfigMap ip-masq-agent nello spazio dei nomi kube-system:

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

    L'output è simile al seguente:

    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>
    
    

    Questo output include il parametro config con le modifiche alla configurazione. Ora puoi eseguire il deployment del ip-masq-agent DaemonSet.

Modifica di un ConfigMap ip-masq-agent esistente

Puoi modificare i contenuti di un ConfigMap ip-masq-agent esistente completando i seguenti passaggi:

  1. Apri ConfigMap in un editor di testo:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Modifica i contenuti del file 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
    

    Sostituisci quanto segue:

    • CIDR_1 e CIDR_2: gli intervalli di indirizzi IP in formato CIDR. Quando i pacchetti vengono inviati a queste destinazioni, il cluster non maschera le origini degli indirizzi IP e conserva gli indirizzi IP dei pod di origine. Se hai bisogno di più di due CIDR, aggiungi altre voci all'elenco nonMasqueradeCIDRs seguendo lo stesso formato. Come minimo, la proprietà nonMasqueradeCIDRs deve includere gli intervalli di indirizzi IP di nodi e pod del cluster.

    • SYNC_INTERVAL: il periodo di tempo dopo il quale ogni pod ip-masq-agent controlla i contenuti del ConfigMap ip-masq-agent e scrive le modifiche nel file /etc/config/ip-masq-agent locale. Il valore predefinito è 60.

    • UNIT_OF_TIME: l'unità di tempo per resyncInterval. I valori validi includono s (per i secondi) o ms (per i millisecondi). Il valore predefinito è s.

    Imposta masqLinkLocal su false (valore predefinito) a meno che tu non debba attivare il mascheramento per i pacchetti inviati agli indirizzi IPv4 link-local. Per ulteriori informazioni, vedi Mascheramento per destinazioni link-local.

  3. Descrivi ConfigMap ip-masq-agent nello spazio dei nomi kube-system:

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

    L'output è simile al seguente:

    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>
    

    Questo output include il parametro config che corrisponde al valore di configurazione del file che hai creato.

Deployment del DaemonSet ip-masq-agent

Dopo aver creato o modificato il ConfigMap ip-masq-agent, esegui il deployment del DaemonSet ip-masq-agent.

  1. Salva il seguente manifest come file 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"

    Questo manifest crea un volume denominato config-volume che viene montato come specificato da volumeMount del container.

    Se devi modificare questo manifest, tieni presente le seguenti condizioni:

    • Il nome del volume può essere qualsiasi, ma deve corrispondere al nome volumeMount del container.

    • Il nome di ConfigMap deve corrispondere al nome di configMap a cui viene fatto riferimento nel volume config-volume del pod.

    • Il nome della catena (--masq-chain) deve essere IP-MASQ. In caso contrario, GKE non esegue l'override delle regole di mascheramento predefinite.

    • I pod DaemonSet vengono letti dal file ip-masq-agent. Il contenuto del file ip-masq-agent è il valore della chiave config in ConfigMap.

    • Se utilizzi intervalli IP riservati non di mascheramento per impostazione predefinita, rimuovi il commento dalla riga - --nomasq-all-reserved-ranges nella sezione arg.

  2. Esegui il deployment di DaemonSet:

    kubectl apply -f LOCAL_FILE_PATH
    

    Sostituisci LOCAL_FILE_PATH con il percorso del file che hai creato nel passaggio precedente.

Puoi aggiornare manualmente il DaemonSet ip-masq-agent che hai creato. Per saperne di più, vedi Aggiornamento di un DaemonSet.

Eliminazione di ip-masq-agent in corso…

Questa sezione mostra come eliminare il DaemonSet ip-masq-agent e il ConfigMap ip-masq-agent. L'eliminazione di ip-masq-agent non ripristina le impostazioni di mascheramento IP esistenti sui nodi.

Eliminazione di DaemonSet ip-masq-agent

Se hai creato manualmente il DaemonSet ip-masq-agent, puoi eliminarlo eseguendo il seguente comando:

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

Eliminazione di ConfigMap ip-masq-agent

Per eliminare completamente l'oggetto ConfigMap ip-masq-agent, esegui questo comando:

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

Risoluzione dei problemi

Le sezioni seguenti forniscono consigli per la risoluzione dei problemi.

Risoluzione dei problemi generali

I seguenti passaggi ti aiutano a diagnosticare i problemi relativi al mascheramento dell'indirizzo IP:

Problema: l'indirizzo IP del pod cambia in indirizzo IP del nodo

Quando utilizzi un agente di mascheramento IP, potresti notare che l'indirizzo IP di origine del pod utilizza inaspettatamente l'indirizzo IP del nodo quando i pod comunicano con destinazioni esterne.

Il problema è causato da un elenco di traduzione dell'indirizzo di rete di origine (SNAT) personalizzato mancante o incompleto. Quando utilizzi un agente IP masquerade, la SNAT predefinita del cluster viene utilizzata quando ConfigMap non è presente o non contiene un elenco di nonMasqueradeCIDRs. Quando un pacchetto esce da un pod, la SNAT predefinita modifica l'indirizzo IP di origine dall'indirizzo IP del pod all'indirizzo IP interno del nodo. Per saperne di più sulla SNAT, consulta la sezione Agente di mascheramento IP.

Per risolvere il problema, configura un elenco SNAT personalizzato definendo un elenco nonMasqueradeCIDRs nel ConfigMap ip-masq-agent:

  1. Apri il ConfigMap ip-masq-agent:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. Esamina l'elenco nonMasqueradeCIDRs all'interno di ConfigMap. L'elenco nonMasqueradeCIDRs deve essere presente e completo. Ad esempio:

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. Se l'elenco è mancante o incompleto, aggiungi o modifica l'elenco nonMasqueradeCIDRs in modo da includere gli intervalli di indirizzi IP di destinazione per i quali vuoi conservare gli indirizzi IP dei pod di origine. Questo elenco deve includere anche gli indirizzi per i quali vuoi utilizzare Cloud NAT.

    Se non vuoi che il traffico esterno utilizzi SNAT, imposta il campo nonMasqueradeCIDRs su 0.0.0.0/0. Ad esempio:

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

    Quando il traffico non utilizza SNAT, tutti i pacchetti inviati dai pod conservano l'indirizzo IP del pod come indirizzo IP di origine, indipendentemente dalla destinazione.

  4. Controlla l'indirizzo IP di origine dei pacchetti in uscita dai tuoi pod. Per controllare questo indirizzo, acquisisci un pacchetto. Se non è fattibile, puoi controllare l'indirizzo IP del nodo, che dovrebbe essere l'indirizzo IP di origine dei pacchetti in uscita soggetti a SNAT, con il seguente comando:

    kubectl get nodes -o wide
    

Passaggi successivi