2017-01-31 19 views
17

Tôi trở nên quen thuộc hơn với Kubernetes vào ban ngày, nhưng tôi vẫn ở mức cơ bản. Tôi cũng không phải là một anh chàng mạng.Có nghĩa là gì đối với Dịch vụ thuộc loại NodePort và có cả cổng và targetPort được chỉ định?

Tôi nhìn chằm chằm vào đoạn mã sau đây của một định nghĩa dịch vụ, và tôi không thể hình thành nên bức tranh ngay trong tâm trí của tôi về những gì đang được tuyên bố:

spec: 
    type: NodePort 
    ports: 
    - port: 27018 
    targetPort: 27017 
    protocol: TCP 

Tham chiếu ServicePort documentation, mà đọc một phần:

nodePort  The port on each node on which this service is exposed when type=NodePort or LoadBalancer. Usually 
integer  assigned by the system. If specified, it will be allocated to the service if unused or else creation of the 
      service will fail. Default is to auto-allocate a port if the ServiceType of this Service requires one. More info: 
      http://kubernetes.io/docs/user-guide/services#type--nodeport 

port   The port that will be exposed by this service. 
integer 

targetPort Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 
IntOrString to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the 
      target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). 
      This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. 
      More info: http://kubernetes.io/docs/user-guide/services#defining-a-service 

sự hiểu biết của tôi là cổng mà một khách hàng bên ngoài của cụm "sẽ thấy" sẽ là động gán một trong khoảng 30000-32767, theo quy định in the documentation. Điều này sẽ, sử dụng một số ma thuật đen mà tôi chưa hiểu, chảy vào targetPort trên một nút nhất định (27017 trong trường hợp này).

Vì vậy, port được sử dụng cho mục đích gì?

Trả lời

18

nodePort là cổng mà khách hàng bên ngoài cụm sẽ "xem". nodePort được mở trên mỗi nút trong cụm của bạn qua kube-proxy. Với iptables ma thuật Kubernetes (k8s) sau đó định tuyến lưu lượng từ cổng đó đến một nhóm dịch vụ phù hợp (ngay cả khi nhóm đó đang chạy trên một nút hoàn toàn khác).

port là cổng mà dịch vụ của bạn lắng nghe bên trong cụm. Hãy lấy ví dụ này:

--- 
apiVersion: v1 
kind: Service 
metadata: 
    name: my-service 
spec: 
    ports: 
    - port: 8080 
    targetPort: 8070 
    nodePort: 31222 
    protocol: TCP 
    selector: 
    component: my-service-app 

Từ bên k8s tôi cụm dịch vụ này sẽ có thể truy cập thông qua my-service.default.svc.cluster.local:8080 (dịch vụ để phục vụ thông tin liên lạc bên trong cluster của bạn) và bất kỳ yêu cầu đạt có được chuyển tiếp đến một pod chạy trên targetPort 8070.

tagetPort cũng theo mặc định có cùng giá trị với port nếu không được chỉ định khác.

+0

Cảm ơn bạn. Vì vậy, 'nodePort' là _not_ một cổng mà Dịch vụ lắng nghe? Nó thay vào đó là một cổng được mở trên các nút lưu trữ các Pods mà Mặt trận dịch vụ? –

+1

'nodePort' là duy nhất, do đó, 2 dịch vụ khác nhau không thể có cùng một' nodePort' được gán. Khi được khai báo, chủ k8s dự trữ 'nodePort' cho dịch vụ đó. 'nodePort' sau đó được mở trên nút ** EVERY ** (chủ và công nhân) - cũng là các nút không chạy một nhóm dịch vụ đó - [k8s iptables] (https://kubernetes.io/docs/user-guide)/services/# virtual-ips-and-service-proxy) ma thuật sẽ chăm sóc định tuyến. Bằng cách đó bạn có thể thực hiện yêu cầu dịch vụ của bạn từ bên ngoài cụm k8 của bạn tới bất kỳ nút nào trên nút 'nodePort' mà không lo lắng liệu một nhóm có được lên lịch biểu hay không. – fishi

+5

Từ kênh # kubernetes-users Slack: "các nút' nodePort' đến dịch vụ, lần lượt chuyển đến pod/nếu bạn nhấn dịch vụ trực tiếp thì bước 'nodePort' bị bỏ qua/'định tuyến ma thuật' được xử lý bởi 'kube-proxy'". Điều này dẫn tôi đến nói (sử dụng ký hiệu đã phát minh): "' nodePort' -> 'port' ->' targetPort', không phải 'nodePort' ->' targetPort' && 'port' ->' targetPort' ". –

Các vấn đề liên quan