DockerでMacVlanを使う際に気を付けること
本稼働のDockerを入れようとしたときにちょっとはまったのでメモ。
Dockerに外部からアクセスさせるときに標準ではブリッジネットワーク+ホストIPへのポートフォワードをするが あまりパフォーマンスがよくないとの話を聞き、本稼働用DockerへはMacvlanを試してみることにしました
そもそもDocker のMacvlanとは?
Dockerの外部ネットワーク設定方法の1つ。別にDocker専用の機能ではなく実態はLinux標準実装の仮想インターフェース機能を用いて物理NICにサブIPを持たせている
イメージ的にはジャンル全然違いますがWEBサーバーのVirtualhostやDNSのCNAMEみたいなものと認識しています
で、この仮想IFってのが問題。今時Docker入れるようなところはまず間違いなくDocker on ハイパーバイザだ。
実際に遭遇したのはVMware環境だが、仮想スイッチはデフォルトで大体こんな設定になっている
仮想IFのMACアドレスはスイッチ側で認識されていないMACアドレスのため通常のARPテーブルを使ったスイッチングではパケットが送られない。そのためMacVlanを使う場合には無差別モードというスイッチが受け取ったパケットは配下のポートへMACアドレス見ずに垂れ流しってモードにする必要がある
私の時には遭遇しませんでしたが、無差別モードはVMのNICに対しても同様の設定ができ、e1000の場合は明示的に指定、VMNET2,3系NICは無差別モードにしなくても必要に応じて切り替えてくれるともどこかのサイトに書いてありました。