Kubernetes Network Policies: come controllare la comunicazione tra i Pod

In questo articolo affronteremo i seguenti temi:

Kubernetes Network Policies: come controllare la comunicazione tra i Pod

Per controllare il traffico in entrata ed uscita di un Pod, in Kubernetes si usano le NetworkPolicies. Il loro funzionamento è simile a quello di un firewall, tramite delle regole bloccano o permettono la comunicazione del Pod.

Di default i Pod sono liberi di comunicare tra di loro all’interno del Cluster. Grazie alle NetworkPolicies è possibile impedire la comunicazione di un Pod sia in Igress che Egress.

Come si scrive una NetworkPolicy?

Nella sezione podSelector vanno indicati i Pod ai quali verrà applicata la NetworkPolicy.

Dato che i nomi dei Pod non sono consistenti, e possono variare, vengono usate delle labels per consentire alla NetworkPolicy di selezionare i Pod corretti; in questo caso, i Pod presi in considerazione saranno quelli che hanno la lables: “app: blog”.

Nella sezione policyTypes, va indicato che tipo di traffico la NetworkPolicy andrà a negare, gli unici due valori accettati sono Ingress ed Egress.

Pertanto, questa NetworkPolicy andrà ad impedire ogni comunicazione in ingresso ad uscita da tutti i Pod con la lables: “app: blog”.

				
					apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: networkpolicy
spec:
  podSelector:
    matchLabels:
      app: blog
  policyTypes:
  - Ingress
  - Egress

				
			

Scrivere le regole di una NetworkPolicy

La NetworkPolicy precedente blocca ogni tipo di comunicazione dei Pod che hanno la lables “app: blog”. Nel prossimo esempio invece sarà permesso solo il traffico in entrata da una fonte specifica.

				
					apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: networkpolicy
spec:
  podSelector:
    matchLabels:
      app: blog
  policyTypes:
  - Ingress
  - Egress
  ingress:
    - from:
        podSelector:
          matchLabels:
            app: source
				
			

Questa NetworkPolicy va sempre a bloccare tutto il traffico in uscita, ma blocca tutto il traffico in entrata, eccetto quello proveniente dai pod che hanno la label: “app: source”.

Nello stesso modo è possibile aggiungere regole per consentire ai Pod di comunicare verso altri Pod specifici aggiungendo la sezione egress, ed indicando i Pod desiderati.

				
					...
  egress:
    - to:
        podSelector:
          matchLabels:
            app: destination

				
			

È possibile, scrivere una regola che fa riferimento a tutti i Pod all’interno di un namespace, per farlo si usa il selector namespaceSelector, non è possibile indicare il namespace direttamente con il suo nome, analogamente a prima, è necessario usare una label del namespace.

				
					...
  ingress:
    - from:
        namespaceSelector:
          matchLabels:
            role: dev
				
			

In questo caso, la regola concede a tutti Pod contenuti nel namespace che ha la label “role: dev” di comunicare in entrata.

Le regole possono fare riferimento direttamente a degli IP, solitamente queste regole vengono usate per comunicazioni con l’esterno.

				
					...
  egress:
    - to:
      - ipBlock:
          cidr: 10.0.0.0/24
				
			

Tutte queste regole possono essere combinate, e scritte in un’unica NetworkPolicy; di seguito l’esempio di una NetworkPolicy contr regole, due che consentono ai Pod con la label “app: blog” di ricevere traffico, ed una che consente di comunicare verso dei Pod specifici.