Use o registo da política de rede

Esta página explica como usar o registo de políticas de rede para o Google Kubernetes Engine (GKE). As políticas de rede do Kubernetes especificam o tráfego de rede que os pods podem enviar e receber. O registo de políticas de rede permite-lhe registar quando uma ligação é permitida ou recusada por uma política de rede. O registo de políticas de rede pode ajudar a resolver problemas com políticas de rede.

Vista geral

Através do registo da política da rede, pode:

  • Verifique se as políticas de rede estão a funcionar conforme esperado.
  • Compreenda que Pods no seu cluster estão a comunicar com a Internet.
  • Compreender que namespaces estão a comunicar entre si.
  • Reconheça um ataque de negação de serviço.

Os registos de políticas de rede são carregados para o Cloud Logging para armazenamento, pesquisa, análise e alertas se o Cloud Logging estiver ativado. O Cloud Logging está ativado por predefinição em novos clusters. Consulte o artigo Configurar o registo e a monitorização para o GKE para mais informações.

Requisitos

  • O registo da política de rede só está disponível para clusters que usam o GKE Dataplane V2.
  • O registo de políticas de rede requer a CLI Google Cloud 303.0.0 ou superior.
  • O registo da política de rede não é suportado com pools de nós do Windows Server.

Preços

  • Não existem cobranças de geração de registos para o registo de políticas de rede.
  • Os registos podem ser encaminhados para o Pub/Sub, o Cloud Storage ou o BigQuery. Podem aplicar-se encargos do Pub/Sub, Cloud Storage ou BigQuery. Para mais informações, consulte o artigo Vista geral do encaminhamento e armazenamento.

Configurar registo de políticas de rede

Pode configurar as definições de registo da política de rede editando o objeto NetworkLogging no cluster. O GKE cria automaticamente um objeto NetworkLogging denominado default em novos clusters do Dataplane V2. Só pode existir um objeto NetworkLogging por cluster e não é possível mudar-lhe o nome.

Pode configurar o registo de ligações permitidas e o registo de ligações negadas separadamente. Também pode ativar seletivamente o registo para algumas políticas de rede. Segue-se um exemplo da especificação NetworkLogging, com definições especificadas para registar todas as ligações permitidas e recusadas:

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

Use kubectl para editar a configuração:

kubectl edit networklogging default

Especificação NetworkLogging

A especificação do objeto NetworkLogging está num formato YAML. Este formato é descrito na tabela seguinte:

CampoTipoDescrição
cluster.allowstruct Definições para o registo de ligações permitidas.
CampoTipoDescrição
log bool

Se estiver definido como true, as ligações permitidas no cluster são registadas; caso contrário, as ligações permitidas não são registadas.

As políticas de rede que selecionam o Pod e têm uma regra que corresponde à ligação são apresentadas na mensagem de registo.

delegate bool

Se false, todas as associações permitidas são registadas. Se várias políticas de rede permitirem uma ligação, todas as políticas correspondentes são apresentadas na mensagem de registo.

Se true, as ligações permitidas só são registadas se forem permitidas por uma política de rede com a anotação de registo policy.network.gke.io/enable-logging: "true". Se várias políticas de rede permitirem uma ligação, todas as políticas correspondentes com a anotação enable-logging são apresentadas na mensagem de registo.

Ocorre um erro de configuração se definir spec.cluster.allow.delegate como true e spec.cluster.allow.log como false.

cluster.deny struct Definições para registar ligações recusadas.
CampoTipoDescrição
log bool

Se for definida como true, as ligações recusadas no cluster são registadas; caso contrário, as ligações recusadas não são registadas.

delegate bool

Se false, todas as associações recusadas são registadas.

Se true, as ligações recusadas só são registadas se o pod onde a ligação foi recusada estiver num espaço de nomes com a anotação policy.network.gke.io/enable-deny-logging: "true".

Ocorre um erro de configuração se definir spec.cluster.deny.delegate como true e spec.cluster.deny.log como false.

Aceder aos registos da política de rede

Os registos de políticas de rede são carregados automaticamente para o Cloud Logging. Pode aceder aos registos através do Explorador de registos ou com a CLI do Google Cloud. Também pode encaminhar registos para um destino.

Cloud Logging

  1. Aceda à página Explorador de registos na Trusted Cloud consola.

    Aceda ao Explorador de registos

  2. Clique em Criador de consultas.

  3. Use a seguinte consulta para encontrar todos os registos de registo da política de rede:

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

    Substitua o seguinte:

    • CLUSTER_LOCATION: a localização do Compute Engine do cluster.
    • CLUSTER_NAME: o nome do seu cluster.
    • PROJECT_NAME: o nome do seu Trusted Cloud by S3NS projeto.

Consulte o artigo Usar o Explorador de registos para saber como usar o Explorador de registos.

Também pode criar uma consulta com o criador de consultas. Para criar uma consulta para registos de políticas de rede, selecione policy-action na lista pendente Nome do registo. Se não existirem registos disponíveis, policy-action não aparece na lista pendente.

gcloud

Encontre todos os registos de registo da política de rede:

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"'

Substitua o seguinte:

  • PROJECT_NAME: o nome do seu Trusted Cloud by S3NS projeto.
  • CLUSTER_LOCATION: a localização do Compute Engine do cluster.
  • CLUSTER_NAME: o nome do seu cluster.

Pode adicionar mais condições para filtrar os resultados. Por exemplo:

  • Mostrar registos num determinado período:

    timestamp>="2020-06-22T06:30:51.128Z"
    timestamp<="2020-06-23T06:30:51.128Z"
    
  • Mostrar registos de ligações recusadas:

    jsonPayload.disposition="deny"
    
  • Mostrar registos de uma implementação denominada "redis":

    jsonPayload.dest.pod_name=~"redis"
    jsonPayload.dest.pod_namespace="default"
    
  • Mostrar registos de ligações externas ao cluster:

    jsonPayload.dest.instance != ""
    
  • Mostrar registos que correspondam a uma determinada política de rede, neste caso, "allow-frontend-to-db":

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

Se usar um cluster padrão, também pode encontrar os registos da política de rede gerados em cada nó do cluster localmente em /var/log/network/policy_action.log*. É criado um novo ficheiro de registo numerado quando o ficheiro de registo atual atinge 10 MB. São armazenados até cinco ficheiros de registo anteriores.

Formato do registo da política de rede

Os registos de registo de políticas de rede estão num formato JSON. Este formato é descrito na tabela seguinte:

CampoTipoDescrição
connectionstruct Informações de ligação:
CampoTipoDescrição
src_ipstringEndereço IP de origem da ligação.
src_portintPorta de origem da ligação.
dest_ipstringEndereço IP de destino da ligação.
dest_portintPorta de destino da ligação.
protocolstringProtocolo da ligação, que pode ser tcp, udp ou icmp.
directionstringDireção da associação, que pode ser ingress ou egress.
srcstruct Informações do ponto final da origem:
CampoTipoDescrição
pod_namestringNome do Pod, se a origem for um Pod.
pod_namespace (deprecated)stringEspaço de nomes do pod, se a origem for um pod. pod_namespace foi descontinuado. Em alternativa, use namespace.
namespacestringEspaço de nomes do pod, se a origem for um pod.
workload_namestringNome da carga de trabalho, se a carga de trabalho de origem estiver disponível.
workload_kindstringTipo de carga de trabalho, se a carga de trabalho de origem estiver disponível.
instancestringEndereço IP da origem, se a origem não for um pod.
deststruct Informações do ponto final do destino:
CampoTipoDescrição
pod_namestringNome do Pod, se o destino for um Pod.
pod_namespace (deprecated)stringEspaço de nomes do pod, se o destino for um pod. pod_namespace foi descontinuado. Em alternativa, use namespace.
namespacestringEspaço de nomes do pod, se o destino for um pod.
workload_namestringNome da carga de trabalho, se a carga de trabalho de destino estiver disponível.
workload_kindstringTipo de carga de trabalho, se a carga de trabalho de destino estiver disponível.
instancestringEndereço IP da origem, se o destino não for um pod.
dispositionstringDisposição da associação, que pode ser allow ou deny.
policieslist of structs

Políticas correspondentes para as ligações permitidas a partir da vista de pods aplicados. Para a ligação de entrada, o pod aplicado é o pod de destino. Para a ligação de saída, o pod aplicado é o pod de origem. São registadas várias políticas se uma ligação corresponder a todas elas.

Este campo só está incluído nos registos de ligações permitidas.

CampoTipoDescrição
namestringNome da política de rede correspondente.
namespacestringEspaço de nomes da política de rede correspondente.
countintUsado para a agregação de registos de consultas recusadas. O valor é sempre 1 para a ligação permitida.
node_namestringO nó que executa o pod que gerou esta mensagem de registo.
timestampstringQuando ocorreu a tentativa de ligação.

Definição de ligação

Para protocolos orientados para a ligação, como o TCP, é criado um registo para cada ligação permitida ou recusada. Para protocolos como UDP e ICMP que não são orientados para a ligação, os pacotes são agrupados em ligações baseadas em janelas de tempo.

Registos de políticas para ligações recusadas

Os registos dos registos para ligações recusadas não incluem o campo policies porque a API de política de rede do Kubernetes não tem políticas de recusa explícitas. Uma ligação é recusada se um Pod estiver abrangido por uma ou mais políticas de rede, mas nenhuma das políticas permitir a ligação. Isto significa que nenhuma política é individualmente responsável por uma ligação bloqueada.

Agregação de registos para ligações recusadas

É comum um cliente tentar novamente uma ligação que foi recusada. Para evitar o registo excessivo, as ligações recusadas repetidas num período de cinco segundos são agregadas numa única mensagem de registo através do campo count.

As ligações recusadas subsequentes são agregadas com uma mensagem de registo anterior se o src_ip, dest_ip, dest_port, protocol,e o direction da ligação corresponderem à primeira ligação recusada. Tenha em atenção que a src_port das ligações subsequentes não tem de corresponder, uma vez que as ligações repetidas podem vir de uma porta diferente. A mensagem de registo agregada inclui o src_prt da primeira ligação recusada no início do período de agregação.

Exemplos de registos de logs

A seguinte política de rede de exemplo denominada allow-green aplicada a test-service permite ligações a test-service a partir de um pod denominado client-green. Implicitamente, esta política nega todo o outro tráfego de entrada para test-service, incluindo a partir do 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

Este diagrama mostra o efeito da política allow-green em duas ligações a test-service. A política allow-green permite a ligação a partir de client-green. Uma vez que nenhuma política permite a ligação a partir de client-red, a ligação é recusada.

imagem

O registo da ligação permitida de client-green tem o seguinte aspeto:

{
   "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"
}

O registo da ligação recusada de client-red tem o seguinte aspeto:

{
   "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"
}

Tenha em atenção que o registo de ligação recusada não inclui o campo policies. Isto é descrito na secção anterior, Registos de políticas para ligações recusadas.

O registo de ligações recusadas inclui um campo count para agregar ligações recusadas.

Resolução de problemas com registos de políticas de rede

  1. Verifique se existem eventos de erros no objeto NetworkLogging:

    kubectl describe networklogging default
    

    Se a configuração de registo for inválida, a configuração não é aplicada e é comunicado um erro na secção de eventos:

    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. Para limitar a utilização da CPU gasta no registo, um nó pode registar até 500 ligações por segundo antes de começar a rejeitar registos. As políticas de rede no nó continuam a ser aplicadas. Pode verificar se existem registos de políticas rejeitados verificando se algum contador de erros está a aumentar:

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

    Substitua ANETD_POD_NAME pelo nome de um anetd Pod. Verifique cada nó. O anetd é o controlador de rede para o Dataplane V2.

Os registos sem nome são apresentados para pods com políticas de recusa predefinidas

As sondas de atividade, prontidão e arranque requerem que o pod aceite ligações de entrada feitas pelas sondas do kubelet. Para garantir que estas sondas funcionam corretamente, o GKE permite automaticamente o tráfego de sondas para o pod selecionado, conforme configurado para o pod, independentemente das políticas de rede aplicadas ao pod. Não pode alterar este comportamento.

Os registos das ligações de sondagem são semelhantes aos seguintes:

{
   "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"
}

O registo tem as seguintes características:

  • O valor de policies.name está vazio porque não existe uma política de rede associada para permitir a ligação.
  • O valor de connection.src_ip não corresponde a nenhum pod ou nó.

O que se segue?