0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hiểu rõ NodePort, Port và TargetPort trong Kubernetes

Đăng vào 6 tháng trước

• 5 phút đọc

Chủ đề:

KungFuTech

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:

  • port
  • targetPort
  • nodePort

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 Copy
  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 Copy
  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 Copy
  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:

Copy
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 Copy
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:

  1. Một khách hàng gửi yêu cầu đến http://<node-ip>:30080
  2. Kubernetes Service chuyển tiếp lưu lượng đến cổng 80 của Service
  3. 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

Copy
[ 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 porttargetPort 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 targetPort có thể dẫn đến lỗi không thể truy cập ứng dụng.
  • Sử dụng NodePort trong 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 nodePort có 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 pod
  • port = điểm vào dịch vụ bên trong cụm
  • nodePort = đ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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào