LoginSignup
1
0

Kubernetes NodePortサービスの設定方法: port, nodePort, targetPortの役割と使い分け

Posted at

概要

KubernetesのNodePortサービスの設定では、port、nodePort、targetPortの3つのポートを指定できます。これらのポートはそれぞれ異なる役割を持ち、NodePortサービスの動作を制御します。

NodePortは、クラスター外部からKubernetesクラスター内のサービスにアクセスするための方法の1つです。NodePortサービスを作成すると、Kubernetesは各ノード上に指定されたポートを開き、そのポートへの通信をサービスに転送します。NodePortサービスを設定するには、サービスマニフェストのspec.typeフィールドをNodePortに設定し、spec.portsフィールドで公開するポートとターゲットポートを指定します。また、nodePortフィールドを使用して、ノード上で公開するポートを指定することもできます。指定しない場合、Kubernetesは30000から32767の範囲でポートを自動的に割り当てます。

NodePortサービスは内部にClusterIPを持ち、クラスター内の他のPodからはClusterIPを介してアクセスできます。外部からのアクセスは、任意のノードのIPアドレスとNodePortで指定されたポートを介して行われます。NodePortは、Kubernetesによる負荷分散の制御が限定的な場合や、独自の負荷分散機構を使用する場合に適しています。ただし、NodePortだけでは複数ノード間の負荷分散は行われないため、必要に応じて外部のロードバランサーと組み合わせて使用します。

targetPortの詳細と使用例

targetPortは、Serviceが転送するトラフィックを受け取るPod内のポート番号またはポート名を指定します。これにより、ServiceとPodの間でポートマッピングを柔軟に行うことができます。デフォルトでは、targetPortはServiceのportフィールドと同じ値に設定されますが、異なる値を指定することで、Serviceが公開するポートとPodが受け取るポートを別々に設定できます。これは、バックエンドソフトウェアのバージョンアップ時にPodのポート番号を変更する場合などに便利です。

また、targetPortには、Pod内で定義されているNamedPortを指定することもできます。NamedPortを使用すると、同一のService内で複数の種類のPodが混在している場合でも、ポート名を介して適切なPodにトラフィックを転送できます。

使用例として、以下のようなServiceマニフェストがあります。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - port: 80
      targetPort: 8080
  type: NodePort

この例では、Serviceは80番ポートで受け付けたトラフィックを、app: MyAppラベルが付与されたPodの8080番ポートに転送します。targetPortを適切に設定することで、Serviceとバックエンドのポートマッピングを柔軟に行い、アプリケーションの要件に合わせたネットワーク設定を実現できます。

portとnodePortの違いと使い分け

portとnodePortは、KubernetesのNodePortサービスにおいて重要な役割を持つ設定項目ですが、その役割と使い分けは異なります。portは、Serviceが公開するクラスター内部のポート番号を指定します。これは、Serviceに割り当てられたClusterIPに対して使用されるポートであり、クラスター内の他のPodからこのポートを介してServiceにアクセスできます。

一方、nodePortは、各ノード上で公開されるポート番号を指定します。これは、クラスター外部からServiceにアクセスするために使用されます。外部のクライアントは、任意のノードのIPアドレスとnodePortで指定されたポートを介してServiceに到達できます。

portとnodePortの使い分けは、以下のように整理できます。

  • クラスター内部の通信には、portを使用する。PodはClusterIPとportを使ってServiceと通信する
  • クラスター外部からのアクセスには、nodePortを使用する。外部クライアントは、ノードのIPアドレスとnodePortを使ってServiceにアクセスする

nodePortを明示的に指定しない場合、Kubernetesは30000から32767の範囲で空いているポート番号を自動的に割り当てます。

以下は、portとnodePortを指定したServiceマニフェストの例です。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30001
  selector:
    app: MyApp

この例では、Serviceは内部的に80番ポートを公開し、外部からは30001番ポートでアクセス可能になります。portとnodePortの適切な設定と使い分けにより、Serviceのアクセシビリティを柔軟に制御できます。

portとnodePortのセキュリティ面での違いは、nodePortがクラスター外部からアクセス可能であるため、適切なセキュリティ対策が必要になることです。一方、portはクラスター内部でのみ使用されるため、相対的にセキュリティリスクは低くなります。

nodePortを使用する際のパフォーマンスへの影響は、各ノードでポートを開放し、トラフィックを転送する必要があるため、大量のトラフィックが発生する場合にはオーバーヘッドが増大する可能性があります。負荷分散の観点からも、外部のロードバランサーと組み合わせて使用することが推奨されます。

nodePortの設定でよくあるトラブルシューティングとしては、ファイアウォールによるポートの制限、ポート番号の競合、セレクターラベルの不一致などが挙げられます。これらの問題を解決するには、ファイアウォールの設定確認、ポート番号の変更、ラベルの修正などを行います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0