Controllare la comunicazione a livello di cluster utilizzando i criteri di rete


Questa pagina spiega come configurare i criteri di rete a livello di cluster per Google Kubernetes Engine (GKE).

I criteri di rete e i criteri di rete del nome di dominio completo consentono di definire il traffico di comunicazione tra i pod. I criteri di rete controllano il modo in cui i pod comunicano tra loro all'interno delle loro applicazioni e con endpoint esterni.

In qualità di amministratore del cluster, puoi configurare i criteri di rete per l'intero cluster (CCNP) di Cilium, che superano le limitazioni dei criteri di rete per la gestione del traffico amministrativo a livello di cluster. I criteri di rete a livello di cluster di Cilium applicano regole di rete rigide per tutti i carichi di lavoro nell'intero cluster, negli spazi dei nomi, sostituendo eventuali regole specifiche per l'applicazione.

Il criterio di rete a livello di cluster Cilium per GKE è con ambito cluster CustomResourceDefinition (CRD) che specifica i criteri applicati da con GKE. Se attivi il criterio di rete a livello di cluster Cilium in GKE, puoi gestire in modo centralizzato le regole di rete per l'intero cluster. Puoi controllare l'accesso di base a livello 3 (a livello di IP) e 4 (a livello di porta) per il traffico in entrata e in uscita dal cluster.

Vantaggi

Con il criterio di rete a livello di cluster Cilium puoi:

  • Applica la sicurezza centralizzata: con CCNP, puoi definire regole di accesso alla rete che si applicano all'intera rete. Queste regole CCNP hanno il ruolo di il livello di sicurezza, eseguendo l'override di eventuali criteri potenzialmente in conflitto a livello di spazio dei nomi.
  • Proteggi la multitenancy: se il cluster ospita più team o tenant, puoi proteggere l'isolamento all'interno di un cluster condiviso implementando regole CCNP, con particolare attenzione al controllo del traffico di rete. Puoi applicare la separazione a livello di rete assegnando spazi dei nomi o gruppi di spazi dei nomi a team specifici.
  • Definizione di criteri predefiniti flessibili: con CCNP, puoi definire criteri predefiniti regole di rete per l'intero cluster. Puoi personalizzare queste regole quando senza compromettere la sicurezza complessiva del cluster.

Per implementare CCNP, abilita GKE Dataplane V2 sul cluster. Assicurati che il CCNP CRD è abilitato, quindi crea criteri che definiscono le regole di accesso alla rete per in un cluster Kubernetes.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi inizializzare con gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo gcloud components update.

Requisiti

I criteri di rete a livello di cluster Cilium hanno i seguenti requisiti:

  • Google Cloud CLI versione 465.0.0 o successive.
  • Devi disporre di un cluster GKE che esegue una delle seguenti versioni:
    • 1.28.6-gke.1095000 o versioni successive
    • 1.29.1-gke.1016000 o versioni successive
  • Il cluster deve utilizzare GKE Dataplane V2.
  • Devi abilitare la CRD del criterio di rete a livello di cluster Cilium.

Limitazioni

I criteri di rete a livello di cluster Cilium hanno le seguenti limitazioni:

  • I criteri a livello 7 non sono supportati.
  • I selettori dei nodi non sono supportati.
  • Il numero massimo di CiliumClusterwideNetworkPolicy per cluster è 1000.

Abilita il criterio di rete a livello di cluster Cilium in un nuovo cluster

Puoi abilitare il criterio di rete a livello di cluster Cilium in un nuovo cluster utilizzando Google Cloud CLI o l'API Google Kubernetes Engine.

gcloud

Per abilitare il criterio di rete a livello di cluster Cilium in un nuovo cluster, crea un nuovo cluster con flag --enable-cilium-clusterwide-network-policy.

Pilota automatico

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

Sostituisci quanto segue:

  • CLUSTER_NAME con il nome del tuo cluster.
  • COMPUTE_LOCATION con la località del cluster.

Standard

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

Sostituisci quanto segue:

  • CLUSTER_NAME con il nome del tuo cluster.
  • COMPUTE_LOCATION con la posizione del tuo cluster.

API

Per abilitare il criterio di rete a livello di cluster Cilium, devi specificare le seguenti opzioni durante la creazione di un nuovo cluster:

Campo datapathProvider nell'oggetto networkConfig.

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

Verifica che ciliumclusterwidenetworkpolicies.cilium.io sia presente nell'output del seguente comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

L'output dovrebbe essere simile al seguente:

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

Attivare il criterio di rete a livello di cluster Cilium in un cluster esistente

Puoi abilitare il criterio di rete a livello di cluster Cilium in un cluster esistente utilizzando Google Cloud CLI o l'API Google Kubernetes Engine.

gcloud

  1. Verifica che nel cluster sia abilitato GKE Dataplane V2.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME con il nome del tuo cluster.
    • COMPUTE_LOCATION con la località del cluster.
  2. Aggiorna il cluster utilizzando il flag --enable-cilium-clusterwide-network-policy.

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

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

API

Verifica che il cluster sia abilitato per GKE Dataplane V2:

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

Verifica che ciliumclusterwidenetworkpolicies.cilium.io sia presente nell'output del seguente comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

L'output dovrebbe essere simile al seguente:

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

Utilizzo del criterio di rete a livello di cluster di Cilium

Questa sezione elenca esempi per la configurazione del criterio di rete a livello di cluster Cilium.

Esempio 1: controllare il traffico in entrata verso un carico di lavoro

L'esempio seguente abilita tutti gli endpoint con l'etichetta role=backend per accetta connessioni in entrata sulla porta 80 dagli endpoint con l'etichetta role=frontend. Gli endpoint con l'etichetta role=backend rifiuteranno tutte le connessioni in entrata non consentite da questo criterio.

  1. Salva il seguente manifest come 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. Applica il manifest:

    kubectl apply -f l4-rule-ingress.yaml
    

Esempio 2: limitare il traffico in uscita da un carico di lavoro su una determinata porta

La seguente regola limita tutti gli endpoint con l'etichetta app=myService solo a essere in grado di emettere pacchetti utilizzando TCP sulla porta 80, a qualsiasi destinazione di livello 3:

  1. Salva il seguente manifest come 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. Applica il manifest:

    kubectl apply -f l4-rule-egress.yaml
    

Esempio 3: limita il traffico in uscita da un carico di lavoro su una determinata porta e un determinato CIDR

L'esempio seguente limita tutti gli endpoint con l'etichetta role=crawler solo essere in grado di inviare pacchetti sulla porta 80, protocolli TCP, a un CIDR di destinazione 192.10.2.0/24.

  1. Salva il seguente manifest come 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. Applica il manifest:

    kubectl apply -f cidr-l4-rule.yaml
    

Monitoraggio e risoluzione dei problemi del traffico di rete

Puoi monitorare e risolvere i problemi relativi al traffico di rete interessato da cilium criteri di rete a livello di cluster mediante il logging dei criteri di rete e l'osservabilità di GKE Dataplane V2.

Tentativo di utilizzare criteri di livello 7 o selettori di nodi

Sintomo

Se utilizzi GKE con GKE Dataplane V2 e provi a definisci i criteri CCNP che includono le regole di livello 7 (ad esempio: filtro HTTP) e selettori dei nodi, potresti visualizzare un messaggio di errore simile al seguente:

Errore

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

Possibile causa

GKE ha limitazioni specifiche per i CCNPs. i criteri di livello 7, che consentono l'applicazione di filtri in base a dati a livello di applicazione (come le intestazioni HTTP) e i selettori non sono supportati all'interno dell'integrazione Cilium di GKE.

Risoluzione

Se hai bisogno di funzionalità di filtro avanzate di livello 7 in GKE puoi utilizzare Cloud Service Mesh. In questo modo, viene fornito un controllo più granulare del traffico a livello di applicazione.

Criterio di rete a livello di cluster Cilium non abilitato

Sintomo

Quando provi a configurare i criteri di rete a livello di cluster Cilium (CCNP) in una in cui la funzionalità non è stata abilitata in modo esplicito, non potrai possa configurarlo e potrebbe visualizzare un messaggio di errore simile al seguente:

Errore

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

Possibile causa

I criteri di rete a livello di cluster Cilium si basano su una definizione di risorse personalizzate (CRD). Il messaggio di errore indica che il CRD non è presente nel cluster.

Risoluzione

Abilita il CRD dei criteri di rete a livello di cluster Cilium prima di utilizzare i CCNPs.

Passaggi successivi