Questa pagina spiega come configurare le policy di rete a livello di cluster per Google Kubernetes Engine (GKE).
Le policy di rete e le policy di rete FQDN ti aiutano a definire le regole del traffico di comunicazione tra i pod. Le policy di rete controllano il modo in cui i pod comunicano tra loro all'interno delle loro applicazioni e con gli endpoint esterni.
In qualità di amministratore del cluster, puoi configurare le policy di rete a livello di cluster Cilium (CCNP), che superano le limitazioni delle policy di rete per la gestione del traffico amministrativo a livello di cluster. Le policy di rete a livello di cluster Cilium applicano regole di rete per tutti i workload nell'intero cluster. Nella gerarchia di valutazione delle policy di GKE, queste policy si trovano nel livello NetworkPolicy. Sebbene le regole Deny esplicite in un CCNP sostituiscano le regole Allow nelle policy con ambito a livello di namespace, le regole Allow CCNP hanno la stessa precedenza delle policy standard per i namespace.
Tutte le regole CCNP sono subordinate alle policy del livello Amministratore.
La policy di rete a livello di cluster Cilium per GKE è una CustomResourceDefinition (CRD) con ambito cluster che specifica le policy applicate da GKE. Se abiliti la policy di rete a livello di cluster Cilium in GKE, puoi gestire centralmente le regole di rete per l'intero cluster. Puoi controllare l'accesso di base di livello 3 (a livello di IP) e di livello 4 (a livello di porta) per il traffico in entrata e in uscita dal cluster.
Vantaggi
Con la policy 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'intero cluster. Queste regole sostituiscono qualsiasi policy potenzialmente in conflitto a livello di namespace se sono regole Nega esplicite. Le regole Consenti CCNP si trovano nello stesso livello delle policy standard dello spazio dei nomi. Per i mandati, utilizza il livello Amministratore in
ClusterNetworkPolicy. - Proteggi la multitenancy: se il tuo cluster ospita più team o tenant, puoi proteggere l'isolamento all'interno di un cluster condiviso implementando le regole CCNP, che si concentrano sul 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.
- Definisci policy predefinite flessibili: con CCNP, puoi definire regole di rete predefinite per l'intero cluster. Puoi personalizzare queste regole quando necessario senza compromettere la sicurezza complessiva del cluster.
Per implementare CCNP, abilita GKE Dataplane V2 nel tuo cluster. Assicurati che la CustomResourceDefinition CCNP sia abilitata, quindi crea policy che definiscano le regole di accesso alla rete per il tuo cluster.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Per utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Requisiti
Le policy di rete a livello di cluster Cilium hanno i seguenti requisiti:
- Google Cloud CLI versione 465.0.0 o successive.
- Il cluster deve utilizzare GKE Dataplane V2.
- Devi abilitare la CustomResourceDefinition della policy di rete a livello di cluster Cilium.
Limitazioni
Le policy di rete a livello di cluster Cilium presentano le seguenti limitazioni:
- Le policy di livello 7 non sono supportate.
- I selettori di nodi non sono supportati.
- Il numero massimo di
CiliumClusterwideNetworkPolicyper cluster è 1000.
Abilita la policy di rete a livello di cluster Cilium in un nuovo cluster
Puoi attivare la policy di rete a livello di cluster Cilium in un nuovo cluster utilizzando Google Cloud CLI o l'API Kubernetes Engine.
gcloud
Per abilitare la policy di rete a livello di cluster Cilium in un nuovo cluster, crea un nuovo cluster con il flag --enable-cilium-clusterwide-network-policy.
Autopilot
gcloud container clusters create-auto CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy
Sostituisci quanto segue:
CLUSTER_NAMEcon il nome del tuo cluster.COMPUTE_LOCATIONcon la località del tuo cluster.
Standard
gcloud container clusters create CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy \
--enable-dataplane-v2
Sostituisci quanto segue:
CLUSTER_NAMEcon il nome del tuo cluster.COMPUTE_LOCATIONcon la località del tuo cluster.
API
Per abilitare la policy 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 la CustomResourceDefinition 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
Abilita la policy di rete a livello di cluster Cilium in un cluster esistente
Puoi abilitare la policy di rete a livello di cluster Cilium in un cluster esistente utilizzando Google Cloud CLI o l'API Kubernetes Engine.
gcloud
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_NAMEcon il nome del tuo cluster.COMPUTE_LOCATIONcon la località del tuo cluster.
Aggiorna il cluster utilizzando il flag
--enable-cilium-clusterwide-network-policy.gcloud container clusters update CLUSTER_NAME \ --location COMPUTE_LOCATION \ --enable-cilium-clusterwide-network-policyRiavvia 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 la CustomResourceDefinition 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 della policy di rete a livello di cluster Cilium
Questa sezione elenca esempi di configurazione della policy di rete a livello di cluster Cilium.
Esempio 1: controlla il traffico in entrata verso un workload
L'esempio seguente consente a tutti gli endpoint con l'etichetta role=backend di accettare 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 questa policy.
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: TCPApplica il manifest:
kubectl apply -f l4-rule-ingress.yaml
Esempio 2: limita il traffico in uscita da un workload su una porta specifica
La seguente regola limita tutti gli endpoint con l'etichetta app=myService in modo che possano emettere pacchetti solo utilizzando TCP sulla porta 80, verso qualsiasi destinazione di livello 3:
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: TCPApplica il manifest:
kubectl apply -f l4-rule-egress.yaml
Esempio 3: limita il traffico in uscita da un workload su una porta e un CIDR specifici
L'esempio seguente limita tutti gli endpoint con l'etichetta role=crawler in modo che possano inviare pacchetti solo sulla porta 80, protocolli TCP, a un CIDR di destinazione 192.10.2.0/24.
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: TCPApplica il manifest:
kubectl apply -f cidr-l4-rule.yaml
Monitoraggio e risoluzione dei problemi del traffico di rete
Puoi monitorare e risolvere i problemi del traffico di rete interessato dalle policy di rete a livello di cluster Cilium tramite il logging delle policy di rete e l'osservabilità di GKE Dataplane V2.
Tentativo di utilizzare policy di livello 7 o selettori di nodi
Sintomo
Se utilizzi GKE con GKE Dataplane V2 e tenti di definire policy CCNP che includono regole di livello 7 (ad esempio: filtro HTTP) e selettori di 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 sui CCNP. I criteri di livello 7, che consentono il filtro in base ai dati a livello di applicazione (come le intestazioni HTTP), e i selettori di nodi non sono supportati nell'integrazione di Cilium di GKE.
Risoluzione
Se hai bisogno di funzionalità di filtro di livello 7 avanzate nel tuo cluster GKE, valuta l'utilizzo di Cloud Service Mesh. In questo modo, avrai un controllo più granulare del traffico a livello di applicazione.
Policy di rete a livello di cluster Cilium non abilitata
Sintomo
Se provi a configurare le policy di rete a livello di cluster Cilium (CCNP) in un cluster in cui la funzionalità non è stata abilitata esplicitamente, non potrai configurarla e potresti 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
Le policy di rete a livello di cluster Cilium si basano su una definizione di risorsa personalizzata (CRD). Il messaggio di errore indica che CustomResourceDefinition non è presente nel cluster.
Risoluzione
Abilita la CustomResourceDefinition della policy di rete a livello di cluster Cilium prima di utilizzare le CCNP.