Sự khác biệt giữa targetPort và cổng trong định nghĩa Dịch vụ Kubernetes


Câu trả lời:


82

Dịch vụ: Điều này hướng lưu lượng truy cập đến một nhóm.

TargetPort: Đây là cổng thực tế mà ứng dụng của bạn đang chạy bên trong vùng chứa.

Cổng: Đôi khi ứng dụng của bạn bên trong vùng chứa phục vụ các dịch vụ khác nhau trên một cổng khác.

Ví dụ: Ứng dụng thực tế có thể chạy 8080và kiểm tra tình trạng ứng dụng này có thể chạy trên 8089cổng của vùng chứa. Vì vậy, nếu bạn nhấn dịch vụ không có cổng, nó sẽ không biết cổng nào của container mà nó sẽ chuyển hướng yêu cầu. Dịch vụ cần phải có một ánh xạ để nó có thể đến cổng cụ thể của container.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      nodePort: 30475
      port: 8089
      protocol: TCP
      targetPort: 8080
    - name: metrics
      nodePort: 31261
      port: 5555
      protocol: TCP
      targetPort: 5555
    - name: health
      nodePort: 30013
      port: 8443
      protocol: TCP
      targetPort: 8085 

nếu bạn đạt được my-service:8089lưu lượng truy cập được chuyển đến 8080của vùng chứa (targetPort). Tương tự, nếu bạn bắn trúng my-service:8443thì nó được chuyển hướng đến 8085vùng chứa (targetPort). Nhưng đây myservice:8089là nội bộ của cụm kubernetes và có thể được sử dụng khi một ứng dụng muốn giao tiếp với ứng dụng khác. Vì vậy, để truy cập dịch vụ từ bên ngoài cụm, ai đó cần hiển thị cổng trên máy chủ mà kubernetes đang chạy trên đó để lưu lượng truy cập được chuyển hướng đến một cổng của vùng chứa. Đây là node port(cổng tiếp xúc trên máy chủ). Từ ví dụ trên, bạn có thể truy cập dịch vụ từ bên ngoài cụm (Người đưa thư hoặc bất kỳ ứng dụng khách nghỉ ngơi nào) bằng cáchhost_ip:nodePort

Giả sử máy chủ máy ip của bạn là 10.10.20.20bạn có thể nhấn http, số liệu, dịch vụ y tế do 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013.

Chỉnh sửa: Đã chỉnh sửa theo nhận xét của Raedwald .


4
Lợi thế là cho phép porttargetPortkhác biệt là gì? Vì vậy, ví dụ như nhìn vào healthví dụ của bạn , tại sao thực hiện port 8443thay vì 8085? Về cơ bản, tại sao có hai tham số thay vì chỉ hiển thị tất cả các targetPorts trên dịch vụ?
Dan

Xin chào Dan, bạn có thể sử dụng 8443 làm cổng và cổng mục tiêu cho sức khỏe. tôi đã sử dụng các số khác nhau để giải thích tốt hơn.
Manikanta P

Cảm ơn vì sự trả lời. Ý tôi là, sẽ hữu ích trong những tình huống nào nếu làm cho chúng khác biệt?
Dan

"chạy trên container" nghĩa là gì? Cổng mà máy chủ bên trong vùng chứa sử dụng? Hay cổng mà khách hàng bên ngoài container sử dụng?
Raedwald

Chúng tôi có thể giả định một IP cố định cho máy chủ như 10.10.20.20 trong Dịch vụ đám mây không? e, g, Azure AKS với tình hình triển khai nhiều nút?
Jaish Mathews

17

Nó giúp tôi nghĩ về mọi thứ từ quan điểm của dịch vụ .

  • nodePort: Cổng trên nút nơi lưu lượng truy cập bên ngoài sẽ vào
  • port: Cổng của dịch vụ này
  • targetPort Cổng đích trên (các) nhóm để chuyển tiếp lưu lượng truy cập tới

Lưu lượng truy cập đến nodePort, chuyển tiếp đến portdịch vụ mà sau đó sẽ chuyển đến targetPorttrên (các) nhóm.

Điều đáng nhấn mạnh hơn nodePortlà dành cho lưu lượng truy cập bên ngoài. Các nhóm khác trong cụm có thể cần truy cập dịch vụ sẽ chỉ sử dụng port, không phải nodePortvì nó chỉ có quyền truy cập nội bộ vào dịch vụ.

Cũng cần lưu ý rằng nếu targetPortkhông được đặt, nó sẽ mặc định có cùng giá trị với port. Ví dụ: 80:80đối với cảng dịch vụ 80nhắm mục tiêu cảng container 80.


4
bản tóm tắt tốt mà trong một vài từ trả lời tốt câu hỏi, cảm ơn!
Wolfson

Đồng ý. Tôi thấy các câu trả lời khác khó hiểu, nhưng câu này trúng đinh.
Nikola Malešević

Mọi người muốn biết sự khác biệt giữa porttargetPort. Bạn thực sự giải tỏa được sự nhầm lẫn.
Ankur Gautam

1
Tôi đồng ý, tôi nghĩ đây là câu trả lời "đáp án" và các câu trả lời ở trên mở ra các trường bổ sung và các chủ đề rộng hơn khiến nó khó hiểu hơn. Chúc mừng julz.
Worp

10

Câu trả lời được đưa ra ở trên bởi @Manikanta P là đúng. Tuy nhiên, giải thích về "Port" có thể hơi không rõ ràng khi đọc lần đầu. Tôi sẽ giải thích bằng một ví dụ:

Hãy xem xét một Ứng dụng web có nội dung tĩnh (trang đầu, hình ảnh, v.v.) được lưu trữ bởi httpd và nội dung động (ví dụ: phản hồi với yêu cầu, v.v.) được lưu trữ bởi tomcat. Máy chủ web (hoặc nội dung tĩnh) được cung cấp bởi httpd tại cổng 80trong khi Máy chủ ứng dụng (hoặc nội dung động) được phục vụ bởi tomcat tại cổng 8080.

Những gì nhà phát triển muốn: Người dùng có thể truy cập Máy chủ web từ bên ngoài NHƯNG không phải Máy chủ ứng dụng từ bên ngoài.

Giải pháp: Loại dịch vụ của Webserver trong service.yml của nó sẽ là NodePort trong khi loại dịch vụ của Appserver trong service.yml của nó sẽ là ClusterIP.

Mã cho service.yml của máy chủ web:

spec:
  selector:
    app: Webserver
  type: NodePort        // written to make this service accessible from outside.
  ports:
    - nodePort: 30475   // To access from outside, type <host_IP>:30475 in browser.
      port: 5050        // (ignore for now, I will explain below).
      protocol: TCP
      targetPort: 80  // port where httpd runs inside the webserver pod.

Mã cho service.yml của Appserver

spec:
  selector:
    app: appserver
  type: ClusterIP        // written to make this service NOT accessible from outside.
  ports:
    - port: 5050         // port to access this container internally
      protocol: TCP
      targetPort: 8080   // port where tomcat runs inside the appserver pod.

Cũng xin lưu ý, trong httpd.conftệp của Máy chủ web, chúng tôi sẽ ghi IP chuyển hướng yêu cầu của người dùng đến máy chủ ứng dụng. IP này sẽ là: host_IP:5050.

Chính xác thì điều gì đang xảy ra ở đây? Một người dùng viết hostIP:30475và xem trang của Máy chủ web. Điều này là do nó đang được phục vụ bởi httpd tại cổng 80(targetport). Khi người dùng nhấp vào một nút, một yêu cầu sẽ được thực hiện. Yêu cầu này được chuyển hướng đến Appserver vì trong httpd.conftệp, cổng 5050được đề cập và đây là cổng nơi vùng chứa của Appserver và bộ giải mã của Webserver giao tiếp nội bộ. Khi máy chủ ứng dụng nhận được yêu cầu, nó có thể phục vụ yêu cầu vì tomcat đang chạy bên trong nó tại cổng 8080.


4
Tại sao thông số kỹ thuật của máy chủ web xác định 'cổng: 5050'? Nếu tôi hiểu đúng, máy chủ web gọi là máy chủ ứng dụng: 5050, chứ không phải ngược lại ...?
Everton

1
Ngoài câu hỏi của Everton, Tomcat cần mở cổng 8080 là gì nếu nó đang phục vụ các yêu cầu nội bộ trên cổng 5050?
Stephen

Câu trả lời này là khó hiểu. Ngoài ra, httpd.conftrong "bởi vì trong tệp httpd.conf, cổng 5050 được đề cập"
Polymerase

@Polymerase httpd.conf tệp đi kèm với gói httpd bạn cài đặt trên hệ thống của mình. Đó là một tệp nội bộ mà bạn phải định cấu hình. Đường dẫn: /etc/httpd/conf/http.conf
matak8s

@Stephen trong tomcat / conf / server.xml, chúng tôi chỉ định một cổng mà dịch vụ tomcat sẽ chạy. Đây là số cổng tương tự mà chúng tôi viết là cổng đích để kubernetes hiểu rằng nó phải chạy dịch vụ tomcat trên cổng đó. Đúng nếu tôi đã sai lầm.
matak8s

1

Câu trả lời này là để tham khảo tài liệu của Kubernetes ngoài các câu trả lời khác:

https://kubernetes.io/docs/concept/services-networking/connect-application-service/ :

targetPort: là cảng mà container chấp nhận lưu lượng truy cập,

port: là cổng Dịch vụ được tóm tắt, có thể là bất kỳ cổng nào mà các nhóm khác sử dụng để truy cập Dịch vụ

https://kubernetes.io/docs/concept/services-networking/connect-application-service/ :

Định nghĩa cổng trong Nhóm có tên và bạn có thể tham chiếu các tên này trong targetPortthuộc tính của Dịch vụ. Điều này hoạt động ngay cả khi có hỗn hợp các Nhóm trong Dịch vụ sử dụng một tên được định cấu hình, với cùng một giao thức mạng khả dụng thông qua các số cổng khác nhau.


Cảm ơn vì câu trả lời ngắn gọn
Ankur Gautam

1

Trong vỏ quả hạch

nodeport: Nghe yêu cầu bên ngoài trên tất cả các nút công nhân trên nodeip: port và chuyển tiếp yêu cầu tới cổng.

port: Cổng dịch vụ cụm nội bộ cho vùng chứa và lắng nghe yêu cầu đến từ nút này và chuyển tiếp đến targetPort.

targetPort:Nhận yêu cầu từ cổng và chuyển tiếp đến thùng chứa (cổng) nơi nó đang lắng nghe. ngay cả khi bạn không chỉ định điều này sẽ được gán theo mặc định các số cổng giống như cổng.


0

"Cổng mục tiêu" là cổng mà vùng chứa của bạn đang chạy.

Port: port chuyển hướng lưu lượng đến container từ dịch vụ.

Hiển thị việc triển khai

  master $ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE

nginx        1/1     1            1           31s
master $ kubectl expose deployment nginx --name=nginx-svc --port=8080 --target-port=80
service/nginx-svc exposed

master $ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

nginx-svc    ClusterIP   10.107.209.151   <none>        8080/TCP   5s

NodePort: là cổng cho phép dịch vụ truy cập từ bên ngoài.

Hy vọng câu trả lời này.


0

nếu vùng chứa lắng nghe trên cổng 9376, thì targetPort : 9376

nếu một dịch vụ lắng nghe trên cổng 80, thì cổng : 80

Sau đó, cấu hình các cổng dịch vụ trông giống như bên dưới

ports:
 - protocol: TCP
   port: 80
   targetPort: 9376

Cuối cùng, yêu cầu nhận được đến cổng của dịch vụ và được chuyển tiếp trên targetPort của nhóm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.