Bài 18. Affinity & Anti-Affinity – Đặt Pod đúng nơi bạn muốn
Ở những bài trước, chúng ta đã biết NodeSelector có thể ép Pod chạy trên một Node cụ thể. Nhưng trong thực tế, yêu cầu thường phức tạp hơn nhiều.
Ví dụ:
- Hai Pod của cùng một ứng dụng không nên chạy trên cùng một Node để tránh "chết chùm".
- Backend nên chạy gần Database để giảm độ trễ.
- GPU Pod chỉ được chạy trên các Node có GPU.
- Monitoring Pod nên chạy trên mọi Node, nhưng Database thì phải tách biệt khỏi Web Server.
NodeSelector không đủ linh hoạt để giải quyết những yêu cầu này.
Đó là lúc Affinity và Anti-Affinity xuất hiện.
Một ví dụ thực tế
Giả sử bạn có hai Pod:
Frontend
Backend
Và một Cluster gồm ba Node:
Node A
Node B
Node C
Nếu để Kubernetes tự quyết định, kết quả có thể là:
Node A
├── Frontend
└── Backend
Ứng dụng vẫn chạy bình thường.
Nhưng nếu Node A gặp sự cố, cả Frontend và Backend đều biến mất cùng lúc.
Đây là điều chúng ta muốn tránh.
1. Pod Anti-Affinity
Anti-Affinity có nghĩa là:
"Đừng đặt Pod này gần Pod kia."
Ví dụ:
Node A
└── Frontend-1
Node B
└── Frontend-2
Hai Pod được tách sang hai Node khác nhau.
Nếu một Node bị lỗi, Pod còn lại vẫn hoạt động.
Đây là cách phổ biến để tăng High Availability (HA).
2. Pod Affinity
Ngược lại, Affinity có nghĩa là:
"Hãy đặt Pod này gần Pod kia."
Ví dụ:
Node A
├── Backend
└── Redis
Backend thường xuyên truy cập Redis.
Đặt chúng trên cùng một Node sẽ giúp:
- Giảm độ trễ mạng.
- Tăng hiệu năng.
- Giảm lưu lượng giữa các Node.
3. Node Affinity
Ngoài việc quan tâm đến Pod khác, đôi khi chúng ta chỉ muốn chọn Node phù hợp.
Ví dụ:
Node A
SSD = true
Node B
SSD = false
Database cần ổ SSD.
Ta có thể yêu cầu:
Chỉ chạy trên các Node có
SSD=true.
Đó chính là Node Affinity.
So sánh nhanh
| Khái niệm | Ý nghĩa |
|---|---|
| NodeSelector | Chọn Node theo Label (đơn giản) |
| Node Affinity | Chọn Node theo điều kiện linh hoạt hơn |
| Pod Affinity | Muốn Pod ở gần Pod khác |
| Pod Anti-Affinity | Muốn Pod ở xa Pod khác |
Khi nào nên dùng?
- NodeSelector → Điều kiện đơn giản.
- Node Affinity → Chọn Node theo nhiều tiêu chí.
- Pod Affinity → Tăng hiệu năng giữa các dịch vụ.
- Pod Anti-Affinity → Tăng khả năng chịu lỗi của hệ thống.
Kết luận
Affinity và Anti-Affinity giúp Kubernetes không chỉ biết chạy Pod ở đâu, mà còn biết nên chạy gần ai và tránh xa ai.
Đây là một tính năng rất quan trọng trong các hệ thống production, nơi việc đặt Pod đúng vị trí có thể ảnh hưởng trực tiếp đến hiệu năng, độ ổn định và khả năng chịu lỗi.
Ở bài tiếp theo, chúng ta sẽ tìm hiểu Taints & Tolerations – cơ chế cho phép Node chủ động từ chối những Pod không phù hợp, giống như một "người gác cổng" của Kubernetes.
All rights reserved