Utilizzo del logging dei criteri di rete


Questa pagina spiega come utilizzare il logging dei criteri di rete per Google Kubernetes Engine (GKE). Kubernetes norme della rete e specificare il traffico di rete che i pod possono inviare e ricevere. Rete il logging dei criteri consente di registrare quando una connessione viene consentita o rifiutata da un criterio di rete. Il logging dei criteri di rete può aiutarti a risolvere i problemi relativi a criteri di rete.

Panoramica

Con il logging dei criteri di rete è possibile:

  • Verifica che i criteri di rete funzionino come previsto.
  • Scopri quali pod nel tuo cluster comunicano con internet.
  • Comprendi quali spazi dei nomi comunicano tra loro.
  • Riconoscere un attacco Denial of Service.

I log dei criteri di rete vengono caricati su Cloud Logging per l'archiviazione ricerca, analisi e avvisi se Cloud Logging è abilitato. Cloud Logging è abilitata per impostazione predefinita nei nuovi cluster. Consulta Scopri di più sulla configurazione del logging e del monitoraggio per GKE.

Requisiti

  • Il logging dei criteri di rete è disponibile solo per i cluster che utilizzano GKE Dataplane V2.
  • Il logging dei criteri di rete richiede Google Cloud CLI 303.0.0 o versioni successive.
  • Il logging dei criteri di rete non è supportato con i pool di nodi di Windows Server.

Prezzi

  • Non sono previsti costi per la generazione di log per il logging dei criteri di rete.
  • I log possono essere ulteriormente instradati a Pub/Sub, Cloud Storage o in BigQuery. Pub/Sub, Cloud Storage o BigQuery potrebbero essere addebitati costi aggiuntivi. Per ulteriori informazioni, vedi Panoramica su routing e archiviazione.

Configurazione del logging dei criteri di rete

Per configurare le impostazioni di logging dei criteri di rete devi modificare NetworkLogging nel tuo cluster. GKE crea automaticamente Oggetto NetworkLogging denominato default nel nuovo Dataplane V2 cluster. Può esserci un solo Oggetto NetworkLogging per cluster e non può essere rinominato.

Puoi configurare il logging delle connessioni consentite e il logging delle connessioni negate separatamente le connessioni. Puoi anche attivare selettivamente il logging per alcune reti criteri. Di seguito è riportato un esempio della specifica NetworkLogging, con impostazioni specificato per registrare tutte le connessioni consentite e negate:

kind: NetworkLogging
apiVersion: networking.gke.io/v1alpha1
metadata:
  name: default
spec:
  cluster:
    allow:
      log: true
      delegate: false
    deny:
      log: true
      delegate: false

Utilizza kubectl per modificare la configurazione:

kubectl edit networklogging default

Specifica NetworkLogging

La specifica dell'oggetto NetworkLogging è in formato YAML. Questo formato è descritti nella seguente tabella:

CampoTipoDescrizione
cluster.allowstruct Impostazioni per il logging delle connessioni consentite.
CampoTipoDescrizione
log bool

Se impostato su true, le connessioni consentite nel cluster vengono registrate. altrimenti le connessioni consentite non vengono registrate.

I criteri di rete che selezionano il pod e hanno una regola corrispondente alla connessione sono elencati nel messaggio di log.

delegate bool

Se false, vengono registrate tutte le connessioni consentite. Se più criteri di rete consentono una connessione, tutti i criteri corrispondenti vengono elencati nel messaggio di log.

Se true, le connessioni consentite vengono registrate solo se sono consentite da un criterio di rete con l'annotazione di logging policy.network.gke.io/enable-logging: "true". Se più criteri di rete consentono una connessione, tutti i criteri corrispondenti con l'annotazione enable-logging sono elencati nel messaggio di log.

Se imposti spec.cluster.allow.delegate su true e spec.cluster.allow.log su false, si verifica un errore di configurazione.

cluster.deny struct Impostazioni per il logging delle connessioni negate.
CampoTipoDescrizione
log bool

Se il criterio viene impostato su true, le connessioni negate nel cluster vengono registrate. altrimenti le connessioni negate non vengono registrate.

delegate bool

Se false, vengono registrate tutte le connessioni negate.

Se true, le connessioni negate vengono registrate solo se il pod in cui è stata negata la connessione si trova in uno spazio dei nomi con l'annotazione policy.network.gke.io/enable-deny-logging: "true".

Se imposti spec.cluster.deny.delegate su true e spec.cluster.deny.log su false, si verifica un errore di configurazione.

Accesso ai log dei criteri di rete

I log dei criteri di rete vengono caricati automaticamente Cloud Logging. Puoi accedere ai log tramite Esplora log o con Google Cloud CLI. Puoi anche indirizza i log a un sink.

Cloud Logging

  1. Vai alla pagina Esplora log nella console Google Cloud.

    Vai a Esplora log

  2. Fai clic su Query Builder.

  3. Utilizza la seguente query per trovare tutti i record di log dei criteri di rete:

    resource.type="k8s_node"
    resource.labels.location="CLUSTER_LOCATION"
    resource.labels.cluster_name="CLUSTER_NAME"
    logName="projects/PROJECT_NAME/logs/policy-action"
    

    Sostituisci quanto segue:

    • CLUSTER_LOCATION: il Località di Compute Engine nel cluster.
    • CLUSTER_NAME: il nome del tuo cluster.
    • PROJECT_NAME: il nome del tuo progetto Google Cloud.

Consulta Utilizzo di Esplora log per imparerai a utilizzare Esplora log.

Puoi anche creare una query utilizzando Query Builder. Per creare una query Per i log dei criteri di rete, seleziona policy-action in Nome log dall'elenco a discesa. Se non ci sono log disponibili, policy-action non vengono visualizzate nell'elenco a discesa.

gcloud

Trova tutti i record dei log dei criteri di rete:

gcloud logging read --project "PROJECT_NAME" 'resource.type="k8s_node"
    resource.labels.location="CLUSTER_LOCATION"
    resource.labels.cluster_name="CLUSTER_NAME"
    logName="projects/PROJECT_NAME/logs/policy-action"'

Sostituisci quanto segue:

  • PROJECT_NAME: il nome del tuo progetto Google Cloud.
  • CLUSTER_LOCATION: il Località di Compute Engine nel cluster.
  • CLUSTER_NAME: il nome del tuo cluster.

Puoi aggiungere altre condizioni per filtrare i risultati. Ad esempio:

  • Mostra i log in un determinato periodo di tempo:

    timestamp>="2020-06-22T06:30:51.128Z"
    timestamp<="2020-06-23T06:30:51.128Z"
    
  • Mostra i log per le connessioni negate:

    jsonPayload.disposition="deny"
    
  • Mostra i log di un deployment denominato "redis":

    jsonPayload.dest.pod_name=~"redis"
    jsonPayload.dest.pod_namespace="default"
    
  • Mostra i log per le connessioni cluster-esterne:

    jsonPayload.dest.instance != ""
    
  • Mostra i log che corrispondono a un determinato criterio di rete, in questo caso &quot;allow-frontend-to-db&quot;:

    jsonPayload.policies.name="allow-frontend-to-db"
    jsonPayload.policies.namespace="default"
    

Se utilizzi un cluster Standard, puoi anche trovare il criterio di rete generati su ciascun nodo del cluster localmente /var/log/network/policy_action.log*. Quando viene creato un nuovo file di log numerato il file di log attuale raggiunge i 10 MB. Vengono archiviati fino a cinque file di log precedenti.

Formato del log dei criteri di rete

I record di log dei criteri di rete sono in formato JSON. Questo formato viene descritto la tabella seguente:

CampoTipoDescrizione
connectionstruct Informazioni di connessione:
CampoTipoDescrizione
src_ipstringIndirizzo IP di origine della connessione.
src_portintPorta di origine della connessione.
dest_ipstringIndirizzo IP di destinazione della connessione.
dest_portintPorta di destinazione della connessione.
protocolstringProtocollo di connessione, che può essere tcp, udp o icmp.
directionstringDirezione della connessione, che può essere ingress o egress.
srcstruct Informazioni endpoint dell'origine:
CampoTipoDescrizione
pod_namestringNome del pod, se l'origine è un pod.
pod_namespace (deprecated)stringSpazio dei nomi del pod, se l'origine è un pod. L'API pod_namespace è deprecata, utilizza namespace.
namespacestringSpazio dei nomi del pod, se l'origine è un pod.
workload_namestringNome del carico di lavoro, se quello di origine è disponibile.
workload_kindstringTipo di carico di lavoro, se quello di origine è disponibile.
instancestringIndirizzo IP dell'origine, se l'origine non è un pod.
deststruct Informazioni endpoint della destinazione:
CampoTipoDescrizione
pod_namestringNome del pod, se la destinazione è un pod.
pod_namespace (deprecated)stringSpazio dei nomi del pod, se la destinazione è un pod. L'API pod_namespace è deprecata, utilizza namespace.
namespacestringSpazio dei nomi del pod, se la destinazione è un pod.
workload_namestringNome del carico di lavoro, se quello di destinazione è disponibile.
workload_kindstringTipo di carico di lavoro, se il carico di lavoro di destinazione è disponibile.
instancestringIndirizzo IP dell'origine, se la destinazione non è un pod.
dispositionstringDisposizione della connessione, che può essere allow o deny.
policieslist of structs

Criteri corrispondenti per le connessioni consentite dalla vista del pod applicato. Per la connessione in entrata, il pod applicato è il pod di destinazione. Per la connessione in uscita, il pod applicato è il pod di origine. Vengono registrati più criteri se tutti i criteri corrispondono a una connessione.

Questo campo è incluso solo nei log delle connessioni consentite.

CampoTipoDescrizione
namestringNome del criterio di rete corrispondente.
namespacestringSpazio dei nomi del criterio di rete corrispondente.
countintUtilizzato per l'aggregazione dei log delle query negate. Il valore è sempre 1 per la connessione consentita.
node_namestringIl nodo che esegue il pod che ha generato questo messaggio di log.
timestampstringQuando si è verificato il tentativo di connessione.

Definizione di connessione

Per i protocolli orientati alla connessione come TCP, viene creato un log per ogni o connessione negata. Per protocolli come UDP e ICMP che non sono orientate alla connessione, i pacchetti sono raggruppati in connessioni basate su intervallo temporale.

Log dei criteri per le connessioni negate

I record di log per le connessioni negate non includono il campo policies perché l'API dei criteri di rete di Kubernetes non ha criteri di negazione espliciti. Una connessione viene negata se un pod è coperto da uno o più criteri di rete, ma nessuno dei criteri consente la connessione. Ciò significa che responsabile del blocco della connessione.

Aggregazione dei log per connessioni negate

Capita spesso che un client ripeta una connessione rifiutata. Per evitare un numero eccessivo di registrazioni, connessioni negate ripetute in una finestra di cinque secondi vengono e aggregati in un singolo messaggio di log mediante il campo count.

Le connessioni negate successive vengono aggregate a un messaggio di log precedente se src_ip, dest_ip, dest_port, protocol, e direction della connessione corrispondono prima connessione negata. Tieni presente che il valore di src_port delle connessioni successive non devono corrispondere perché le connessioni tentate potrebbero provenire da una porta diversa. Il messaggio di log aggregato include src_prt della prima connessione negata all'inizio della finestra di aggregazione.

Esempi di record di log

Il seguente criterio di rete di esempio denominato allow-green è stato applicato a test-service consente le connessioni a test-service da un pod denominato client-green. Questo criterio nega implicitamente tutto il traffico in entrata verso test-service anche dal pod client-red.

  apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    name: allow-green
    namespace: default
    annotations:
      policy.network.gke.io/enable-logging: "true"
  spec:
    podSelector:
      matchLabels:
        app: test-service
    ingress:
    - from:
      - podSelector:
          matchLabels:
            app: client-green
    policyTypes:
    - Ingress

Questo diagramma mostra l'effetto del criterio allow-green su due connessioni a test-service. Il criterio allow-green consente la connessione da client-green. Poiché nessun criterio consente la connessione da client-red il connessione negata.

immagine

Il log per la connessione consentita da client-green ha il seguente aspetto:

{
   "connection":{
      "src_ip":"10.84.0.252",
      "dest_ip":"10.84.0.165",
      "src_port":52648,
      "dest_port":8080,
      "protocol":"tcp",
      "direction":"ingress"
   },
   "disposition":"allow",
   "policies":[
      {
         "name":"allow-green",
         "namespace":"default"
      }
   ],
   "src":{
      "pod_name":"client-green-7b78d7c957-68mv4",
      "pod_namespace":"default",
      "namespace":"default",
      "workload_name":"client-green-7b78d7c957",
      "workload_kind":"ReplicaSet"
   },
   "dest":{
      "pod_name":"test-service-745c798fc9-sfd9h",
      "pod_namespace":"default",
      "namespace":"default",
      "workload_name":"test-service-745c798fc9",
      "workload_kind":"ReplicaSet"
   },
   "count":1,
   "node_name":"gke-demo-default-pool-5dad52ed-k0h1",
   "timestamp":"2020-06-16T03:10:37.993712906Z"
}

Il log per la connessione negata da client-red ha il seguente aspetto:

{
   "connection":{
      "src_ip":"10.84.0.180",
      "dest_ip":"10.84.0.165",
      "src_port":39610,
      "dest_port":8080,
      "protocol":"tcp",
      "direction":"ingress"
   },
   "disposition":"deny",
   "src":{
      "pod_name":"client-red-5689846f5b-b5ccx",
      "pod_namespace":"default",
      "namespace":"default",
      "workload_name":"client-red-5689846f5b",
      "workload_kind":"ReplicaSet"
   },
   "dest":{
      "pod_name":"test-service-745c798fc9-sfd9h",
      "pod_namespace":"default",
      "namespace":"default",
      "workload_name":"test-service-745c798fc9",
      "workload_kind":"ReplicaSet"
   },
   "count":3,
   "node_name":"gke-demo-default-pool-5dad52ed-k0h1",
   "timestamp":"2020-06-15T22:38:32.189649531Z"
}

Tieni presente che il log delle connessioni negate non include il campo policies. Questo è descritto nella sezione precedente, Log dei criteri per le connessioni negate.

Il log per le connessioni negate include un campo count per aggregazione delle connessioni negate.

Risoluzione dei problemi relativi ai log dei criteri di rete

  1. Verifica la presenza di eventi di errore nell'oggetto NetworkLogging:

    kubectl describe networklogging default
    

    Se la configurazione del logging non è valida, non prenderà l'effetto e un errore verranno riportati nella sezione Eventi:

    Name:         default
    Namespace:
    Labels:       addonmanager.kubernetes.io/mode=EnsureExists
    Annotations:  API Version:  networking.gke.io/v1alpha1
    Kind:         NetworkLogging
    Metadata:
      Creation Timestamp:  2020-06-20T05:54:08Z
      Generation:          8
      Resource Version:    187864
      Self Link:           /apis/networking.gke.io/v1alpha1/networkloggings/default
      UID:                 0f1ddd6e-4193-4295-9172-baa6a52aa6e6
    Spec:
      Cluster:
        Allow:
          Delegate:  true
          Log:       false
        Deny:
          Delegate:  false
          Log:       false
    Events:
      Type     Reason                 Age                From                                                               Message
      ----     ------                 ----               ----                                                               -------
      Warning  InvalidNetworkLogging  16s (x3 over 11h)  network-logging-controller, gke-anthos-default-pool-cee49209-0t09  cluster allow log action is invalid: delegate cannot be true when log is false
      Warning  InvalidNetworkLogging  16s (x3 over 11h)  network-logging-controller, gke-anthos-default-pool-cee49209-80fx  cluster allow log action is invalid: delegate cannot be true when log is false
    
  2. Per limitare l'utilizzo della CPU speso per il logging, un nodo può registrare fino a 500 al secondo prima di iniziare a eliminare i log. I criteri di rete sul nodo sono ancora in fase di applicazione. Puoi vedere se sono stati eliminati log dei criteri controllando se i contatori di errori stanno incrementando:

    kubectl exec ANETD_POD_NAME -n kube-system -- curl -s http://localhost:9990/metrics |grep policy_logging
    

    Sostituisci ANETD_POD_NAME con il nome di un account all'interno del pod. Controlla ciascun nodo. anetd è il controller di rete per Dataplane V2.

I log senza nome vengono visualizzati per i pod con criteri di negazione predefiniti

Probe di attività, idoneità e avvio richiedono che il pod accetti connessioni Ingress effettuate dai probe da kubelet. Per assicurarti che questi probe funzionino correttamente, GKE consente automaticamente il traffico di probe al pod selezionato configurato per il pod, a prescindere dai criteri di rete applicati al pod. Non puoi modificare questo comportamento.

I log per le connessioni del probe sono simili ai seguenti:

{
   "connection":{
      "src_ip":"10.88.1.1",
      "dest_ip":"10.88.1.4",
      "src_port":35848,
      "dest_port":15021,
      "protocol":"tcp",
      "direction":"ingress"
   },
   "disposition":"allow",
   "src":{
      "instance":"10.88.1.1"
   },
   "dest":{
      "pod_name":"testpod-745c798fc9-sfd9h",
      "pod_namespace":"default",
      "namespace":"default",
      "workload_name":"testpod-745c798fc9",
      "workload_kind":"ReplicaSet"
   },
   "count":1,
   "policies": [
     {
       "name":""
     }
    ],
   "node_name":"gke-demo-default-pool-5dad52ed-k0h1",
   "timestamp":"2021-04-01T12:42:32.1898720941Z"
}

Il log ha le seguenti caratteristiche:

  • Il valore di policies.name è vuoto perché non esiste una rete associata per consentire la connessione.
  • Il valore di connection.src_ip non corrisponde ad alcun pod o nodo.

Passaggi successivi