回答:
サービス:トラフィックをポッドに転送します。
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:30475
、10.10.20.20:31261
、10.10.20.20:30013
。
編集:Raedwaldコメントに従って編集されました。
port
れtargetPort
ていることと異なることの利点は何ですか?だから、例えば、あなたを見てhealth
、なぜ作る、例port
8443
の代わりに8085
?基本的targetPort
に、サービスのすべてのを公開するのではなく、なぜ2つのパラメータがあるのですか?
サービスの観点から物事を考えるのに役立ちます。
nodePort
:外部トラフィックが入るノードのポートport
:このサービスのポートtargetPort
トラフィックを転送するポッドのターゲットポートトラフィックはにnodePort
着信port
し、サービスに転送さtargetPort
れ、ポッドでルーティングされます。
nodePort
外部トラフィックについては、さらに強調する価値があります。サービスへの内部アクセスのみport
ではなく、サービスにアクセスする必要があるクラスター内の他のポッドは、nodePort
のみを使用します。
また、targetPort
が設定されていない場合、デフォルトでと同じ値になりますport
。たとえば80:80
、80
コンテナポートをターゲットとするサービスポートの場合80
。
port
との違いを知りたいと思っていtargetPort
ます。あなたは本当に混乱を解消しました。
@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:30475
Webサーバーのページを書き込んで表示します。これは、ポート80
(targetport)でhttpdによって提供されているためです。ユーザーがボタンをクリックすると、要求が行われます。httpd.conf
ファイルにはポート5050
が記載されているため、このリクエストはAppserverにリダイレクトされます。これは、AppserverのコンテナーとWebserverのコンテナーが内部的に通信するポートです。アプリサーバーがリクエストを受信すると、ポート内でTomcatが実行されているため、リクエストを処理できます8080
。
httpd.conf
、「httpd.confファイル内にあるため、ポート5050が言及されている」
この回答は、他の回答に加えてKubernetesのドキュメントを参照することです。
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/:
targetPort
:コンテナがトラフィックを受け入れるポートです。
port
:抽象化されたサービスポートで、他のポッドがサービスにアクセスするために使用する任意のポートにすることができます
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/:
ポッドのポート定義には名前があり
targetPort
、サービスの属性でこれらの名前を参照できます。これは、単一の構成された名前を使用するサービス内のポッドが混在していても、同じネットワークプロトコルが異なるポート番号を介して使用できる場合でも機能します。
一言で言えば
nodeport:
nodeip:portのすべてのワーカーノードで外部リクエストをリッスンし、リクエストをポートに転送します。
port:
コンテナーの内部クラスターサービスポート。ノードポートからの着信要求をリッスンし、targetPortに転送します。
targetPort:
ポートからリクエストを受信し、待機しているコンテナーpod(port)に転送します。指定しなくても、デフォルトでポートと同じポート番号が割り当てられます。
「ターゲットポート」は、コンテナが実行されているポートです。
ポート:ポートは、サービスからコンテナーにトラフィックをリダイレクトします。
デプロイメントを公開する
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:サービスが外部にアクセスできるようにするポートです。
これが答えることを願っています。
コンテナーがポート9376でリッスンする場合、 targetPort:9376
サービスがポート80でリッスンする場合、 ポート:80
次に、サービスポート設定は以下のようになります
ports:
- protocol: TCP
port: 80
targetPort: 9376
最後に、リクエストはサービスのポートに受信され、ポッドのtargetPortに転送されます。