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 para todas as cargas de trabalho no cluster inteiro. Na hierarquia de avaliação de políticas do GKE, essas políticas residem no nível NetworkPolicy. Embora as regras explícitas de Negação em uma CCNP substituam as regras de permissão em políticas com escopo de namespace, as regras de Permissão da CCNP têm a mesma precedência que as políticas de namespace padrão. Todas as regras de CCNP estão subordinadas às políticas no nível de administrador.

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 ao cluster inteiro. Essas regras substituem qualquer política potencialmente conflitante no nível do namespace se forem regras explícitas de Negação. As regras de permissão da CCNP residem no mesmo nível que as políticas de namespace padrão. Para mandatos, use o nível de administrador em ClusterNetworkPolicy.
  • 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 para 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 CustomResourceDefinition 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:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Para usar a Google Cloud CLI nesta tarefa, instale e inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

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.
  • O cluster precisa usar o GKE Dataplane V2.
  • Ative a CustomResourceDefinition 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 Google Cloud CLI ou a API 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.

Piloto automático

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 o CustomResourceDefinition 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 Google Cloud CLI ou a API 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 o CustomResourceDefinition 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 CustomResourceDefinition no cluster.

Resolução

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

A seguir