(O+P)ut

アウトプット



(O+P)ut

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

【Kubernetes】NodePortとLoadBalancerの違い

スポンサーリンク

はじめに

以下記事にてKubernetesのサービスで利用するClusterIPとNodePortの違いについて説明しました。

その違いは K8sクラスタに所属していないマシンからポッド内に通信できるか否か です。

一方で上記の特徴を持つNodePortと同じくLoadBalancerでも同様のことが可能です。

本記事ではNodePortとLoadBalancerの違いを説明します。

LoadBalancerとは?

kubectl get serviceでそれぞれを見れば分かりやすいです。

NAME           TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)        AGE
hoge-cluster       ClusterIP      None         <none>          x/TCP       x
hoge-lb   LoadBalancer   xx   x.x.x.x   80:xx/TCP   x
hoge-node      NodePort       xx   <none>          80:xx/TCP   x

LoadBalancerでは「External-IP」がアサインされ、このIPに対して通信を行うことでそれに紐づくPodsに振り分けられます。

ちなみにLoadBalancderのYAMLファイルの例は以下です。

apiVersion: v1
kind: Service
metadata:
  name: hoge-lb
spec:
  type: LoadBalancer
  selector:
    name: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

NodePortとの違いは?

先ほどの比較として、NodePort目掛けて通信する際の宛先IPはノードのIPアドレスとなります。

つまり各ノードに個別でアクセスを行う場合はNodePortを利用し、各ノードへの振り分けをロードバランサが行う場合はLoadBalancerを利用します。

以下の資料がそのイメージを可視化しています。

f:id:mtiit:20200506152719p:plain
図解(GKE説明資料より抜粋)

終わりに

一般的に外部にサービスを公開する際はLoadBalancerを利用します。(複数サービスを公開する際はさらにIngressを利用します)
もちろんNodePortはローカル環境でテストする際などでは分かりやすいので便利ですが、そうではない場合NodeのIPが変更されると接続する側で接続先を変更する必要がある等、注意が必要です。

どちらもK8sクラスタ外からアクセスを行う際に利用するサービス&違いは外部IPを利用して複数ノードの束ねるか否かと覚えておくと大まかな理解をしておくだけでも役立つと思います。