Controlar a comunicação ao nível do cluster através de políticas de rede

Esta página explica como configurar políticas de rede ao nível do 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 pods. As políticas de rede controlam a forma como os pods comunicam entre si nas respetivas aplicações e com pontos finais externos.

Enquanto administrador do cluster, pode configurar políticas de rede ao nível do cluster do Cilium (CCNP), que superam as limitações das políticas de rede para gerir o tráfego administrativo ao nível do cluster. As políticas de rede ao nível do cluster do Cilium aplicam regras de rede rigorosas a todas as cargas de trabalho em todo o cluster, em todos os espaços de nomes, substituindo quaisquer regras específicas da aplicação.

A política de rede ao nível do cluster do Cilium para o GKE é uma CustomResourceDefinition (CRD) ao nível do cluster que especifica as políticas aplicadas pelo GKE. Ao ativar a política de rede ao nível do cluster do Cilium no GKE, pode gerir centralmente as regras de rede para todo o cluster. Pode controlar o acesso básico da camada 3 (ao nível do IP) e da camada 4 (ao nível da porta) para o tráfego que entra e sai do cluster.

Vantagens

Com a política de rede ao nível do cluster do Cilium, pode:

  • Aplique segurança centralizada: com o CCNP, pode definir regras de acesso à rede que se aplicam a toda a sua rede. Estas regras da CCNP atuam como uma camada de segurança de nível superior, substituindo quaisquer políticas potencialmente conflituosas ao nível do espaço de nomes.
  • Proteja a multi-posse: se o cluster alojar várias equipas ou inquilinos, pode proteger o isolamento num cluster partilhado implementando regras CCNP, que se focam no controlo do tráfego de rede. Pode aplicar a separação ao nível da rede atribuindo espaços de nomes ou grupos de espaços de nomes a equipas específicas.
  • Defina políticas predefinidas flexíveis: com o CCNP, pode definir regras de rede predefinidas para todo o cluster. Pode personalizar estas regras quando necessário sem comprometer a segurança geral do cluster.

Para implementar o CCNP, ative o GKE Dataplane V2 no seu cluster. Certifique-se de que o CRD CCNP está ativado e, em seguida, crie políticas que definam regras de acesso à rede para o seu cluster.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Requisitos

As políticas de rede ao nível do cluster do Cilium têm os seguintes requisitos:

  • Versão 465.0.0 ou posterior da CLI do Google Cloud.
  • Tem de ter um cluster do GKE a executar uma das seguintes versões:
    • 1.28.6-gke.1095000 ou posterior
    • 1.29.1-gke.1016000 ou posterior
  • O seu cluster tem de usar o GKE Dataplane V2.
  • Tem de ativar o CRD da política de rede ao nível do cluster do Cilium.

Limitações

As políticas de rede ao nível do cluster do Cilium têm as seguintes limitações:

  • As políticas da camada 7 não são suportadas.
  • Os seletores de nós não são suportados.
  • O número máximo de CiliumClusterwideNetworkPolicy por cluster é 1000.

Ative a política de rede ao nível do cluster do Cilium num novo cluster

Pode ativar a política de rede ao nível do cluster do Cilium num novo cluster através da CLI Google Cloud ou da API Google Kubernetes Engine.

gcloud

Para ativar a política de rede ao nível do cluster do Cilium num novo cluster, crie um novo cluster com a flag --enable-cilium-clusterwide-network-policy.

Autopilot

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

Substitua o seguinte:

  • CLUSTER_NAME com o nome do seu cluster.
  • COMPUTE_LOCATION com a localização do seu cluster.

Padrão

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

Substitua o seguinte:

  • CLUSTER_NAME com o nome do seu cluster.
  • COMPUTE_LOCATION com a localização do seu cluster.

API

Para ativar a política de rede ao nível do cluster do Cilium, tem de especificar 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 no resultado do seguinte comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

O resultado deve ser semelhante ao seguinte:

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

Ative a política de rede ao nível do cluster do Cilium num cluster existente

Pode ativar a política de rede ao nível do cluster do Cilium num cluster existente através da CLI Google Cloud ou da API Google Kubernetes Engine.

gcloud

  1. Confirme se o cluster tem o GKE Dataplane V2 ativado.

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

    Substitua o seguinte:

    • CLUSTER_NAME com o nome do seu cluster.
    • COMPUTE_LOCATION com a localização do seu cluster.
  2. Atualize o cluster com a flag --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

Confirme que 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 no resultado do seguinte comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

O resultado deve ser semelhante ao seguinte:

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

Usar a política de rede ao nível do cluster do Cilium

Esta secção apresenta exemplos de configuração da política de rede ao nível do cluster do Cilium.

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

O exemplo seguinte permite que todos os pontos finais com a etiqueta role=backend aceitem ligações de entrada na porta 80 de pontos finais com a etiqueta role=frontend. Os pontos finais com a etiqueta role=backend rejeitam todas as ligações de entrada que não sejam permitidas por esta política.

  1. Guarde 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 numa determinada porta

A regra seguinte limita todos os pontos finais com a etiqueta app=myService apenas à capacidade de emitir pacotes através de TCP na porta 80 para qualquer destino da camada 3:

  1. Guarde 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: restrinja o tráfego de saída de uma carga de trabalho numa determinada porta e CIDR

O exemplo seguinte limita todos os pontos finais com a etiqueta role=crawler para que só possam enviar pacotes na porta 80, protocolos TCP, para um CIDR de destino 192.10.2.0/24.

  1. Guarde 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
    

Monitorização e resolução de problemas de tráfego de rede

Pode monitorizar e resolver problemas do tráfego de rede afetado pelas políticas de rede ao nível do cluster do Cilium através do registo de políticas de rede e da observabilidade do GKE Dataplane V2.

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

Sintoma

Se estiver a usar 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, pode ver uma mensagem de erro semelhante à seguinte:

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

Potencial causa

O GKE tem limitações específicas em CCNPs. As políticas da camada 7, que permitem a filtragem com base em dados ao nível da aplicação (como cabeçalhos HTTP), e os seletores de nós não são suportados na integração do Cilium do GKE.

Resolução

Se precisar de capacidades de filtragem da camada 7 avançadas no seu cluster do GKE, considere usar a malha de serviços na nuvem. Isto oferece um controlo de tráfego ao nível da aplicação mais detalhado.

Política de rede ao nível do cluster do Cilium não ativada

Sintoma

Quando tenta configurar políticas de rede ao nível do cluster (CCNP) do Cilium num cluster onde a funcionalidade não foi ativada explicitamente, não consegue configurá-la e pode ver uma mensagem de erro semelhante à seguinte:

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

Potencial causa

As políticas de rede ao nível do cluster do Cilium baseiam-se numa definição de recurso personalizado (CRD). A mensagem de erro indica que o CRD está em falta no cluster.

Resolução

Ative o CRD da política de rede ao nível do cluster do Cilium antes de usar CCNPs.

O que se segue?