回答:
サービス:トラフィックをポッドに転送します。
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:30475Webサーバーのページを書き込んで表示します。これは、ポート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に転送されます。