
KubernetesでPod作成時に裏側で実行されるネットワークコマンド
Kubernetesを使っていると、すべてよしなに動いていて、実際にどんなことが起きているか気になりますよね。KubernetesでPodを作成すると、ネットワーク設定が自動的に行われます。その仕組みを「有線ルータとPCをLANケーブルで接続する」という例えを使ってまとめていきます。
Pod作成時に動くネットワークコマンドの流れ
Kubernetesは以下のようなネットワーク設定を実行します。この操作を、有線ルータとPCをLANケーブルで接続する準備に例えながら解説します。
1. ネットワークインターフェースを作成する (ip link add)
コマンド例(ルータ側で実行):
ip link add veth0 type veth peer name veth1
説明:
仮想ネットワークインターフェースペア(vethペア)を作成します。一方の端(veth0)はホスト(ルータ)に、もう一方の端(veth1)はPod(PC)に割り当てられます。
有線ルータの例え:
LANケーブルを用意する作業です。この作業はルータ(ホスト)側で実行されます。ルータがケーブルを新しく作り出し、一端を自分(ルータ)用、もう一端をPC用に準備します。
2. インターフェースを名前空間に移動する (ip link set)
コマンド例(ルータ側で実行):
ip link set veth1 netns <pod-namespace>
説明:
作成したネットワークインターフェースの片端(veth1)をPod専用のネットワーク名前空間に移動します。
有線ルータの例え:
LANケーブルの片方をPCに差し込みます。この操作もルータ(ホスト)側で行われます。ルータがケーブルをPCの「部屋」に届けるイメージです。
3. IPアドレスを割り当てる (ip addr add)
コマンド例(PC側で実行):
ip -n <pod-namespace> addr add 192.168.1.2/24 dev veth1
説明:
Pod内のネットワークインターフェース(veth1)にIPアドレスを割り当てます。このアドレスは、ネットワーク上でPodを識別するために必要です。
有線ルータの例え:
LANケーブルをPCに差し込んだだけでは通信できません。次に、PC自身が「自分の住所(IPアドレス)」を設定します。この作業はPC(Pod)側で行います。例えば「自分のIPは192.168.1.2だ」と設定し、ネットワーク上で名乗る準備を整えます。
4. ルートを追加する (ip route add)
コマンド例(PC側で実行):
ip -n <pod-namespace> route add default via 192.168.1.1 dev veth1
説明:
Podが外部ネットワークや他のPodにアクセスするための経路(ルート)を設定します。
有線ルータの例え:
PC側で「外に通信するときは、このルータ(ゲートウェイ)を通ればいい」と設定します。この作業もPC(Pod)側で行います。PCが「インターネットに行くにはルータ192.168.1.1を通るんだな」と理解するプロセスです。
全体の流れをまとめたスクリプト例
以下は、上記の手順をまとめたシンプルなスクリプト例です。
# ルータ(ホスト)側で実行
# 1. vethペアを作成
ip link add veth0 type veth peer name veth1
# 2. veth1をPodのネットワーク名前空間に移動
POD_NAMESPACE="pod-namespace"
ip link set veth1 netns $POD_NAMESPACE
# PC(Pod)側で実行
# 3. Pod内でIPアドレスを設定
POD_IP="192.168.1.2/24"
ip -n $POD_NAMESPACE addr add $POD_IP dev veth1
# 4. Pod内でデフォルトルートを設定
DEFAULT_GATEWAY="192.168.1.1"
ip -n $POD_NAMESPACE route add default via $DEFAULT_GATEWAY dev veth1
# ルータ(ホスト)側で実行
# 5. ホスト側のインターフェースを有効化
ip link set veth0 up
有線ルータとPCでのネットワーク構築の全体像
ip link add(ルータ側):
ルータがLANケーブルを用意します。ip link set(ルータ側):
LANケーブルの片端をPCに接続します。ip addr add(PC側):
PCが自分の住所(IPアドレス)を設定します。ip route add(PC側):
PCが「外部との通信経路(ルート)」を設定します。ip link set(ルータ側):
ルータ側でLANケーブルを有効化し、通信を開始します。
なぜPCとルータで役割分担があるのか?
ルータとPCの役割分担は次の通りです:
ルータ側(ホスト): ケーブルを用意し、接続を管理します。
PC側(Pod): 自分の設定(IPアドレスや通信ルート)を行います。
例え:
ルータが「通信道路を整備する役割」、PCが「道路上で自分の車のナンバーを登録して目的地への道順を決める役割」を担います。こうすることで、PC(Pod)は他のデバイスやインターネットとスムーズに通信できるようになります。
まとめ
KubernetesでPodを作成する際、ネットワーク設定は有線ルータとPCを接続するプロセスとよく似ています。ホスト(ルータ)はケーブルを用意して管理し、Pod(PC)は自分自身の設定を行います。この役割分担を理解することで、ネットワークの仕組みやトラブルシューティングの理解が深まると思います!