Skip to main content

Chapter 9.3 - Network Policies

Learning Objectives​

By the end of this chapter, you will be able to:

  • Understand what Network Policies are
  • Create Network Policies to isolate traffic
  • Configure ingress and egress rules
  • Use selectors to target Pods
  • Implement network segmentation
  • Understand the limitations

Introduction​

Network Policies allow you to control network traffic between Pods in a Kubernetes cluster. They provide application-level network segmentation.


What is a Network Policy?​

A Network Policy defines rules that control network traffic between Pods. It allows you to:

  • Allow or block ingress (incoming) traffic
  • Allow or block egress (outgoing) traffic
  • Filter by namespace, labels, or IPs

Important: Network Policies require a CNI that supports them (Calico, Cilium, etc.).


Default Behavior​

Without Network Policy​

By default: All Pods can communicate with all other Pods.

With Network Policy​

Isolation: Only authorized traffic is allowed.


Basic Example​

Network Policy: Isolate a Namespace​

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {} # All Pods
policyTypes:
- Ingress
- Egress

Result: No ingress or egress traffic is allowed in the production namespace.

Network Policy: Allow Internal Traffic​

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: production

Result: Only traffic from the production namespace is allowed.


Selectors​

Pod Selector​

Target specific Pods:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-network-policy
spec:
podSelector:
matchLabels:
app: web
tier: frontend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api

Result: Pods with app=web and tier=frontend can receive traffic only from Pods with app=api.

Namespace Selector​

Target namespaces:

spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend

IP Block​

Target IP ranges:

spec:
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
except:
- 192.168.1.100/32

Complete Example: Multi-Tier Application​

Architecture​

Network Policy: Frontend​

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-policy
namespace: frontend
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
- Egress
ingress:
- from: [] # Allow from anywhere (Internet via Ingress)
egress:
- to:
- namespaceSelector:
matchLabels:
name: backend
ports:
- protocol: TCP
port: 80

Network Policy: Backend​

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
namespace: backend
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- namespaceSelector:
matchLabels:
name: database
ports:
- protocol: TCP
port: 5432

Network Policy: Database​

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-policy
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: backend
ports:
- protocol: TCP
port: 5432
egress: [] # No outgoing traffic allowed

Ports and Protocols​

Specifying Ports​

spec:
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
- protocol: UDP
port: 53

Port Range (CNI-dependent)​

Some CNIs support port ranges:

spec:
ingress:
- ports:
- protocol: TCP
port: 8000-8999

Useful Commands​

Management​

# Create a Network Policy
kubectl apply -f network-policy.yaml

# View Network Policies
kubectl get networkpolicies
kubectl get netpol

# Details
kubectl describe networkpolicy frontend-policy

# View by namespace
kubectl get netpol -n production

Testing​

# Test connectivity from a Pod
kubectl exec -it test-pod -- curl http://api-service:8080

# View applied rules (CNI-dependent)
# Calico
calicoctl get networkpolicies

Limitations​

1. CNI Support​

Not all CNIs support Network Policies:

  • Support: Calico, Cilium, Weave Net, Antrea
  • Do not support: Flannel (basic)

2. Performance​

Network Policies may impact performance depending on the CNI.

3. Complexity​

Managing many Network Policies can become complex.


Best Practices​

1. Progressive Approach​

Start by isolating critical namespaces, then expand.

2. Documentation​

Document communication rules between services.

3. Testing​

Test Network Policies before applying them in production.

4. Monitoring​

Monitor blocked connections to detect issues.

5. Default Deny​

Use a "deny all" policy by default, then explicitly allow.


Summary​

In this chapter, you learned:

Network Policy: Control of network traffic between Pods
Default behavior: All Pods can communicate
Selectors: Pod, namespace, IP block
Ingress/Egress: Rules for incoming and outgoing traffic
Ports: Specify allowed ports and protocols
Use cases: Network segmentation, multi-tier isolation
Limitations: Requires a compatible CNI
Best practices: Progressive approach, default deny, testing


Next Steps​

Chapter 9.4: Pod Security Standards
Lab 9.3: Advanced Network Policies


Chapter created on: December 2024