ความแตกต่างระหว่าง targetPort และพอร์ตในนิยามของบริการ Kubernetes


132

Kubernetes ServiceสามารถมีtargetPortและportในนิยามบริการ:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

อะไรคือความแตกต่างระหว่างportและtargetPort?


คุณสามารถอ้างอิงคำถามนี้ได้stackoverflow.com/questions/41963433/…
Aditya Pawaskar

คำตอบ:


83

บริการ:สิ่งนี้นำการเข้าชมไปยังพ็อด

TargetPort:นี่คือพอร์ตจริงที่แอปพลิเคชันของคุณกำลังทำงานอยู่ภายในคอนเทนเนอร์

พอร์ต:บางครั้งแอปพลิเคชันของคุณภายในคอนเทนเนอร์ให้บริการที่แตกต่างกันบนพอร์ตอื่น

ตัวอย่าง:แอปพลิเคชันจริงสามารถทำงานได้8080และการตรวจสอบความสมบูรณ์ของแอปพลิเคชันนี้สามารถทำงานบน8089พอร์ตของคอนเทนเนอร์ได้ ดังนั้นหากคุณกดบริการโดยไม่มีพอร์ตก็จะไม่รู้ว่าพอร์ตใดของคอนเทนเนอร์นั้นควรเปลี่ยนเส้นทางคำขอ บริการจำเป็นต้องมีการทำแผนที่เพื่อให้สามารถเข้าถึงพอร์ตเฉพาะของคอนเทนเนอร์ได้

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 

หากคุณmy-service:8089เข้าชมการรับส่งข้อมูลจะถูกส่งไปยัง8080คอนเทนเนอร์ (targetPort) ในทำนองเดียวกันถ้าคุณกดmy-service:8443เข้าไประบบจะเปลี่ยนเส้นทางไป8085ยังคอนเทนเนอร์ (targetPort) แต่นี่myservice:8089เป็นภายในคลัสเตอร์ kubernetes และสามารถใช้ได้เมื่อแอปพลิเคชันหนึ่งต้องการสื่อสารกับแอปพลิเคชันอื่น ดังนั้นในการเข้าถึงบริการจากภายนอกคลัสเตอร์จะต้องมีคนเปิดเผยพอร์ตบนเครื่องโฮสต์ที่ kubernetes กำลังทำงานอยู่เพื่อให้การรับส่งข้อมูลถูกเปลี่ยนเส้นทางไปยังพอร์ตของคอนเทนเนอร์ นี่คือnode port(พอร์ตที่เปิดเผยบนเครื่องโฮสต์) จากตัวอย่างข้างต้นคุณสามารถกดบริการจากภายนอกคลัสเตอร์ (บุรุษไปรษณีย์หรือลูกค้าส่วนที่เหลือ) ได้โดยhost_ip:nodePort

บอกว่าเครื่อง IP โฮสต์ของคุณ10.10.20.20คุณสามารถกด http เมตริกบริการสุขภาพโดย10.10.20.20:30475, ,10.10.20.20:3126110.10.20.20:30013

การแก้ไข: แก้ไขตามความคิดเห็นของRaedwald


4
อะไรคือข้อดีคือการยอมportและtargetPortความแตกต่าง? ตัวอย่างเช่นดูตัวอย่างของคุณhealthทำไมต้องใช้port 8443แทน8085? โดยพื้นฐานแล้วเหตุใดจึงมีพารามิเตอร์สองตัวแทนที่จะเปิดเผยข้อมูลทั้งหมดtargetPortในบริการ
แดน

สวัสดี Dan คุณสามารถใช้ 8443 เป็นพอร์ตและพอร์ตเป้าหมายเพื่อสุขภาพ ฉันใช้ตัวเลขอื่นเพื่อการอธิบายที่ดีขึ้น
Manikanta P

ขอบคุณสำหรับการตอบกลับ ฉันหมายความว่าในสถานการณ์ใดที่จะมีประโยชน์ในการทำให้พวกเขาแตกต่างกัน?
แดน

"วิ่งบนตู้คอนเทนเนอร์" หมายความว่า? พอร์ตที่เซิร์ฟเวอร์ภายในคอนเทนเนอร์ใช้? หรือพอร์ตที่ไคลเอนต์ภายนอกคอนเทนเนอร์ใช้?
Raedwald

เราจะถือว่า IP คงที่สำหรับเครื่องโฮสต์เช่น 10.10.20.20 ใน Cloud Services ได้หรือไม่ e, g, Azure AKS กับสถานการณ์การปรับใช้หลายโหนด?
Jaish Mathews

17

มันจะช่วยให้ผมคิดว่าสิ่งจากมุมมองของการบริการ

  • nodePort: พอร์ตบนโหนดที่ทราฟฟิกภายนอกจะเข้ามา
  • port: ท่าเรือของบริการนี้
  • targetPort พอร์ตเป้าหมายบนพ็อดเพื่อส่งต่อการรับส่งข้อมูลไปยัง

การรับส่งข้อมูลเข้ามาnodePortส่งต่อไปยังportบริการซึ่งจะส่งต่อไปยังบนtargetPortพ็อด

ควรเน้นมากกว่านั้นnodePortสำหรับการจราจรภายนอก พ็อดอื่น ๆ ในคลัสเตอร์ที่อาจจำเป็นต้องเข้าถึงบริการจะใช้portไม่ใช่nodePortเพราะเป็นการเข้าถึงบริการภายในเท่านั้น

นอกจากนี้ยังเป็นที่น่าสังเกตว่าถ้าไม่ได้ตั้งค่าก็จะเริ่มต้นกับค่าเช่นเดียวกับtargetPort portเช่น80:80สำหรับพอร์ตบริการท่าเรือคอนเทนเนอร์กำหนดเป้าหมาย8080


4
สรุปได้ดีว่าในไม่กี่คำก็ตอบคำถามได้ดีขอบคุณ!
Wolfson

ตกลง. ฉันพบว่าคำตอบอื่น ๆ ทำให้สับสน แต่คำตอบนี้กระทบเล็บ
Nikola Malešević

ผู้ที่ต้องการทราบความแตกต่างระหว่างและport targetPortคุณเคลียร์ความสับสนจริงๆ
Ankur Gautam

1
ฉันยอมรับฉันคิดว่านี่คือ "คำตอบ" และคำตอบข้างต้นจะเปิดช่องเพิ่มเติมและหัวข้อที่กว้างขึ้นทำให้เข้าใจยากขึ้น ไชโย Julz
Worp

10

คำตอบที่ให้ไว้ข้างต้นโดย @Manikanta P ถูกต้อง อย่างไรก็ตามคำอธิบายของ "พอร์ต" อาจไม่ชัดเจนเล็กน้อยในการอ่านครั้งแรก ฉันจะอธิบายด้วยตัวอย่าง:

พิจารณาเว็บแอปพลิเคชันที่มีเนื้อหาคงที่ (หน้าแรกรูปภาพ ฯลฯ ) ที่โฮสต์โดย httpd และเนื้อหาไดนามิก (เช่นการตอบสนองต่อคำขอ ฯลฯ ) ที่โฮสต์โดย tomcat เว็บเซิร์ฟเวอร์ (หรือเนื้อหาคงที่) โดยมีการเสิร์ฟ httpd ที่ท่าเรือ80ในขณะที่ AppServer (หรือเนื้อหาแบบไดนามิก) 8080จะเสิร์ฟโดยคราวที่ท่าเรือ

สิ่งที่นักพัฒนาต้องการ: ผู้ใช้ควรสามารถเข้าถึงเว็บเซิร์ฟเวอร์จากภายนอก แต่ไม่ใช่แอปเซิร์ฟเวอร์จากภายนอก

วิธีแก้ไข: ประเภทบริการของเว็บเซิร์ฟเวอร์ใน service.yml จะเป็น NodePort ในขณะที่ประเภทบริการของ Appserver ใน service.yml จะเป็น ClusterIP

รหัสสำหรับ service.yml ของเว็บเซิร์ฟเวอร์:

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.

รหัสสำหรับ service.yml ของ 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.

นอกจากนี้โปรดทราบว่าในhttpd.confไฟล์ของเว็บเซิร์ฟเวอร์เราจะเขียน IP ที่เปลี่ยนเส้นทางคำขอของผู้ใช้ไปยังเซิร์ฟเวอร์แอป IP นี้จะเป็น: host_IP:5050.

เกิดอะไรขึ้นที่นี่? ผู้ใช้เขียนhostIP:30475และเห็นหน้าเว็บเซิร์ฟเวอร์ เนื่องจากกำลังให้บริการโดย httpd ที่พอร์ต80(targetport) เมื่อผู้ใช้คลิกปุ่มจะมีการร้องขอ คำขอนี้ถูกเปลี่ยนเส้นทางไปยัง Appserver เนื่องจากในhttpd.confไฟล์5050มีการกล่าวถึงพอร์ตและนี่คือพอร์ตที่คอนเทนเนอร์ของ Appserver และคอนเทนเนอร์ของเว็บเซิร์ฟเวอร์สื่อสารกันภายใน เมื่อ AppServer 8080ได้รับการร้องขอก็สามารถที่จะตอบสนองการร้องขอเพราะคราวที่ทำงานภายในที่ท่าเรือ


4
เหตุใดข้อมูลจำเพาะเว็บเซิร์ฟเวอร์จึงกำหนด 'พอร์ต: 5050' ถ้าฉันเข้าใจถูกต้องเว็บเซิร์ฟเวอร์จะเรียก appserver: 5050 ไม่ใช่ทางอื่น ... ?
Everton

1
นอกเหนือจากคำถามของ Everton แล้ว Tomcat ที่ต้องเปิดพอร์ต 8080 คืออะไรหากให้บริการคำขอภายในบนพอร์ต 5050
Stephen

คำตอบนี้ทำให้สับสน นอกจากนี้อยู่ที่ไหนhttpd.confใน "เพราะในไฟล์ httpd.conf ระบุพอร์ต 5050"
Polymerase

ไฟล์ @Polymerase httpd.conf มาพร้อมกับแพ็คเกจ httpd ที่คุณติดตั้งบนระบบของคุณ มันเป็นไฟล์ภายในที่คุณต้องกำหนดค่า Path: /etc/httpd/conf/http.conf
matak8s

@Stephen ใน tomcat / conf / server.xml เราระบุพอร์ตที่จะเรียกใช้บริการ tomcat นี่คือหมายเลขพอร์ตเดียวกับที่เราเขียนเป็นพอร์ตเป้าหมายเพื่อให้ kubernetes เข้าใจว่าต้องหมุนบริการ tomcat บนพอร์ตนั้น แก้ไขฉันถ้าฉันผิด
matak8s

1

คำตอบนี้ใช้อ้างอิงเอกสารของ Kubernetes นอกเหนือจากคำตอบอื่น ๆ :

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ :

targetPort: เป็นท่าเรือที่คอนเทนเนอร์รับการจราจรบน,

port: คือพอร์ตบริการที่เป็นนามธรรมซึ่งอาจเป็นพอร์ตอื่น ๆ ที่ใช้ในการเข้าถึงบริการ

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ :

ข้อกำหนดพอร์ตใน Pods มีชื่อและคุณสามารถอ้างอิงชื่อเหล่านี้ในtargetPortแอตทริบิวต์ของบริการ สิ่งนี้ใช้ได้แม้ว่าจะมีการผสมผสานของ Pods ในบริการโดยใช้ชื่อที่กำหนดค่าไว้เพียงชื่อเดียวโดยมีโปรโตคอลเครือข่ายเดียวกันที่สามารถใช้ได้ผ่านหมายเลขพอร์ตที่ต่างกัน


ขอบคุณสำหรับคำตอบที่กระชับ
Ankur Gautam

1

สรุป

nodeport: รับฟังคำขอภายนอกบนโหนดผู้ปฏิบัติงานทั้งหมดบน nodeip: port และส่งต่อคำขอไปยังพอร์ต

port: พอร์ตบริการคลัสเตอร์ภายในสำหรับคอนเทนเนอร์และรับฟังคำขอขาเข้าจาก nodeport และส่งต่อไปยัง targetPort

targetPort:รับคำขอจากพอร์ตและส่งต่อไปยังคอนเทนเนอร์พ็อด (พอร์ต) ที่ฟังอยู่ แม้ว่าคุณจะไม่ระบุสิ่งนี้จะได้รับการกำหนดหมายเลขพอร์ตเดียวกันกับพอร์ตโดยค่าเริ่มต้น


0

"พอร์ตเป้าหมาย" คือพอร์ตที่คอนเทนเนอร์ของคุณกำลังทำงานอยู่

พอร์ต: พอร์ตเปลี่ยนเส้นทางการรับส่งข้อมูลไปยังคอนเทนเนอร์จากบริการ

การเปิดเผยการปรับใช้

  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: คือพอร์ตที่ช่วยให้บริการสามารถเข้าถึงภายนอกได้

หวังว่าคำตอบนี้


0

หากคอนเทนเนอร์ฟังบนพอร์ต 9376 ดังนั้น targetPort : 9376

ถ้าบริการฟังบนพอร์ต 80 ดังนั้น พอร์ต : 80

จากนั้นการกำหนดค่าพอร์ตบริการจะมีลักษณะดังนี้

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

สุดท้ายรับคำขอไปยังพอร์ตของบริการและส่งต่อไปยังพอร์ตเป้าหมายของพ็อด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.