Bài 23. NetworkPolicy - Firewall dành cho Pod
Trước khi tìm hiểu về NetworkPolicy, hãy thử tưởng tượng bạn đang vận hành một ứng dụng trên Kubernetes.
Ban đầu, mọi thứ có vẻ ổn. Bạn có một Pod chạy API, một Pod chạy Database và một Pod chạy Redis. Nhưng rồi bạn nhận ra một điều đáng lo ngại:
Liệu mọi Pod trong Cluster có thể kết nối đến Database của mình không?
Nếu câu trả lời là Có, thì đó là một vấn đề bảo mật.
Một câu chuyện nhỏ
Hãy tưởng tượng công ty bạn có một tòa nhà.
- Phòng Kế toán 📁
- Phòng Nhân sự 👥
- Phòng Server 🖥️
Nếu không có bảo vệ, bất kỳ ai cũng có thể đi vào phòng Server.
Rõ ràng điều này không an toàn.
Vì vậy, công ty đặt ra quy định:
- Chỉ nhân viên IT được vào phòng Server.
- Nhân viên Kế toán không được phép vào.
- Khách bên ngoài càng không.
Trong Kubernetes cũng vậy.
Các Pod cần có những "cánh cửa" để kiểm soát ai được phép kết nối.
Đó chính là nhiệm vụ của NetworkPolicy.
1. NetworkPolicy là gì?
NetworkPolicy là một tài nguyên Kubernetes dùng để kiểm soát lưu lượng mạng giữa các Pod.
Bạn có thể xem nó như:
Firewall dành cho Pod.
NetworkPolicy có thể quy định:
- Pod nào được phép truy cập Pod khác.
- Pod nào bị chặn.
- Chỉ cho phép một số cổng (Port).
- Chỉ cho phép một số Namespace.
Nếu không có NetworkPolicy thì sao?
Trong đa số Cluster Kubernetes:
Pod A
│
├────────────► Database
│
Pod B
│
├────────────► Database
│
Pod C
│
└────────────► Database
Mọi Pod đều có thể kết nối đến Database.
Điều này khá nguy hiểm.
2. Có NetworkPolicy thì sao?
Giả sử API là ứng dụng duy nhất cần truy cập Database.
Ta tạo NetworkPolicy:
API Pod
│
▼
Database
Frontend Pod
✖
Redis Pod
✖
Other Pod
✖
Lúc này:
✅ API được phép kết nối.
❌ Các Pod khác bị từ chối.
Ví dụ
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api
spec:
podSelector:
matchLabels:
app: database
ingress:
- from:
- podSelector:
matchLabels:
app: api
Policy trên có ý nghĩa:
Chỉ những Pod có nhãn
app=apimới được phép truy cập Poddatabase.
3. NetworkPolicy kiểm soát những gì?
Có hai loại lưu lượng:
Ingress
Lưu lượng đi vào Pod.
Ví dụ:
API
│
▼
Database
NetworkPolicy có thể quyết định:
API có được vào Database hay không?
Egress
Lưu lượng đi ra khỏi Pod.
Ví dụ:
API
│
▼
Internet
Bạn cũng có thể chặn Pod truy cập Internet hoặc chỉ cho phép kết nối đến một số dịch vụ nhất định.
Có cần dùng NetworkPolicy không?
Nếu chỉ học Kubernetes trên máy cá nhân thì chưa thấy sự khác biệt.
Nhưng trong môi trường Production:
- Database
- Redis
- Kafka
- Internal API
- Monitoring
đều không nên cho mọi Pod truy cập.
Đây là lúc NetworkPolicy phát huy tác dụng.
Tóm tắt
Sau bài này, bạn chỉ cần nhớ ba ý:
- NetworkPolicy là firewall dành cho Pod.
- Nó kiểm soát Pod nào được phép giao tiếp với Pod nào.
- Áp dụng NetworkPolicy giúp tăng cường bảo mật cho Cluster và hạn chế các kết nối không cần thiết.
Bài tiếp theo
Chúng ta đã biết cách kiểm soát mạng giữa các Pod.
Nhưng còn quyền hạn của chính Container thì sao? Ví dụ, làm sao để một Container không chạy với quyền root hoặc không thể ghi vào hệ thống tệp?
Đó sẽ là chủ đề của Bài 24: SecurityContext – Chạy Container an toàn hơn.
All rights reserved