(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes入門】ClusterIPとNodePortの違いは?

スポンサーリンク

はじめに

Kubernetesの世界ではServiceという概念があり、そのServiceの中のタイプとしてClusterIPやNodePortがあります。

本記事では初学者の方に向けてClusterIPやNodePortとはなんぞや?という点について分かりやすく解説しました。

コマンド実行環境
  • Kubernetes 1.23

サービス(Service)とは?

IPアドレスが変動するポッドに対してクライアントが一意の宛先でアクセスするために作成するオブジェクトがサービスで、サービスには以下のようなサービスタイプがあります。

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternaName

一番分かりやすいのはClusterIPで、以下のように複数のPodが存在する際に

# kubectl get deployment 
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
mynginx   3/3     3            3           ..

exposeすることでCLUSTER-IPが採番され、同IPに接続すれば3つのPodのどれかに接続できます。

# kubectl expose deployment/mynginx --port=80
service/mynginx exposed
# kubectl get service
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
mynginx   ClusterIP   10.96.199.XX   <none>        80/TCP    5s

ポイントとしてはPodが増えてもPodが減ってもServiceのIPアドレスは変動しません。
よってクライアントは起動される度に変わるPodのIPアドレスを気にせずにコンテナに通信ができます。

ClusterIPとNodePortの違い

そんなClusterIPですが、実はKubernetesのクラスター外からはアクセスができません。
先程CLUSTER-IPの欄に表示されていたIPアドレスはPod間同士であったりKubernetesのNodeからは利用できますが、別のマシンからは利用ができません。一方で、NodePortを利用するとNodeの特定ポートにアクセスすれば、ClusterIPに繋げてくれます。

先程作成したServiceを削除し、以下コマンドでNodePortのサービスを作成するとPORT(S)部分の記載に変化があります。

# kubectl expose deployment/mynginx --type=NodePort --port=80
service/mynginx exposed
# kubectl get service -n test
NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
mynginx   NodePort   10.105.244.XX   <none>        80:30460/TCP   5s

これは「Nodeの30460ポートにアクセスすればCLUSTER-IPに転送しますよ」という意味であり、NodeのIPは以下で確認が可能です。

# kubectl get node -o=wide

つまり、ClusterIPは各ポッド間の通信で利用するものですがNodePortはKubernetesクラスタ外からもアクセスが可能であり、クラスターを構成するノード外からアクセスさせる場合は、ClusterIPではなくNodePortを利用します。

尚、NodePortについて実機ベースで深掘りした内容は以下の記事を参照ください。

終わりに

NodePortとはクラスタ外からアクセスを行う上で必要なサービスで、特にサービスを外部に公開する際には必要です。
また、外部に公開する際にはロードバランサと呼ばれるサービスタイプも存在するので、興味がある方は以下をご参考ください。

以上です。