はじめに
KubeVirt/Harvester 上で仮想アプライアンス(今回は Coriolis Appliance)を起動したところ、
- VM は正常起動
- bridge 接続
- management Network 選択済み
にもかかわらず、外部PCからアクセスできない、という問題に遭遇しました。
最終的には、
networks:
- pod: {}
を、
networks:
- multus:
networkName: default/custom
へ変更することで解決しました。
この記事では単なる「解決手順」だけでなく、
- Harvester / KubeVirt のネットワーク構造
- bridge と pod network の関係
- なぜ UI だけでは分かりづらいのか
まで含めて整理します。
環境
- Harvester
- Coriolis Appliance
- 自宅LAN:
192.168.11.0/24 - Harvester Host:
192.168.11.8
発生した問題
VMコンソールを見ると:
IPv4 address for eth0: 10.52.0.79
となっていました。
しかし、自宅PC (192.168.11.x) から:
ping 10.52.0.79
は通らず、Web UI にもアクセスできません。
最初に疑ったこと
最初は、
- アプライアンス側固定IP
- cloud-init
- DHCP設定ミス
などを疑いました。
しかし VM 内部を確認すると:
ip a
inet 10.52.0.79/32
さらに:
ip route
結果:
default via 169.254.1.1 dev eth0
ここで違和感がありました。
重要な気付き
169.254.x.x や 10.52.x.x は、家庭LANでは普通出てきません。
つまり VM は、
物理LANではなく
Kubernetes内部ネットワーク
へ接続されている可能性が高い。
VM YAML を確認
Harvester UI 上では、
- management Network
- bridge
に見えていました。
しかし YAML を確認すると:
interfaces:
- bridge: {}
macAddress: (環境に固有のアドレス)
model: virtio
name: default
これは問題ありません。
しかし、
networks:
- name: default
pod: {}
となっていました。
ここが本質でした。
bridge = 物理LAN、ではない
これは KubeVirt 初学者が非常に混乱しやすいポイントです。
KubeVirt/Harvesterでは:
Interface と Network は別概念
です。
つまり:
bridge: {}
は、
「どのネットワークへbridgeするか」
を指定していません。
実際に接続先を決めるのは:
networks:
側です。
pod network とは?
pod: {}
は、
Kubernetes Pod Network
を意味します。
つまり VM は:
Kubernetes内部ネットワーク
に存在していた。
そのため:
- 10.52.x.x
- 169.254.1.1
になっていたわけです。
解決方法
Harvester で VM Network を作成しました。
その後 VM YAML を変更。
変更前:
networks:
- name: default
pod: {}
変更後:
networks:
- multus:
networkName: default/custom
name: default
結果
VM起動後:
ip a
結果:
192.168.11.12
さらに:
https://192.168.11.12
へブラウザからアクセス成功。
なぜ UI では分かりづらかったのか
Harvester UI では、Netowork設定でTypeとして「bridge」を選択できます。
しかし内部的には:
- pod network
- multus network
- bridge plugin
などが抽象化されています。
つまり UI の「bridge」だけでは、
本当に物理LANへ出ているか
は分からない。
一般化すると
今回の問題は Coriolis 固有というより、
KubeVirt / Harvester のネットワーク抽象化
に起因しています。
特に:
bridge にしたのに外部からアクセスできない
場合、
まず確認すべきは:
networks:
- pod: {}
になっていないか、です。
学んだこと
VMware感覚を持ち込むと混乱する
VMware では:
NIC = Bridged
で完結します。
しかし KubeVirt は:
Interface
+
Network Attachment
の二層構造。
「bridge」は接続先ではない
重要。
bridge: {}
は:
「接続方式」
であり、
「どのネットワークに繋ぐか」
ではない。
pod network は内部ネットワーク
pod: {}
は外部LANではなく、
Kubernetes内部ネットワーク
です。
まとめ
Harvester/KubeVirtでは、
interfaces:
だけでなく、
networks:
を見る必要があります。
特に:
pod: {}
なのか、
multus:
なのかで、VM の世界が完全に変わります。
同じように、
- bridge にしたのに繋がらない
- 10.x.x.x が出る
- 169.254.x.x gateway が出る
という場合は、
まず VM YAML を確認してみると解決が早いかもしれません。


