targetPortとKubernetes Service定義のポートの違い


129

A 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/...
アーディティヤPawaskar

回答:


80

サービス:トラフィックをポッドに転送します。

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と、container(targetPort)にリダイレクトされます。ただし、これmyservice:8089はkubernetesクラスターの内部にあり、あるアプリケーションが別のアプリケーションと通信したい場合に使用できます。したがって、クラスタの外部からサービスをヒットするには、kubernetesが実行されているホストマシンのポートを公開して、トラフィックがコンテナのポートにリダイレクトされるようにする必要があります。これはnode port(ホストマシンで公開されているポート)です。上記の例から、クラスター(Postmanまたは任意のRESTクライアント)の外部からサービスにアクセスできます。host_ip:nodePort

ホストマシンのIPがあると言う10.10.20.20あなたがすることで、HTTP、メトリクス、医療サービスを打つことができ10.10.20.20:3047510.10.20.20:3126110.10.20.20:30013

編集:Raedwaldコメントに従って編集されました。


4
許可さporttargetPortていることと異なることの利点は何ですか?だから、例えば、あなたを見てhealth、なぜ作る、例port 8443の代わりに8085?基本的targetPortに、サービスのすべてのを公開するのではなく、なぜ2つのパラメータがあるのですか?
Dan

こんにちは、こんにちは。ポートとヘルスのターゲットポートとして8443を使用できます。私はより良い説明のために異なる数字を使用しました。
Manikanta P

回答ありがとうございます。つまり、それらを異なるものにすることはどのような状況で役立つのでしょうか?
Dan

「コンテナで実行」とはどういう意味ですか?コンテナーのサーバー使用するポート?またはコンテナのクライアントが使用するポート?
Raedwald

クラウドサービスの10.10.20.20のようなホストマシンの固定IPを想定できますか?たとえば、Azure AKSとマルチノードデプロイメントの状況?
Jaish Mathews、

14

サービスの観点から物事を考えるのに役立ちます。

  • nodePort:外部トラフィックが入るノードのポート
  • portこのサービスのポート
  • targetPort トラフィックを転送するポッドのターゲットポート

トラフィックはにnodePort着信portし、サービスに転送さtargetPortれ、ポッドでルーティングされます。

nodePort外部トラフィックについては、さらに強調する価値があります。サービスへの内部アクセスのみportではなく、サービスにアクセスする必要があるクラスター内の他のポッドは、nodePortのみを使用します。

また、targetPortが設定されていない場合、デフォルトでと同じ値になりますport。たとえば80:8080コンテナポートをターゲットとするサービスポートの場合80


4
簡単に言うと、質問によく答える良い要約、ありがとう!
ウルフソン

同意します。他の解答は混乱を招きましたが、これは釘を打った。
NikolaMalešević

portとの違いを知りたいと思っていtargetPortます。あなたは本当に混乱を解消しました。
Ankur Gautam

私はこれに同意します。これは「その」答えであり、上記の答えは追加のフィールドを開き、より広いトピックを理解することを難しくします。乾杯!
Worp

10

@Manikanta Pによる上記の答えは正しいです。ただし、「ポート」の説明は、最初は少しわかりにくいかもしれません。例を挙げて説明します。

httpdがホストする静的コンテンツ(フロントページ、画像など)と、tomcatがホストする動的コンテンツ(リクエストへの応答など)を持つWebアプリケーションを考えてみましょう。80ウェブサーバー(または静的コンテンツ)はポートでhttpdによって提供され、アプリサーバー(または動的コンテンツ)はポートでtomcatによって提供されます8080

開発者が望むこと:ユーザーは外部からAppserverではなく外部からWebserverにアクセスできる必要があります。

解決策:service.ymlのWebサーバーのサービスタイプはNodePortになり、service.ymlのAppserverのサービスタイプは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.

Appserverのservice.ymlのコード

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:30475Webサーバーのページを書き込んで表示します。これは、ポート80(targetport)でhttpdによって提供されているためです。ユーザーがボタンをクリックすると、要求が行われます。httpd.confファイルにはポート5050が記載されているため、このリクエストはAppserverにリダイレクトされます。これは、AppserverのコンテナーとWebserverのコンテナーが内部的に通信するポートです。アプリサーバーがリクエストを受信すると、ポート内でTomcatが実行されているため、リクエストを処理できます8080


4
Webサーバーの仕様で「ポート:5050」が定義されているのはなぜですか?私が正しく理解していれば、ウェブサーバーはappserver:5050を呼び出しますが、その逆ではありません...?
エバートン

1
Evertonの質問に加えて、Tomcatがポート5050で内部リクエストを処理する場合、ポート8080を開く必要があるのは何ですか。
スティーブン

この答えは紛らわしいです。さらにhttpd.conf、「httpd.confファイル内にあるため、ポート5050が言及されている」
ポリメラーゼ

@Polymerase httpd.confファイルは、システムにインストールするhttpdパッケージに付属しています。これは、構成する必要がある内部ファイルです。パス:/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/

ポッドのポート定義には名前がありtargetPort、サービスの属性でこれらの名前を参照できます。これは、単一の構成された名前を使用するサービス内のポッドが混在していても、同じネットワークプロトコルが異なるポート番号を介して使用できる場合でも機能します。


簡潔な回答をありがとう
アンクルゴータム

1

一言で言えば

nodeport: nodeip:portのすべてのワーカーノードで外部リクエストをリッスンし、リクエストをポートに転送します。

port: コンテナーの内部クラスターサービスポート。ノードポートからの着信要求をリッスンし、targetPortに転送します。

targetPort:ポートからリクエストを受信し、待機しているコンテナーpod(port)に転送します。指定しなくても、デフォルトでポートと同じポート番号が割り当てられます。


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

最後に、リクエストはサービスのポートに受信され、ポッドのtargetPortに転送されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.