Controlar a comunicação em todo o cluster usando políticas de rede


Nesta página, explicamos como configurar políticas de rede em todo o cluster para o Google Kubernetes Engine (GKE).

As políticas de rede e as políticas de rede FQDN ajudam a definir regras de tráfego de comunicação entre os pods. As políticas de rede controlam como os pods se comunicam entre si nos aplicativos e com endpoints externos.

Como administrador de cluster, é possível configurar as políticas de rede em todo o cluster Cilium (CCNP, na sigla em inglês), que superam as limitações da política de rede para gerenciar o tráfego administrativo em todo o cluster. As políticas de rede em todo o cluster Cilium aplicam regras de rede rígidas para todas as cargas de trabalho no cluster inteiro, em namespaces, substituindo quaisquer regras específicas de aplicativo.

A política de rede em todo o cluster Cilium para o GKE é uma CustomResourceDefinition (CRD) com escopo de cluster que especifica as políticas aplicadas pelo GKE. Ao ativar a política de rede em todo o cluster Cilium no GKE, é possível gerenciar de maneira centralizada regras de rede para todo o cluster. É possível controlar o acesso básico da camada 3 (nível do IP) e da camada 4 (no nível da porta) para o tráfego que entra e sai do cluster.

Benefícios

Com a política de rede em todo o cluster Cilium, você pode:

  • Aplicar a segurança centralizada: com a CCNP, é possível definir regras de acesso que se aplicam à rede inteira. Essas regras da CCNP funcionam como uma camada de segurança de nível superior, substituindo qualquer política potencialmente conflitante no nível do namespace.
  • Proteger a multilocação: se o cluster hospeda várias equipes ou locatários, é possível proteger o isolamento em um cluster compartilhado implementando regras CCNP, que se concentram no controle do tráfego de rede. É possível aplicar a separação no nível da rede atribuindo namespaces ou grupos de namespaces a equipes específicas.
  • Definir políticas flexíveis padrão: com a CCNP, é possível definir regras de rede padrão o cluster inteiro. É possível personalizar essas regras quando necessário, sem comprometer a segurança geral do cluster.

Para implementar a CCNP, ative o GKE Dataplane V2 no seu cluster. Verifique se a CRD da CCNP está ativada e crie políticas que definam regras de acesso à rede para o cluster.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Requisitos

As políticas de rede em todo o cluster Cilium têm os seguintes requisitos:

  • Google Cloud CLI versão 465.0.0 ou mais recente.
  • Você precisa ter um cluster do GKE executando uma das seguintes versões:
    • 1.28.6-gke.1095000 ou mais recente.
    • 1.29.1-gke.1016000 ou mais recente
  • O cluster precisa usar o GKE Dataplane V2.
  • Ative a CRD da política de rede em todo o cluster Cilium.

Limitações

As políticas de rede em todo o cluster Cilium têm as seguintes limitações:

  • Não são compatíveis com as políticas da camada 7.
  • Não aceitam seletores de nós.
  • O número máximo de CiliumClusterwideNetworkPolicy por cluster é 1.000.

Ativar a política de rede em todo o cluster Cilium em um novo cluster

É possível ativar a política de rede em todo o cluster Cilium em um novo cluster usando a CLI do Google Cloud ou a API Google Kubernetes Engine.

gcloud

Para ativar a política de rede em todo o cluster Cilium em um novo cluster, crie um novo com a sinalização --enable-cilium-clusterwide-network-policy.

Autopilot

gcloud container clusters create-auto CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy

Substitua:

  • CLUSTER_NAME pelo nome do cluster.
  • COMPUTE_LOCATION pelo local do cluster.

Padrão

gcloud container clusters create CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy \
    --enable-dataplane-v2

Substitua:

  • CLUSTER_NAME pelo nome do cluster.
  • COMPUTE_LOCATION pelo local do cluster.

API

Para ativar a política de rede em todo o cluster Cilium, especifique as seguintes opções ao criar um novo cluster:

Campo datapathProvider no objeto networkConfig.

{
  "cluster": {
    ...
    "networkConfig": {
      "datapathProvider": "ADVANCED_DATAPATH",
      "enableCiliumClusterwideNetworkPolicy": true
    }
  }
}

Verifique se ciliumclusterwidenetworkpolicies.cilium.io está presente na saída do seguinte comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

A saída será semelhante a esta:

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

Ativar a política de rede em todo o cluster Cilium em um cluster atual

É possível ativar a política de rede em todo o cluster Cilium em um cluster atual usando a CLI do Google Cloud ou a API Google Kubernetes Engine.

gcloud

  1. Verifique se o GKE Dataplane V2 está ativado no cluster.

    gcloud container clusters describe CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --format="value(networkConfig.datapathProvider)" \
    

    Substitua:

    • CLUSTER_NAME pelo nome do cluster.
    • COMPUTE_LOCATION pelo local do cluster.
  2. Atualize o cluster usando a sinalização --enable-cilium-clusterwide-network-policy.

    gcloud container clusters update CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --enable-cilium-clusterwide-network-policy
    
  3. Reinicie o DaemonSet anetd.

    kubectl rollout restart ds -n kube-system anetd && \
        kubectl rollout status ds -n kube-system anetd
    

API

Verifique se o cluster está ativado para o GKE Dataplane V2:

{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  },
  "name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  }
  "name": "cluster"
}

Verifique se ciliumclusterwidenetworkpolicies.cilium.io está presente na saída do seguinte comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

A saída será semelhante a esta:

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

Como usar a política de rede em todo o cluster Cilium

Nesta seção, listamos exemplos de configuração da política de rede em todo o cluster Cilium.

Exemplo 1: controlar o tráfego de entrada para uma carga de trabalho

O exemplo a seguir permite que todos os endpoints com o rótulo role=backend aceitem conexões de entrada na porta 80 provenientes de endpoints com o rótulo role=frontend. Os endpoints com o rótulo role=backend rejeitarão todas as conexões de entrada que não sejam permitidas por essa política.

  1. Salve o seguinte manifesto como l4-rule-ingress.yaml:

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-ingress"
    spec:
      endpointSelector:
        matchLabels:
          role: backend
      ingress:
        - fromEndpoints:
            - matchLabels:
                role: frontend
          toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. Aplique o manifesto:

    kubectl apply -f l4-rule-ingress.yaml
    

Exemplo 2: restringir o tráfego de saída de uma carga de trabalho em uma determinada porta

A regra a seguir limita todos os endpoints com o rótulo app=myService para apenas emitirem pacotes usando TCP na porta 80 para qualquer destino Camada 3:

  1. Salve o seguinte manifesto como l4-rule-egress.yaml:

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-egress"
    spec:
      endpointSelector:
        matchLabels:
          app: myService
      egress:
        - toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. Aplique o manifesto:

    kubectl apply -f l4-rule-egress.yaml
    

Exemplo 3: restringir o tráfego de saída de uma carga de trabalho em uma determinada porta e CIDR

No exemplo a seguir, todos os endpoints com o rótulo role=crawler são limitados para que apenas possam enviar pacotes na porta 80, protocolos TCP, para um CIDR de destino 192.10.2.0/24.

  1. Salve o seguinte manifesto como cidr-l4-rule.yaml:

     apiVersion: "cilium.io/v2"
     kind: CiliumClusterwideNetworkPolicy
     metadata:
       name: "cidr-l4-rule"
     spec:
       endpointSelector:
         matchLabels:
           role: crawler
       egress:
         - toCIDR:
             - 192.0.2.0/24
           toPorts:
             - ports:
                 - port: "80"
                   protocol: TCP
    
  2. Aplique o manifesto:

    kubectl apply -f cidr-l4-rule.yaml
    

Como monitorar e solucionar problemas de tráfego de rede

É possível monitorar e resolver problemas do tráfego de rede afetado por políticas de rede em todo o cluster Cilium por meio da geração de registros de políticas de rede e observabilidade do GKE Dataplane V2.

Tentar usar políticas da camada 7 ou seletores de nós

Sintoma

Se você estiver usando o GKE com o GKE Dataplane V2 e tentar definir políticas CCNP que incluam regras da Camada 7 (por exemplo: filtragem HTTP) e seletores de nós, talvez veja uma mensagem de erro semelhante a esta:

Erro

Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'user@example.com', groups: 'system:authenticated'.

Possível causa

O GKE tem limitações específicas em CCNPs. As políticas da Camada 7, que permitem filtrar com base em dados no nível do aplicativo (como cabeçalhos HTTP) e seletores de nós não são compatíveis com a integração Cilium do GKE.

Resolução

Se você precisar de recursos avançados de filtragem da Camada 7 no cluster do GKE, considere usar o Cloud Service Mesh. Ele proporciona um controle de tráfego mais granular no nível do aplicativo.

Política de rede em todo o cluster Cilium não ativada

Sintoma

Ao tentar configurar políticas de rede em todo o cluster Cilium (CCNP) em um cluster em que o recurso não foi ativado explicitamente, não será possível configurá-lo e você talvez veja uma mensagem de erro semelhante a esta:

Erro

error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first

Possível causa

As políticas de rede em todo o cluster Cilium dependem de uma definição de recurso personalizada (CRD, na sigla em inglês). A mensagem de erro indica a falta de uma CRD no cluster.

Resolução

Ative a CRD da política de rede em todo o cluster Cilium antes de usar CCNPs.

A seguir