Giới thiệu
Khi triển khai ứng dụng trong Kubernetes, bạn thường cần phải mở rộng chúng để có thể truy cập từ các pod khác trong cụm hoặc từ người dùng bên ngoài cụm. Kubernetes Services cung cấp lớp trừu tượng này và có ba trường chính xác định cách lưu thông lưu lượng truy cập đến ứng dụng của bạn:
porttargetPortnodePort
Trong bài viết này, chúng ta sẽ phân tích chi tiết các khái niệm này cùng với ví dụ minh họa cụ thể.
1. targetPort – Cổng lắng nghe trong Container
targetPort là cổng bên trong container (pod) nơi ứng dụng của bạn đang chạy.
👉 Ví dụ: Nếu ứng dụng của bạn (chẳng hạn như Nginx hoặc một ứng dụng Java Spring Boot) lắng nghe trên cổng 8080, bạn sẽ cấu hình như sau:
yaml
targetPort: 8080
Điều này đảm bảo rằng lưu lượng truy cập từ Service sẽ được chuyển tiếp đến cổng chính xác trên pod.
2. port – Cổng ClusterIP của Service
port là cổng được mở bởi Service (ClusterIP) bên trong cụm Kubernetes. Các pod khác trong cụm sử dụng cổng này để truy cập Service của bạn.
👉 Ví dụ:
yaml
port: 80
targetPort: 8080
Ở đây:
- Các pod khác gọi
http://<service-name>:80 - Kubernetes sẽ tự động chuyển tiếp lưu lượng đến cổng 8080 của ứng dụng bên trong container.
Vì vậy, port giống như cửa ra vào của Service trong cụm.
3. nodePort – Cổng truy cập bên ngoài trên Worker Nodes
nodePort được sử dụng khi bạn muốn mở rộng Service của mình ra bên ngoài cụm Kubernetes. Nó mở một cổng cụ thể trên địa chỉ IP của mỗi worker node, cho phép các khách hàng bên ngoài kết nối.
👉 Ví dụ:
yaml
nodePort: 30080
Nếu địa chỉ IP bên ngoài của node là 192.168.1.100, bạn có thể truy cập ứng dụng của mình qua:
http://192.168.1.100:30080
⚠️ Các giá trị NodePort phải nằm trong khoảng 30000–32767 (khoảng mặc định của Kubernetes).
4. Ví dụ: Manifest Dịch vụ NodePort
yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
labels:
app: my-app
spec:
type: NodePort
selector:
app: my-app
ports:
- name: http
port: 80 # Cổng dịch vụ bên trong cụm
targetPort: 8080 # Cổng container (nơi ứng dụng lắng nghe)
nodePort: 30080 # Cổng truy cập bên ngoài trên mỗi node
Luồng lưu lượng:
- Một khách hàng gửi yêu cầu đến
http://<node-ip>:30080 - Kubernetes Service chuyển tiếp lưu lượng đến cổng 80 của Service
- Service điều hướng lưu lượng đến cổng 8080 của pod nơi ứng dụng đang chạy
5. Hình dung luồng lưu lượng
[ Trình duyệt của Khách hàng ]
|
v
http://<node-ip>:30080 <-- NodePort
|
v
Service:80 <-- Cổng ClusterIP
|
v
Pod:8080 <-- targetPort (ứng dụng trong container)
6. Lựa chọn giữa ClusterIP, NodePort, LoadBalancer, và Ingress
-
ClusterIP (mặc định):
Truy cập nội bộ. Sử dụng khi các dịch vụ chỉ giao tiếp bên trong cụm. -
NodePort:
Truy cập bên ngoài đơn giản (qua IP node + cổng).
Tốt cho phát triển/kiểm tra, nhưng không lý tưởng cho sản xuất. -
LoadBalancer:
Tự động cấp phát một bộ cân bằng tải đám mây (AWS ELB, GCP LB, Azure LB).
Được khuyến nghị cho môi trường sản xuất khi sử dụng nhà cung cấp đám mây. -
Ingress:
Lựa chọn tốt nhất để quản lý nhiều dịch vụ với một điểm vào duy nhất (qua tên miền và định tuyến dựa trên đường dẫn).
Thường được sử dụng với Nginx Ingress Controller, Kong, hoặc Traefik.
7. Thực hành tốt nhất
✅ Sử dụng ClusterIP cho giao tiếp giữa pod
✅ Sử dụng Ingress hoặc LoadBalancer cho truy cập bên ngoài có độ tin cậy cao
✅ Duy trì NodePort cho phát triển, gỡ lỗi, hoặc khi không có bộ cân bằng tải bên ngoài
✅ Giữ cho port và targetPort rõ ràng và nhất quán để tránh nhầm lẫn
✅ Luôn bảo mật các điểm cuối bên ngoài (TLS/HTTPS, xác thực)
8. Những cạm bẫy thường gặp
- Không cấu hình đúng
targetPortcó thể dẫn đến lỗi không thể truy cập ứng dụng. - Sử dụng
NodePorttrong môi trường sản xuất có thể gây ra các vấn đề về bảo mật. - Quá nhiều dịch vụ sử dụng cùng một
nodePortcó thể dẫn đến xung đột.
9. Mẹo hiệu suất
- Giảm thiểu số lượng yêu cầu đến các dịch vụ bằng cách sử dụng cache.
- Theo dõi hiệu suất của các pod để điều chỉnh cổng và cấu hình dịch vụ cho phù hợp.
- Sử dụng các công cụ giám sát để theo dõi lưu lượng truy cập và hiệu suất của ứng dụng.
Kết luận
Hiểu rõ cách port, targetPort, và nodePort hoạt động cùng nhau là chìa khóa để mở rộng ứng dụng của bạn một cách chính xác trong Kubernetes.
targetPort= ứng dụng bên trong podport= điểm vào dịch vụ bên trong cụmnodePort= điểm vào bên ngoài trên các node
Đối với môi trường sản xuất, hãy xem xét sử dụng Ingress + TLS để có một luồng lưu lượng an toàn, có thể mở rộng và dễ quản lý.
Câu hỏi thường gặp (FAQ)
1. NodePort có an toàn không?
NodePort có thể không an toàn nếu không có các biện pháp bảo mật như TLS, hãy cẩn thận khi sử dụng trong môi trường sản xuất.
2. Làm thế nào để chọn giữa các loại dịch vụ?
Tùy thuộc vào yêu cầu truy cập, bạn nên chọn ClusterIP cho nội bộ, NodePort cho phát triển và LoadBalancer hoặc Ingress cho sản xuất.
3. Có thể sử dụng nhiều cổng NodePort không?
Có thể, nhưng cần đảm bảo rằng không có xung đột cổng giữa các dịch vụ khác nhau.