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