Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:Pod・Deployment・ReplicaSet | 関連:ConfigMap・Secret・ボリュームデプロイ戦略(ローリング・ブルーグリーン・カナリア)

要点(BLUF)

概念 ── 動く標的に安定した宛先を

Pod は作り直されるたびにIPが変わります(Pod・Deployment・ReplicaSet)。これでは「どこに繋げばいい?」が定まらない。Service は、ラベルセレクタで該当Podを動的に追跡し、変わらない仮想IPと内部DNS名を提供します。クライアントは Service 名で繋ぐだけ。

flowchart TB
    client["クライアント"] -->|"web という名前で接続"| svc["Service web(安定した仮想IP)"]
    svc -->|"ラベル app=web で選別・分散"| p1["Pod(変わるIP)"]
    svc --> p2["Pod"]
    svc --> p3["Pod"]

これはコンテナのネットワーク名前解決(コンテナのネットワークとボリューム)を、クラスタ規模・動的Pod対応に拡張したものです。

仕組み① ── Service の型

公開範囲用途
ClusterIP(既定)クラスタ内部のみサービス間通信(DB・内部API)
NodePort各ノードの固定ポート簡易な外部公開・検証
LoadBalancerクラウドのLB経由で外部本番の外部公開(要最新確認・課金)
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web                  # このラベルのPodへ振り分ける
  ports:
    - port: 80                # Service の受け口
      targetPort: 80          # Pod 側のポート
  type: ClusterIP             # 内部のみ(既定)

仕組み② ── Ingress(L7ルーティング)

Service を外に出すたびに LoadBalancer を払い出すと、LBが増えてコストも増えるIngress は1つの入口で、HTTP のホスト名やパスを見て適切な Service へ振り分けます。TLS(HTTPS)の終端も集約できます。

flowchart TB
    user["外部ユーザー"] --> ing["Ingress(1つの入口・L7)"]
    ing -->|"/api → "| svcapi["Service api"]
    ing -->|"/ → "| svcweb["Service web"]
    ing -->|"shop.example.com → "| svcshop["Service shop"]
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: site
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api
                port: { number: 80 }
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port: { number: 80 }

Ingress を効かせるにはクラスタに Ingress コントローラ(nginx 等)が要ります。L4 の負荷分散の原理や TCP/IP は コンピュータネットワーク へ。ここは「マネージド/標準部品をどう組むか」。

なぜ Service と Ingress を分けるのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/04-03_service.yaml(前トピックの Deployment に ClusterIP Service を付け、kubectl port-forward で到達確認 → Pod を消しても Service 経由で繋がり続けることを観察)。

関連

第4章 Kubernetes 目次