異なるDockerホストに配置されたコンテナ同士での通信を可能にするflannelですが、使ってばかりでその仕組みを理解していなかったので調べてみました。
具体的な構成
コンテナ10.1.11.xからコンテナ10.1.12.yへのパケット転送フローは以下の通りになります。
- 自身のネットワークへのパケットではないので、コンテナはデフォルトゲートウェイであるLinux Bridge docker0のIP 10.1.11.1(/24)にパケットを転送する (自ホスト内のコンテナへのパケットの場合、直接転送して終了)
- Linuxパケット転送機能を利用して、VXLANデバイス flannel0のIP 10.1.11.0(/16)にパケットを転送する
- flannel0とflanneldはパケットの宛先とetcdの情報を参照し、パケットを転送するべきNodeのIPを判断。その後、指定されたVNIを付与したVXLANカプセル化を行う。
- Node1のnicからNode2のnicへカプセル化されたパケットを転送する
- flanneldとflannel0はパケットのカプセル化を解除し、docker0のIP 10.1.12.1にパケットを転送する
- 宛先コンテナのIPである10.1.12.yにパケットを転送する
構成されるネットワーク
flannelとDockerによって構成されるコンテナネットワークは上記の通りになります。flannelはLinuxパケット転送機能によってルータのように振る舞い、さらにVXLANによって物理ネットワークをバックエンドとした10.1.0.0/16の仮想ネットワークを構成します。これにより論理的にはあたかも通常のL3ネットワークが構成されたかのようになります。
まとめ
私が理解した内容をざっくりと書いたので厳密性には欠けるかもしれませんが、なんとなくでいいので理解した気になりたい人にはこのぐらいの説明の方がむしろわかりやすいかもしれないと思い、記事にしました。Dockerでマルチホスト環境を構成する方の手助けになれば幸いです。