Perbedaan antara targetPort dan port dalam definisi Layanan Kubernetes

132

Kubernetes Servicedapat memiliki targetPortdan portdalam definisi layanan:

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

Apa perbedaan antara portdan targetPort?

Yakub
sumber
Anda dapat merujuk pertanyaan ini stackoverflow.com/questions/41963433/…
Aditya Pawaskar

Jawaban:

82

Layanan: Ini mengarahkan lalu lintas ke sebuah pod.

TargetPort: Ini adalah port sebenarnya tempat aplikasi Anda berjalan di dalam container.

Port: Terkadang aplikasi Anda di dalam container melayani layanan yang berbeda di port yang berbeda.

Contoh: Aplikasi sebenarnya dapat berjalan 8080dan health check untuk aplikasi ini dapat berjalan di 8089port container. Jadi jika Anda menekan layanan tanpa port, ia tidak tahu ke port mana dari penampung itu harus mengalihkan permintaan. Layanan perlu memiliki pemetaan sehingga dapat mengenai pelabuhan tertentu dari kontainer.

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 

jika Anda mencapai my-service:8089lalu lintas yang diarahkan ke 8080penampung (targetPort). Demikian pula, jika Anda menekannya , my-service:8443maka akan dialihkan ke 8085penampung (targetPort). Tapi ini myservice:8089internal klaster kubernetes dan bisa digunakan ketika satu aplikasi ingin berkomunikasi dengan aplikasi lain. Jadi untuk mengakses layanan dari luar cluster, seseorang perlu mengekspos port pada mesin host tempat kubernetes berjalan sehingga lalu lintas dialihkan ke port container. Ini adalahnode port (port yang diekspos pada mesin host). Dari contoh di atas, Anda dapat mengakses layanan dari luar cluster (Postman atau klien lainnya) denganhost_ip:nodePort

Katakanlah mesin host Anda ip 10.10.20.20Anda dapat menekan http, metrik, pelayanan kesehatan oleh 10.10.20.20:30475, 10.10.20.20:31261,10.10.20.20:30013 .

Editan: Diedit sesuai komentar Raedwald .

Manikanta P.
sumber
4
Apa keuntungan mengijinkan portdan targetPortmenjadi berbeda? Jadi misalnya melihat contoh Anda health, mengapa membuat port 8443alih - alih 8085? Pada dasarnya, mengapa ada dua parameter, bukan hanya menampilkan semua yang ada targetPortdi layanan?
Dan
Hai Dan, Anda dapat menggunakan 8443 sebagai porta dan port target untuk kesehatan. saya menggunakan nomor yang berbeda untuk penjelasan yang lebih baik.
Manikanta P
terima kasih atas tanggapannya. Maksud saya, dalam situasi apa akan berguna untuk membuatnya berbeda?
Dan
artinya "berjalan di wadah"? Porta yang digunakan server di dalam penampung? Atau port yang digunakan klien di luar container?
Raedwald
Bisakah kami mengasumsikan IP tetap untuk mesin host seperti 10.10.20.20 di Layanan Cloud? e, g, Azure AKS dengan situasi penyebaran multi node?
Jaish Mathews
17

Saya membantu untuk memikirkan hal-hal dari perspektif layanan .

  • nodePort: Porta pada node tempat lalu lintas eksternal akan masuk
  • port: Pelabuhan layanan ini
  • targetPort Port target pada pod tujuan meneruskan lalu lintas

Lalu lintas masuk nodePort, diteruskan ke portlayanan yang kemudian dirutekan ke targetPortdalam pod.

Perlu ditekankan lebih banyak nodePorttentang lalu lintas eksternal. Pod lain dalam cluster yang mungkin perlu mengakses layanan hanya akan digunakan port, bukan nodePortkarena akses internal saja ke layanan.

Juga perlu dicatat bahwa jika targetPorttidak disetel, itu akan default ke nilai yang sama seperti port. Misalnya 80:80untuk port layanan yang 80menargetkan port kontainer 80.

julz256.dll
sumber
4
ringkasan bagus yang dalam beberapa kata menjawab pertanyaan dengan baik, terima kasih!
Wolfson
Setuju. Saya menemukan jawaban lain membingungkan, tetapi yang ini tepat.
Nikola Malešević
Orang ingin mengetahui perbedaan antara portdan targetPort. Anda benar-benar menghilangkan kebingungan itu.
Ankur Gautam
1
Saya setuju, saya pikir ini adalah "jawaban" dan jawaban di atas membuka bidang tambahan dan topik yang lebih luas sehingga lebih sulit untuk dipahami. Cheers julz.
Worp
10

Jawaban yang diberikan @Manikanta P diatas benar. Namun, penjelasan tentang "Port" mungkin sedikit tidak jelas pada bacaan pertama. Saya akan menjelaskan dengan contoh:

Pertimbangkan Aplikasi Web dengan konten statisnya (halaman depan, gambar, dll) yang dihosting oleh httpd dan konten dinamis (mis. Respons terhadap permintaan, dll.) Yang dihosting oleh tomcat. Webserver (atau konten statis) dilayani oleh httpd di port 80sedangkan Appserver (atau konten dinamis) dilayani oleh tomcat di port8080 .

Apa yang diinginkan pengembang: Pengguna harus dapat mengakses Server Web dari luar TETAPI bukan Server Aplikasi dari luar.

Solusi: Jenis layanan Webserver di service.yml-nya adalah NodePort sedangkan jenis layanan Appserver di service.yml-nya adalah ClusterIP.

Kode untuk service.yml server 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.

Kode untuk 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.

Perhatikan juga, dalam httpd.conffile Webserver, kami akan menulis IP yang mengalihkan permintaan pengguna ke appserver. IP ini akan menjadi: host_IP:5050.

Sebenarnya apa yang terjadi disini? Seorang pengguna menulis hostIP:30475dan melihat halaman Webserver. Ini karena dilayani oleh httpd di port 80(targetport). Saat pengguna mengklik tombol, permintaan dibuat. Permintaan ini dialihkan ke Appserver karena dalam httpd.conffile, port 5050disebutkan dan ini adalah port tempat container Appserver dan conatainer Webserver berkomunikasi secara internal. Saat appserver menerima permintaan tersebut, appserver dapat melayani permintaan tersebut karena tomcat berjalan di dalamnya di porta 8080.

matak8s
sumber
4
Mengapa spesifikasi server web menentukan 'port: 5050'? Jika saya mengerti dengan benar, webserver memanggil appserver: 5050, bukan sebaliknya ...?
Everton
1
Selain pertanyaan Everton, apa gunanya Tomcat membuka port 8080 jika melayani permintaan internal pada port 5050?
Stephen
Jawaban ini membingungkan. Selain itu di mana httpd.confdi "karena dalam file httpd.conf, port 5050 disebutkan"
Polymerase
@Polymerase file httpd.conf hadir dengan paket httpd yang Anda instal di sistem Anda. Ini adalah file internal yang harus Anda konfigurasikan. Path:
/etc/httpd/conf/http.conf
@Stephen di tomcat / conf / server.xml, kami menentukan port tempat layanan tomcat akan dijalankan. Ini adalah nomor port yang sama yang kita tulis sebagai port target sehingga kubernetes mengerti bahwa ia harus menjalankan layanan tomcat pada port tersebut. Koreksi saya jika saya salah.
matak8s
1

Jawaban ini untuk referensi dokumentasi Kubernetes selain jawaban lainnya:

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

targetPort: adalah port tempat container menerima lalu lintas,

port: adalah port Layanan abstrak, yang dapat berupa port apa pun yang digunakan pod lain untuk mengakses Layanan

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

Definisi port dalam Pod memiliki nama, dan Anda bisa mereferensikan nama-nama ini dalam targetPortatribut Service. Ini berfungsi bahkan jika ada campuran Pod dalam Layanan menggunakan satu nama yang dikonfigurasi, dengan protokol jaringan yang sama tersedia melalui nomor port yang berbeda.

Wolfson
sumber
Terima kasih atas jawaban
singkatnya
1

Singkatnya

nodeport: Mendengarkan permintaan eksternal pada semua node pekerja di nodeip: port dan meneruskan permintaan ke port.

port: Port layanan cluster internal untuk container dan mendengarkan permintaan masuk dari nodeport dan meneruskan ke targetPort.

targetPort:Terima permintaan dari port dan teruskan ke pod container (port) tempat ia mendengarkan. bahkan jika Anda tidak menentukan ini akan mendapatkan secara default nomor port yang sama dengan port.

Dashrath Mundkar
sumber
0

"Port target" adalah port tempat penampung Anda berjalan.

Port: port mengalihkan lalu lintas ke kontainer dari layanan.

Mengekspos penerapan

  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: adalah port yang memungkinkan layanan mengakses secara eksternal.

Semoga jawaban ini.

manoj
sumber
0

jika penampung mendengarkan pada port 9376, maka targetPort : 9376

jika layanan mendengarkan pada port 80, maka port : 80

Kemudian konfigurasi port layanan terlihat seperti di bawah ini

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

Terakhir, permintaan diterima ke port layanan , dan diteruskan ke targetPort pod.

user3651946
sumber