導入
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 を見ていきます。