Giao diện
Module 3: Service Discovery & CoreDNS Magic
Chào mừng bạn đến với Module 3: Networking. Trong module này, chúng ta sẽ khám phá cách các ứng dụng trong Kubernetes "trò chuyện" với nhau.
1. The HPN Rule: "Never Hardcode IPs"
🚫 QUY TẮC CỐT TỬ
KHÔNG BAO GIỜ được hardcode địa chỉ IP của Pod hay Service vào trong code của bạn.
Tại sao?
- Pod IP thay đổi mỗi khi Pod restart (Mortal).
- Service ClusterIP ổn định hơn, nhưng vẫn có thể thay đổi nếu bạn xóa và tạo lại Service đó.
👉 Giải pháp: Luôn sử dụng DNS Name. Thay vì gọi http://10.96.0.5, hãy gọi http://payment-service.
2. CoreDNS: The Magic Behind the Name
Khi bạn tạo một Kubernetes Cluster, một thành phần tên là CoreDNS được cài đặt mặc định. Nó đóng vai trò là "Cuốn danh bạ điện thoại" của toàn bộ Cluster.
Ngay khi bạn tạo một Service tên là my-database ở namespace default, CoreDNS sẽ tự động tạo một bản ghi DNS cho nó.
FQDN (Fully Qualified Domain Name)
Một tên miền đầy đủ trong Kubernetes có dạng:
service-name.namespace.svc.cluster.local
Ví dụ: payment-service.default.svc.cluster.local
Cross-Namespace Communication
- Cùng Namespace: Bạn chỉ cần gọi tên ngắn gọn:
http://payment-service. - Khác Namespace: Nếu Frontend ở
defaultmuốn gọi Database ở namespaceprod, bạn phải gọi tên dài hơn:http://db-service.prod(hoặc full FQDN).
3. Service Types Ecosystem
Kubernetes cung cấp 3 cách chính để expose Service của bạn (cho nội bộ hoặc ra thế giới bên ngoài).
Type 1: ClusterIP (The Default)
- Tính chất: Chỉ có thể truy cập từ bên trong Cluster.
- Use Case: Các Service nội bộ (Database, Redis, Backend API gọi bởi Frontend).
- An toàn: ✅ Cao nhất.
Type 2: NodePort (The "Hole in the Wall")
- Tính chất: Mở một cổng (Port) trên MỌI Node trong Cluster (trong dải
30000-32767). - Cách gọi:
IP-Cua-Bat-Ky-Node:30xxx. - Use Case: Demo, Test nhanh, hoặc hệ thống Legacy không hỗ trợ LoadBalancer.
⚠️ DANGER ZONE
Hạn chế tối đa dùng NodePort ở Production!
- Security Risk: Bạn đang mở toang cổng server ra mạng.
- Port Management Hell: Phải nhớ port nào đang dùng cho app nào. Rất dễ bị conflict.
Type 3: LoadBalancer (The Rich Kid)
- Tính chất: Yêu cầu Cloud Provider (AWS, GCP, Azure) cấp một Real Public IP.
- Cách gọi: Truy cập thẳng vào Public IP đó.
- Use Case: Dùng cho Service cần public ra Internet (Frontend, Public API Gateway).
- Chi phí: 💸 Tốn tiền (Mỗi Service 1 LoadBalancer = Nhiều tiền).
4. Interactive Debugging: nslookup
Làm sao để biết DNS có hoạt động hay không? Hãy dùng công cụ nslookup (hoặc dig) ngay từ bên trong Pod.
Giả sử bạn đang debug xem Pod frontend có nhìn thấy service backend không:
Exec vào Pod:
bashkubectl exec -it frontend-pod-name -- shChạy nslookup:
bash# Cách 1: Test tên ngắn nslookup backend # Cách 2: Test tên đầy đủ (FQDN) nslookup backend.default.svc.cluster.localKết quả mong đợi:
Server: 10.96.0.10 (CoreDNS IP) Address: 10.96.0.10#53 Name: backend.default.svc.cluster.local Address: 10.100.20.5 (ClusterIP của Service)
Nếu bạn thấy dòng Address trả về IP, chúc mừng! Service Discovery đang hoạt động hoàn hảo. 🚀
👉 Next: Ingress: The Production Gateway