本文へスキップ
BecomeCoder

Kubernetesコース · 第4章 ネットワーキング ― Service と Ingress · レッスン21

Serviceの種類 ― ClusterIP・NodePort・LoadBalancer

ブラウザで完結

導入

前のレッスンの Service は、クラスタの内側からしか使えませんでした。ではブラウザなど外の世界から Pod へアクセスさせたいときはどうするのか。Service には公開範囲の異なる**種類(type)**があり、それを選ぶことで外部公開を実現します。代表的な3種を比べます。

説明

Service の spec.type には主に次の3つがあります。

apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  type: NodePort        # ここで種類を選ぶ(既定は ClusterIP)
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 8080
種類公開範囲仕組み主な用途
ClusterIP(既定)クラスタ内部のみ内部専用の仮想 IP を割り当てるPod 同士の内部通信
NodePort外部から可各ノードの特定ポート(例 30080)を開ける検証・小規模な外部公開
LoadBalancer外部から可クラウドロードバランサを自動で用意し公開する本番の外部公開(クラウド上)

NodePort は、クラスタを構成する各ノードの同じ番号のポートを開放し、そこへ来た通信を Service 経由で Pod へ流します。手軽ですが、利用者にノードの IP とポート番号を意識させるため、本番向きではありません。

LoadBalancer は、AWS や Google Cloud などクラウド環境で使うと、クラウド側の**ロードバランサー(負荷分散装置)**を自動的に1台立ち上げ、そこに外部からアクセス可能なアドレスを付けてくれます。外部公開の実運用ではこれが基本になります。

graph TB
    User["外部の利用者"]
    User -->|クラウドのLB経由| LB["Service type: LoadBalancer"]
    User -->|ノードのポート:30080| NP["Service type: NodePort"]
    LB --> Pod1["Pod"]
    NP --> Pod2["Pod"]
    Internal["内部のPod"] -->|内部だけ| CI["Service type: ClusterIP"]
    CI --> Pod3["Pod"]

LoadBalancer はクラウドが対応していないと使えません。次のレッスンでは、HTTP なら LoadBalancer をいくつも立てずに済む、もっと賢い外部公開の入口 Ingress を紹介します。

実際に動かしてみよう

上がマニフェスト(YAML)エディタ、下が kubectl の端末です。エディタの内容は `manifest.yaml` として保存され、下で `kubectl apply -f manifest.yaml` を実行するとクラスタに反映されます(pod.yaml / deploy.yaml / service.yaml も最初から置いてあります)。`kubectl get pods` / `describe` / `scale` / `rollout` などで結果を確かめましょう(本物のKubernetesではなく、動きを再現した軽量なシミュレータです)。各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」で戻せます。

kubectl(シミュレート)

マニフェスト(YAML)を書いて kubectl コマンドを試せる学習用クラスタを読み込みます(本物のKubernetesではなく、apply/get/describe/scale/rollout などの動きを再現した軽量な自作シミュレータです)。
スクロールして表示された時点でも自動で読み込まれます。