2017-01-06 56 views
31

1 - Tôi đang đọc tài liệu và tôi hơi nhầm lẫn với từ ngữ. Nó nói:Sự khác biệt giữa các loại dịch vụ ClusterIP, NodePort và LoadBalancer trong Kubernetes là gì?

ClusterIP: Phơi bày dịch vụ trên IP nội bộ cụm. Chọn giá trị này làm cho dịch vụ chỉ có thể truy cập từ bên trong cụm. Đây là ServiceType mặc định

NodePort: Hiển thị dịch vụ trên từng IP của nút tại một cổng tĩnh (NodePort). Một dịch vụ ClusterIP, mà dịch vụ NodePort sẽ định tuyến, được tạo tự động. Bạn sẽ có thể liên hệ với dịch vụ NodePort, từ bên ngoài cụm, bằng cách yêu cầu <NodeIP>:<NodePort>.

LoadBalancer: Đưa dịch vụ ra bên ngoài bằng bộ cân bằng tải của nhà cung cấp dịch vụ đám mây. Các dịch vụ NodePort và ClusterIP, mà bộ cân bằng tải bên ngoài sẽ định tuyến, được tạo tự động.

Loại dịch vụ NodePort vẫn sử dụng ClusterIP nhưng chỉ ở một cổng khác, mở cho khách hàng bên ngoài? Vì vậy, trong trường hợp này là <NodeIP>:<NodePort> giống như <ClusterIP>:<NodePort>?

Hoặc là NodeIP thực sự là IP được tìm thấy khi bạn chạy kubectl get nodes chứ không phải IP ảo được sử dụng cho loại dịch vụ ClusterIP?

2 - Cũng trong sơ đồ từ liên kết dưới đây:

http://kubernetes.io/images/docs/services-iptables-overview.svg

Có bất kỳ lý do cụ thể tại sao Client là bên trong Node? Tôi cho rằng nó sẽ cần phải được bên trong một Cluster trong trường hợp của một loại dịch vụ ClusterIP.

Nếu cùng một sơ đồ được vẽ cho NodePort, nó sẽ hợp lệ để vẽ khách hàng hoàn toàn bên ngoài cả hai NodeCluster hoặc tôi hoàn toàn mất điểm?

Trả lời

43

Một ClusterIP cho thấy như sau:

  • spec.clusterIp:spec.ports[*].port

Bạn chỉ có thể truy cập vào dịch vụ này trong khi bên trong cluster. Nó có thể truy cập từ cổng spec.clusterIp của nó. Nếu spec.ports[*].targetPort được đặt, nó sẽ định tuyến từ cổng đến targetPort. CLUSTER-IP bạn nhận được khi gọi kubectl get services là IP được gán cho dịch vụ này trong cụm nội bộ.

Một NodePort cho thấy như sau:

  • <NodeIP>:spec.ports[*].nodePort
  • spec.clusterIp:spec.ports[*].port

Nếu bạn truy cập vào dịch vụ này trên một nodePort từ IP bên ngoài của nút, nó sẽ định tuyến các yêu cầu spec.clusterIp:spec.ports[*].port, mà sẽ lần lượt chuyển nó đến spec.ports[*].targetPort, nếu được đặt.Dịch vụ này cũng có thể được truy cập giống như ClusterIP.

NodeIP của bạn là địa chỉ IP bên ngoài của các nút. Bạn không thể truy cập dịch vụ của mình từ <ClusterIP>:spec.ports[*].nodePort.

Một loadbalancer cho thấy như sau:

  • spec.loadBalancerIp:spec.pops[*].port
  • <NodeIP>:spec.ports[*].nodePort
  • spec.clusterIp:spec.ports[*].port

Bạn có thể truy cập vào dịch vụ này từ địa chỉ IP cân bằng tải của bạn, mà tuyến đường yêu cầu của bạn đến một nodePort , theo đó chuyển hướng yêu cầu tới cổng clusterIP. Bạn có thể truy cập dịch vụ này như là một dịch vụ NodePort hoặc một dịch vụ ClusterIP.

+1

Ông có thể bình luận về sao 'externalIPs' thay đổi phương trình ở đây? Cụ thể, có thể gán mảng 'externalIPs' cho một dịch vụ kiểu' ClusterIP', và sau đó dịch vụ có thể truy cập được trên IP bên ngoài? Khi nào bạn chọn điều này trên một NodePort? – Bosh

+0

Câu hỏi không đề cập đến externalIPs - Tôi nghĩ bạn có thể sẽ được phục vụ tốt nhất bằng cách đăng câu hỏi này dưới dạng câu hỏi mới. – kellanburket

+0

Bài đăng này thực sự hữu ích hơn khi làm rõ những khác biệt này so với tài liệu chính thức của Kubernetes. – adrpino

4

Để làm rõ cho bất kỳ ai đang tìm kiếm sự khác biệt giữa 3 ở mức đơn giản hơn. Bạn có thể trưng ra dịch vụ của bạn với ClusterIp tối thiểu (bên trong k8s clusteR) hoặc phơi sáng lớn hơn với NodePort (trong cluster bên ngoài đến k8s cluster) hoặc LoadBalancer (thế giới bên ngoài hoặc bất cứ thứ gì bạn định nghĩa trong LB).

ClusterIp exposure < NodePort exposure < LoadBalancer exposure

ClusterIp -> Expose service through **k8s cluster** with ip/name:port 
NodePort  -> Expose service through **vm's** also external to k8s ip/name:port 
LoadBalancer -> Expose service through **external world** or whatever you defined in your LB. 
Các vấn đề liên quan