ClusterNetworkPolicy consente di definire le posture di sicurezza globali di GKE nell'intero cluster. Questo documento è destinato agli amministratori dei cluster che devono applicare misure di sicurezza obbligatorie o stabilire baseline zero-trust.
Questa risorsa si basa su una gerarchia di valutazione rigorosa che opera con una precedenza superiore rispetto alle risorse NetworkPolicy standard con ambito a livello di spazio dei nomi. Puoi
utilizzare la risorsa ClusterNetworkPolicy per implementare azioni Nega,
Accetta o
Passa esplicite. Queste azioni ti consentono di configurare policy di autorizzazione o negazione globali, delegare il controllo del traffico a spazi dei nomi specifici e limitare il traffico in uscita a blocchi CIDR.
Prima di iniziare
Prima di configurare una policy di rete per il cluster, assicurati di soddisfare i seguenti requisiti:
- Assicurati che il cluster GKE esegua la versione 1.36.0-gke.4447000 o successive.
- Assicurati che il cluster utilizzi GKE Dataplane V2.
Protocolli e porte supportati
Le regole ClusterNetworkPolicy possono corrispondere al traffico in base ai protocolli TCP, UDP o SCTP. Puoi specificare le porte di destinazione nei seguenti modi:
- Numero di porta specifico: utilizza l'impostazione
destinationPort.numberper scegliere come target una singola porta (ad esempio,80). - Intervallo di porte: utilizza l'impostazione
destinationPort.rangeper scegliere come target un intervallo di porte (ad esempio, da8000a9000). - Porta denominata: utilizza l'impostazione
destinationNamedPortper scegliere come target un nome simbolico definito in una specifica Pod.
Gerarchia di valutazione delle policy
A differenza delle NetworkPolicy standard e additive, una ClusterNetworkPolicy (CNP) si basa su una gerarchia di valutazione rigorosa in cui vince la prima regola corrispondente. Il traffico fluisce in sequenza attraverso una pipeline a tre livelli:
- Il livello: le regole di amministrazione vengono eseguite per prime, a cascata fino a NetworkPolicy, poi Baseline.
- Priorità CNP: all'interno di un livello, le policy vengono valutate in base alla loro priorità numerica esplicita.
- Ordine delle regole CNP: all'interno di un singolo criterio, le regole vengono elaborate dall'alto verso il basso come un elenco di controllo dell'accesso (ACL).

Il diagramma precedente illustra il flusso decisionale della gerarchia di valutazione CNP:
- Livello amministratore: il traffico viene prima valutato in base alle
regole
ClusterNetworkPolicynel livelloAdmin. Se viene trovata una corrispondenza Consenti o Nega, la valutazione si interrompe. Se non esiste una corrispondenza o un'azione Pass, il traffico procede al livelloNetworkPolicy. - Livello NetworkPolicy: il traffico viene valutato in base alle norme standard dello spazio dei nomi. Se viene trovata una corrispondenza, il traffico è consentito. Se non viene trovata alcuna corrispondenza, il traffico passa al livello di base.
- Livello di base: il traffico viene valutato in base alle regole
ClusterNetworkPolicynel livello di base. Se viene trovata una corrispondenza Consenti o Nega, la valutazione si interrompe. Se non viene trovata alcuna corrispondenza, il traffico procede con il comportamento predefinito. - Comportamento predefinito di GKE: se non viene trovata alcuna corrispondenza con i criteri in nessun livello, il traffico è soggetto a un comportamento di autorizzazione implicita.
Azioni del verdetto: Consenti, Nega e Passa
Una volta abbinato un pacchetto, ogni regola attiva una delle tre azioni rigide:
- Nega: blocca immediatamente il traffico.
- Accetta: consente il traffico. Entrambe le azioni interrompono immediatamente la pipeline, che ignora tutte le norme rimanenti.
- Passa: trasferisce il controllo al livello successivo, consentendo agli ingegneri della piattaforma di delegare decisioni specifiche sul traffico a criteri standard a livello di spazio dei nomi senza rinunciare al controllo amministrativo generale.
Configura un criterio di negazione globale
Per isolare uno spazio dei nomi sensibile da tutto il resto del traffico interno del cluster, applica una regola di negazione non sostituibile. Questa policy di negazione predefinita contribuisce a garantire che qualsiasi traffico da o verso lo spazio dei nomi sensibile venga bloccato a livello amministrativo. Questo criterio funge da baseline protettiva che non può essere ignorata accidentalmente dalle regole a livello di spazio dei nomi.
Salva il seguente manifest come
global-deny.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: cluster-wide-deny-sensitive spec: tier: Admin priority: 10 subject: namespaces: matchLabels: kubernetes.io/metadata.name: sensitive-ns ingress: - action: Deny name: deny-all-ingress from: - namespaces: matchLabels: {} egress: - action: Deny name: deny-all-egress to: - namespaces: matchLabels: {}Applica il manifest al cluster:
kubectl apply -f global-deny.yaml
Configura una policy di autorizzazione globale
Una policy di autorizzazione globale può contribuire a garantire che tutti i pod possano raggiungere il servizio DNS del cluster, indipendentemente dalle policy di rete create dagli sviluppatori.
Salva il seguente manifest come
global-allow-dns.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-kube-dns-admin spec: tier: Admin priority: 20 subject: namespaces: {} egress: - action: Accept name: allow-dns-egress to: - pods: namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns protocols: - udp: destinationPort: number: 53 - tcp: destinationPort: number: 53Applica il manifest al cluster:
kubectl apply -f global-allow-dns.yaml
Delega il traffico alle policy dello spazio dei nomi
Delega pattern di traffico specifici a oggetti NetworkPolicy standard con ambito di spazio dei nomi.
Salva il seguente manifest come
delegate-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: delegate-to-netpol spec: tier: Admin priority: 30 subject: namespaces: {} egress: - action: Pass name: delegate-web-traffic to: - namespaces: matchLabels: app: web-backend protocols: - tcp: destinationPort: number: 8080Applica il manifest al cluster:
kubectl apply -f delegate-policy.yamlPer consentire il traffico delegato all'interno dello spazio dei nomi di destinazione, salva il seguente manifest standard
NetworkPolicycomeallow-web-backend.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-web-backend namespace: backend-ns spec: podSelector: matchLabels: app: web-backend ingress: - from: - namespaceSelector: matchLabels: app: web-frontend ports: - protocol: TCP port: 8080Applica il manifest standard
NetworkPolicyal tuo cluster:kubectl apply -f allow-web-backend.yaml
Configura i sistemi di protezione di base
Stabilisci una postura di sicurezza GKE predefinita che gli amministratori dello spazio dei nomi possono ignorare utilizzando le policy di rete standard.
Salva il seguente manifest di base come
baseline-deny.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: default-deny-baseline spec: tier: Baseline priority: 100 subject: namespaces: {} ingress: - action: Deny name: baseline-deny-all from: - namespaces: {}Applica il manifest di base al tuo cluster:
kubectl apply -f baseline-deny.yamlSalva il seguente manifest di override dello sviluppatore come
developer-allow.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend-access namespace: my-app-ns spec: podSelector: matchLabels: app: frontend ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginxApplica il manifest di override al cluster:
kubectl apply -f developer-allow.yaml
Configurare i criteri utilizzando le porte denominate
Per astrarre i numeri di porta dalle tue policy di sicurezza, fai riferimento alle porte denominate definite nelle specifiche del pod.
Salva il seguente manifest di deployment come
app-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: my-webapp spec: template: spec: containers: - name: web-container image: nginx ports: - name: http-web containerPort: 8080Applica il manifest di deployment al cluster:
kubectl apply -f app-deployment.yamlSalva il seguente manifest della policy come
named-port-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-web-named-port spec: tier: Admin priority: 40 subject: namespaces: {} egress: - action: Accept to: - namespaces: matchLabels: app: my-webapp protocols: - tcp: destinationNamedPort: http-webApplica il manifest della policy al tuo cluster:
kubectl apply -f named-port-policy.yaml
Limitare il traffico in uscita ai blocchi CIDR
Controlla l'accesso a risorse esterne o intranet aziendali specificando blocchi CIDR.
Salva il seguente manifest come
cidr-policy.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-egress-to-intranet spec: tier: Admin priority: 60 subject: namespaces: {} egress: - action: Accept name: allow-intranet to: - networks: - 10.0.0.0/8 - 192.168.0.0/16Applica il manifest al cluster:
kubectl apply -f cidr-policy.yaml
Configura la precedenza della priorità
Per controllare l'ordine di valutazione quando più policy si applicano agli stessi pod,
specifica una priorità. Le priorità vanno da 0 a 1000, dove i numeri più bassi
indicano una precedenza più elevata. Un singolo oggetto ClusterNetworkPolicy può contenere un massimo di 100 regole in entrata e 100 regole in uscita.
Salva il seguente manifest come
priority-policies.yaml:apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: deny-beta spec: tier: Admin priority: 10 subject: namespaces: matchLabels: team: alpha ingress: - action: Accept name: allow-beta-monitoring from: - pods: namespaceSelector: matchLabels: team: beta podSelector: matchLabels: app: monitoring - action: Deny name: deny-all-other-ingress-from-beta from: - namespaces: matchLabels: team: beta --- apiVersion: policy.networking.k8s.io/v1alpha2 kind: ClusterNetworkPolicy metadata: name: allow-beta spec: tier: Admin priority: 50 subject: namespaces: matchLabels: team: alpha ingress: - action: Accept name: allow-all-ingress-from-beta from: - namespaces: matchLabels: team: betaApplica il manifest al cluster:
kubectl apply -f priority-policies.yaml
Risoluzione dei problemi
Per trovare metodi per diagnosticare e risolvere gli errori delle policy, utilizza i seguenti comandi.
Elenca tutte le policy di rete per il cluster nel tuo cluster:
kubectl get clusternetworkpolicies
Descrivi una norma specifica per esaminarne lo stato e il livello di valutazione:
kubectl describe clusternetworkpolicy/<policy-name>
Il campo status.conditions nell'output fornisce informazioni sul fatto che
i criteri siano stati riconciliati correttamente dall'implementazione
di rete del cluster.
Per monitorare i flussi di traffico e le decisioni relative alle norme, utilizza l'osservabilità di GKE Dataplane V2.
Passaggi successivi
- Scopri di più sull'osservabilità di GKE Dataplane V2.
- Consulta la documentazione dell'API Kubernetes Network Policy.