18.service engpoint
1. Endpoints là gì? "Sổ địa chỉ" của Service 📖¶
Hãy hình dung thế này:
- Service giống như một số tổng đài chung của một công ty. Bạn chỉ cần gọi một số duy nhất.
- Pods giống như các nhân viên trong công ty, mỗi người có một số máy lẻ (địa chỉ IP) riêng và luôn thay đổi.
- Endpoints chính là cuốn danh bạ nội bộ của tổng đài đó. Cuốn danh bạ này ghi rõ: "Để gặp nhân viên A, hãy nối máy đến số 101. Để gặp nhân viên B, hãy nối máy đến số 102...".
Về mặt kỹ thuật, Endpoints là một đối tượng trong Kubernetes, chứa một danh sách các cặp địa chỉ IP:Port
của các Pod "thật" mà một Service đang trỏ tới.
2. Mối quan hệ "Khăng khít": Service, Selector, Labels, và Endpoints¶
Cơ chế này hoạt động như một chuỗi domino:
-
Bạn gắn
labels
(nhãn) cho các Pod của mình. -
Ví dụ:
app: my-frontend
-
Bạn tạo một Service và định nghĩa một
selector
. -
Selector này sẽ tìm các Pod có nhãn tương ứng. Ví dụ:
selector: { app: my-frontend }
-
Kubernetes tự động làm việc:
-
Kubernetes Service controller sẽ quét toàn bộ cụm để tìm các Pod có label là
app: my-frontend
. - Với mỗi Pod tìm thấy, nó sẽ lấy địa chỉ IP và
targetPort
của Pod đó. - Nó tự động tạo và cập nhật một đối tượng tên là Endpoints với danh sách các cặp
IP:Port
vừa tìm được.
Kết luận: Đối tượng Endpoints là kết quả của việc
selector
trong Service kết nối thành công vớilabels
trên các Pod. Nó là danh sách cụ thể những nơi mà traffic sẽ thực sự được chuyển đến.
3. Tại sao Endpoints là công cụ "Debug" thần thánh? 🕵️♂️¶
việc kiểm tra danh sách Endpoints là một trong những bước đầu tiên và hiệu quả nhất khi bạn gặp sự cố với Service. Có hai kịch bản phổ biến:
Kịch bản 1: Không thể truy cập Service (0 Endpoints)¶
- Triệu chứng: Bạn đã tạo Service, nhưng khi cố gắng kết nối vào thì bị từ chối hoặc không có phản hồi.
- Chẩn đoán: Chạy lệnh
kubectl describe service <tên-service>
. - Kết quả: Bạn nhìn vào dòng
Endpoints
và thấy:<none>
. - Ý nghĩa: Đây là một dấu hiệu cực lớn! Nó có nghĩa là
selector
của Service đã không tìm thấy BẤT KỲ Pod nào cólabel
khớp. - Nguyên nhân thường gặp: Gõ nhầm
label
trong file định nghĩa Pod, hoặc gõ nhầmselector
trong file định nghĩa Service.
Kịch bản 2: Service hoạt động lạ, gửi traffic đến "nhầm" Pod (Quá nhiều Endpoints)¶
- Triệu chứng: Ứng dụng của bạn hoạt động không ổn định. Đôi khi request thành công, đôi khi lại lỗi một cách khó hiểu.
- Chẩn đoán: Chạy lệnh
kubectl describe service <tên-service>
. - Kết quả: Bạn nghĩ rằng Service chỉ nên trỏ đến 3 Pod backend của mình, nhưng trong danh sách Endpoints lại có tới 4 địa chỉ IP.
- Ý nghĩa: Có một Pod "lạc loài" nào đó trong cụm đã vô tình được gắn cùng
label
với các Pod backend của bạn. Do đó, Service đã "nhận nhầm" nó là thành viên và đang gửi một phần traffic đến đó, gây ra lỗi.
4. "Chốt hạ"¶
- Endpoints là cầu nối thực sự giữa Service (ảo) và Pods (thật). Nó không phải là thứ bạn tạo ra bằng tay, mà được Kubernetes tự động quản lý.
- Khi Service của bạn không hoạt động như mong đợi, lệnh đầu tiên bạn nên nghĩ đến là
kubectl describe service ...
và kiểm tra thật kỹ dòngEndpoints
. Nó sẽ cho bạn biết chính xác liệu Service có đang "nhìn" thấy đúng các Pod mà nó cần hay không.