Exercise: deny everything, then open one port
Host: controlplane · Time: 6 min · Domain: Cluster Setup
Task
- Namespace
prodexists withfrontend(labeltier=frontend) andbackend(labeltier=backend, container port 3000) running. - Deny all ingress and egress in
prod. - Allow only
frontend→backendon TCP 3000. - Keep DNS working for every Pod in the namespace.
Acceptance criteria
- A pod that is neither frontend nor backend cannot reach
backend:3000. frontendreachesbackend:3000.nslookup backendstill resolves from insidebackend.
Solution
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: default-deny, namespace: prod}
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: allow-dns, namespace: prod}
spec:
podSelector: {}
policyTypes: [Egress]
egress:
- to:
- namespaceSelector: {}
ports:
- {protocol: UDP, port: 53}
- {protocol: TCP, port: 53}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: frontend-to-backend, namespace: prod}
spec:
podSelector:
matchLabels: {tier: backend}
policyTypes: [Ingress]
ingress:
- from:
- podSelector: {matchLabels: {tier: frontend}}
ports:
- {protocol: TCP, port: 3000}
kubectl exec -n prod deploy/frontend -- wget -qO- --timeout=2 http://backend:3000
kubectl exec -n prod deploy/other -- wget -qO- --timeout=2 http://backend:3000 # fails
Why it works: policies are additive. Default-deny blocks everything; the DNS
policy re-opens 53; the last policy re-opens one path into backend.