Kubernetes Hizmet tanımında targetPort ve port arasındaki fark


Yanıtlar:


83

Hizmet: Bu, trafiği bir kapsüle yönlendirir.

Hedef Bağlantı Noktası: Bu, uygulamanızın konteyner içinde çalıştığı gerçek bağlantı noktasıdır.

Port: Bazen konteyner içindeki uygulamanız farklı bir portta farklı hizmetler sunar.

Örnek: Gerçek uygulama çalışabilir 8080ve bu uygulama için sağlık kontrolleri 8089konteynerin bağlantı noktasında çalıştırılabilir . Dolayısıyla, hizmete bağlantı noktası olmadan ulaşırsanız, konteynerin hangi bağlantı noktasına isteği yönlendirmesi gerektiğini bilemez. Hizmetin, konteynerin belirli bağlantı noktasına ulaşabilmesi için bir eşlemeye sahip olması gerekir.

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 

Eğer vurursanız my-service:8089trafik 8080konteynere (targetPort) yönlendirilir . Benzer şekilde, vurursanız , konteynıra (targetPort) my-service:8443yönlendirilir 8085. Ancak bu myservice:8089, kubernetes kümesinin içindedir ve bir uygulama başka bir uygulama ile iletişim kurmak istediğinde kullanılabilir. Bu nedenle, hizmete kümenin dışından vurmak için, trafiğin konteynerin bir bağlantı noktasına yeniden yönlendirilmesi için kubernetes'in üzerinde çalıştığı ana makinedeki bağlantı noktasının açığa çıkarılması gerekir. Bu node port(ana makinedeki bağlantı noktası açığa çıkar). Yukarıdaki örnekten, hizmete kümenin dışından (Postacı veya herhangi bir dinlenme istemcisi) şu şekilde vurabilirsiniz:host_ip:nodePort

Ev sahibi makine ip Say 10.10.20.20sen tarafından http, ölçümler, sağlık hizmetlerinin vurabilir 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013.

Düzenlemeler: Raedwald yorumuna göre düzenlendi .


4
İzin vermenin portve targetPortfarklı olmanın avantajı nedir ? Öyleyse, örneğin örneğinize bakarken health, neden port 8443yerine yapalım 8085? Temel olarak, targetPorthizmetteki tüm ' leri göstermek yerine neden iki parametre var ?
Dan

Merhaba Dan, 8443'ü sağlık için port ve hedef port olarak kullanabilirsiniz. Daha iyi açıklama için farklı sayılar kullandım.
Manikanta P

cevap için teşekkürler. Demek istediğim, onları farklı kılmak hangi durumlarda faydalı olur?
Dan

"konteyner üzerinde koşmak" demek? Konteynerin içindeki sunucunun kullandığı bağlantı noktası ? Veya konteynerin dışındaki istemcilerin kullandığı bağlantı noktası ?
Raedwald

Bulut Hizmetlerinde 10.10.20.20 gibi ana makine için sabit bir IP alabilir miyiz? e, g, çoklu düğüm dağıtım durumuna sahip Azure AKS?
Jaish Mathews

17

İşleri hizmet perspektifinden düşünmek bana yardımcı oluyor .

  • nodePort: Harici trafiğin geleceği düğümdeki bağlantı noktası
  • port: Bu hizmetin limanı
  • targetPort Kapsüllerde trafiğin yönlendirileceği hedef bağlantı noktası

Trafik devreye girer, daha sonra bölmelere yönlendirilen hizmete nodePortdoğru ilerler.porttargetPort

nodePortDış trafik için daha fazla vurgu yapmaya değer . Kümedeki hizmete erişmesi gerekebilecek diğer bölmeler, hizmete yalnızca dahili erişim olduğu için portdeğil , yalnızca kullanacaktır nodePort.

Ayrıca targetPort, ayarlanmazsa, varsayılan olarak aynı değere sahip olacağını belirtmek gerekir port. Örneğin 80:80, 80konteyner bağlantı noktasını hedefleyen hizmet bağlantı noktası için 80.


4
Birkaç kelimeyle soruyu iyi yanıtlayan iyi bir özet, teşekkürler!
Wolfson

Katılıyorum. Diğer cevapları kafa karıştırıcı buldum, ama bu çivi çakıyor.
Nikola Malešević

İnsanlar portve arasındaki farkı bilmek ister targetPort. Kafa karışıklığını gerçekten çözdün.
Ankur Gautam

1
Katılıyorum, bence bu "doğru" cevap ve yukarıdaki cevaplar, anlamayı zorlaştıran ek alanlar ve daha geniş konular sunuyor. Şerefe temmuz.
Worp

10

Yukarıda @Manikanta P tarafından verilen cevap doğrudur. Bununla birlikte, "Liman" açıklaması ilk okumada biraz belirsiz olabilir. Bir örnekle açıklayacağım:

Statik içeriği (ön sayfası, resimler vb.) Httpd tarafından barındırılan ve dinamik içeriği (örn. İsteklere yanıt, vb.) Tomcat tarafından barındırılan bir Web Uygulamasını düşünün. Web sunucusu (veya statik içerik) httpd tarafından bağlantı noktasında 80, Uygulama Sunucusu (veya dinamik içerik) bağlantı noktasında tomcat tarafından sunulur 8080.

Bir geliştiricinin istediği: Kullanıcı Web sunucusuna dışarıdan erişebilmelidir, AMA dışarıdan Uygulama Sunucusuna değil.

Çözüm: service.yml dosyasındaki Web sunucusunun hizmet türü NodePort, service.yml dosyasındaki Appserver hizmet türü ise ClusterIP olacaktır.

Web sunucusunun service.yml kodu:

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.

Appserver'ın service.yml kodu

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.

Ayrıca httpd.conf, Web sunucusunun dosyasında, bir kullanıcının isteğini uygulama sunucusuna yeniden yönlendiren IP'yi yazacağımızı unutmayın. Bu IP olacaktır: host_IP:5050.

Burada tam olarak ne oluyor? Bir kullanıcı hostIP:30475Web sunucusunun sayfasını yazar ve görür. Bunun nedeni bağlantı noktasında 80(hedef bağlantı noktasında ) httpd tarafından sunulmasıdır. Bir kullanıcı bir düğmeyi tıkladığında bir istek yapılır. Bu istek, Uygulama Sunucusuna yeniden yönlendirilir çünkü httpd.confdosyada bağlantı noktası 5050belirtilir ve bu, Uygulama Sunucusunun kapsayıcısı ile Web sunucusunun kapsayıcısının dahili olarak iletişim kurduğu bağlantı noktasıdır. Uygulama sunucusu isteği aldığında, bağlantı noktasında çalışan tomcat nedeniyle isteği yerine getirebilir 8080.


4
Web sunucusu belirtimi neden 'port: 5050'yi tanımlıyor? Doğru anladıysam, web sunucusu uygulama sunucusunu çağırıyor: 5050, tam tersi değil ...?
Everton

1
Everton'ın sorusuna ek olarak, Tomcat'in 5050 numaralı bağlantı noktasında dahili isteklere hizmet veriyorsa 8080 numaralı bağlantı noktasını açması gereken nokta nedir?
Stephen

Bu cevap kafa karıştırıcı. Ek httpd.confolarak "httpd.conf dosyasında 5050 numaralı bağlantı noktasından bahsedildiği için"
Polymerase

@Polymerase httpd.conf dosyası, sisteminize yüklediğiniz httpd paketi ile birlikte gelir. Yapılandırmanız gereken dahili bir dosyadır. Yol: /etc/httpd/conf/http.conf
matak8s

@Stephen tomcat / conf / server.xml'de, tomcat hizmetinin çalışacağı bir bağlantı noktası belirtiyoruz. Bu, hedef bağlantı noktası olarak yazdığımız bağlantı noktası numarasıyla aynıdır, böylece kubernetes bu bağlantı noktasında tomcat hizmetini çalıştırması gerektiğini anlar. Eğer Yanlışsam beni düzelt.
matak8s

1

Bu yanıt, diğer yanıtlara ek olarak Kubernetes'in belgelerine başvurmaktır:

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

targetPort: konteynerin trafiği kabul ettiği bağlantı noktası,

port: diğer kapsüllerin Hizmete erişmek için kullandığı herhangi bir bağlantı noktası olabilecek soyutlanmış Hizmet bağlantı noktasıdır

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

Pod Port tanımları isimleri varsa ve bu isimleri başvurabilir targetPortbir Hizmetin özniteliği. Bu, Hizmette yapılandırılmış tek bir ad kullanan bir Kapsül karışımı olsa bile çalışır ve aynı ağ protokolü farklı bağlantı noktası numaraları aracılığıyla kullanılabilir.


Kısa cevap için teşekkürler
Ankur Gautam

1

Özetle

nodeport: Düğüm ucu: bağlantı noktasındaki tüm çalışan düğümlerdeki harici isteği dinler ve isteği bağlantı noktasına iletir.

port: Kapsayıcı için dahili küme hizmeti bağlantı noktası ve nodeport'tan gelen isteği dinler ve targetPort'a iletir.

targetPort:İsteği bağlantı noktasından alın ve dinlediği konteyner bölmesine (bağlantı noktası) iletin. Bunu belirtmeseniz bile, bu bağlantı noktasıyla aynı bağlantı noktası numaralarına varsayılan olarak atanacaktır.


0

"Hedef bağlantı noktası", kapsayıcınızın çalıştığı bağlantı noktasıdır.

Bağlantı noktası: bağlantı noktası trafiği hizmetten kapsayıcıya yönlendirir.

Dağıtımı açığa çıkarmak

  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: hizmetin dışarıdan erişmesini sağlayan bağlantı noktasıdır.

Umarım bu cevaplar.


0

kapsayıcı 9376 numaralı bağlantı noktasını dinlerse , targetPort : 9376

bir hizmet 80 numaralı bağlantı noktasını dinlerse, bağlantı noktası : 80

Ardından hizmet bağlantı noktaları yapılandırması aşağıdaki gibi görünür

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

Son olarak, talep hizmetin bağlantı noktasına alındı ​​ve bölmenin hedef Bağlantı Noktasına iletildi .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.