本文へスキップ
BecomeCoder

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

k8sのネットワークモデル ― 全Podが直接つながる

ローカル実施

導入

Kubernetes(クバネティス、以下 k8s)のネットワークには、とてもシンプルな大前提があります。クラスタ内のすべての Pod は、お互いの IP アドレスに直接届くというものです。まずこの気持ちのいいルールと、その裏に潜む「IP が変わる」という落とし穴を押さえます。

説明

クラスタ(cluster) とは、Pod を動かすためにまとめられたサーバー(ノード)の一群のことです。k8s は、どのノードで動いている Pod からでも、別の Pod の IP アドレスへ NAT(アドレス変換)なしにそのまま到達できることを保証します。「同じ社内 LAN にいる全員が、相手の内線番号を知っていれば直接かけられる」ようなイメージです。

graph TB
    subgraph cluster["クラスタ(全Podが直接届く)"]
        P1["Pod A<br/>10.1.0.5"]
        P2["Pod B<br/>10.1.0.6"]
        P3["Pod C<br/>10.1.0.7"]
        P1 --- P2
        P2 --- P3
        P1 --- P3
    end

ここまでは順調です。問題は Pod の寿命にあります。Pod は壊れたら作り直され、アプリを更新すれば古い Pod は捨てられて新しい Pod に置き換わります。そして 作り直された Pod は、前とは違う IP アドレスをもらうのです。

graph LR
    subgraph before["更新前"]
        A["Pod<br/>10.1.0.6"]
    end
    subgraph after["再作成後"]
        B["新しいPod<br/>10.1.0.42"]
    end
    before -. 作り直し .-> after

つまり、あるアプリが別のアプリの Pod へ「10.1.0.6 に接続」と IP を直接書いてしまうと、相手が一度でも作り直された瞬間に通信が切れてしまいます。全 Pod が直接つながれても、その住所が固定ではない。ここに「変わらない入口=Service が要る」という動機が生まれます。次のレッスンでその Service を見ていきます。