はじめに
以下記事にて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を利用します。
以下の資料がそのイメージを可視化しています。
終わりに
一般的に外部にサービスを公開する際はLoadBalancerを利用します。(複数サービスを公開する際はさらにIngressを利用します)
もちろんNodePortはローカル環境でテストする際などでは分かりやすいので便利ですが、そうではない場合NodeのIPが変更されると接続する側で接続先を変更する必要がある等、注意が必要です。
どちらもK8sクラスタ外からアクセスを行う際に利用するサービス&違いは外部IPを利用して複数ノードの束ねるか否かと覚えておくと大まかな理解をしておくだけでも役立つと思います。