導入
Service で宛先は固定できました。とはいえ「web-svc の ClusterIP は 10.96.0.15」のような数字の住所を人間が覚えて書くのは現実的ではありません。k8s は Service に名前でアクセスする仕組みを標準で備えています。これを サービスディスカバリ(service discovery、宛先の自動発見) と呼びます。
説明
k8s のクラスタには DNS(ドメインネームシステム、名前を IP に変換する電話帳) が組み込まれています。Service を作ると、自動的に次の形式の DNS 名が割り当てられます。
<Service名>.<namespace>.svc.cluster.local
例: web-svc.default.svc.cluster.local
namespace(ネームスペース) はクラスタ内を区切る「部屋」のことです(詳しくは第6章)。同じ部屋(namespace)の中からなら、面倒な後半を省いて Service 名だけで呼べます。
# 同じnamespace内のPodから、Service名でIPを引ける
$ nslookup web-svc
Name: web-svc.default.svc.cluster.local
Address: 10.96.0.15
そのため、アプリのコードや設定に IP を焼き込む必要はまったくありません。接続先はこう書けます。
# アプリに渡す接続先の例(IPではなく名前で指定)
DATABASE_URL: "http://db-svc:5432"
API_ENDPOINT: "http://web-svc:80"
graph LR
App["呼び出す側のPod"] -->|"http://web-svc:80"| DNS["クラスタDNS<br/>名前→IPに変換"]
DNS -->|"10.96.0.15"| SVC["Service: web-svc"]
SVC --> Pod["対象のPod"]
住所(IP)が変わっても名前は変わらないので、アプリは常に名前で呼び続ければ済みます。「IP をハードコードしない」――これが k8s 上でアプリ同士をつなぐときの鉄則です。