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