0

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 AffinityAnti-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 địnhkhả 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí