KDOC 477: 『Docker-Kubernetesネットワークのしくみ』

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

メモ

  • VXLANはVLANの拡張で、大規模なネットワークを仮想的に分割できる。EthernetフレームをUDP/IPパケットでカプセル化する。このカプセル化により、Ethernetフレームは自身のIPアドレスやMACアドレスを変更することなく、異なるネットワークセグメント間を移動できポータビリティが向上する(p15)
  • Networ Namespace(netns)を使用することでネットワークスタックを異なるNamespaceに分離し、互いに独立して動作させられる(p15)
アプリ
  - HTTP

|
| システムコール
v------

カーネル
  - TCP
  - IP
  - Ethernet
|
|------
v
- ハードウェア
  - NIC
  • ソケットにはIPアドレスとポート番号の組み合わせが記録され、通信元と通信先を指定している(p19)
  • 3way handshake のメリット(p20)
    • 相手先に転送を始めることを通知できる
    • 要求のあったポートを受け入れられるかチェックできる
    • 再送制御や流量制御ができる
  • IP層の役割は、TCP層から受け取ったデータにIPパケットを付与し、下位レイヤのL2にデータを送ること(p21)
  • ルーティングテーブルはルーティングプロトコルによって作成され、パケットが目的地に到達するための最良の経路を記録するしくみになっている。ルーティングプロトコルにはRIP, OSPF, BGPなどがある(p24)
  • Dockerではdocker0という仮想ブリッジがデフォルトで設定されている。このブリッジはコンテナが外部と通信するためのゲートウェイの役割を果たす(p25)
apt install bridge-utils
brctl show docker0
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242014087d9	no		veth8461c84
							vethd66994d
  • VLANは、物理ポートにIDを設定し、セグメントを分ける技術である。VLANを使わない場合は1つのスイッチに対して1つのセグメントしか設定できない(p34)
  • VLANの利点の1つは、複数のスイッチにまたがっても同一セグメント(Ethernetフレームをもとに通信が行われる範囲)として扱えることである。複数のスイッチを連携させて1つの大規模なL2ネットワークを構築できる。Ethernetフレームだけを見るのでIPアドレスのセグメントは変わらない(p34)
  • VXLANとは、同じL2ネットワーク上のEthernetフレームをL3ネットワークを介して送り届けられる技術である(p35)
  • パケットはネットワークデバイスを通過するときルーティングのためにそのパケットのヘッダ情報が書き換えられる(p36)
  • VXLANはL3ネットワーク上に仮想的なL2ネットワークを作り出すことからネットワークオーバーレイと呼ばれる(p35)
  • VXLANはEthernetフレームをUDP/IPでカプセル化するため、元のEthernetフレームの外側にさらにEthernetヘッダやIPヘッダがつけられる。これを「外部ヘッダ」という。もともとのEthernetフレーム内のヘッダは「内部ヘッダ」という(p35)
  • iptables の項目(p55)
    • テーブル: 処理機能を設定する
    • チェイン: ルールを適用するタイミングを設定する
    • ターゲット: iptablesルールに一致したパケットに対してどのようなアクションを取るか定義する
  • PREROUTINGチェインによるNAT変換が行われたあとにINPUT, OUTPUT, FORWARDが適用される。そのためフィルタリングルールを設定するときにはNAT変換後の情報を使うことが重要である(p57)
  • iptables から、Dockerをインストールした状態のチェインの流れを図示する(p60)
  • natテーブルのPOSTROUTINGチェインで、送信元アドレスはホストインターフェースのIPアドレスに変換される。インターネット上のデバイスやサーバはDockerコンテナのIPアドレスを知らず、ホストのIPアドレスしか知らないから変換が必要になる
  • ホストのIP:8888へのアクセスがコンテナのIP:80に割り振られるような場合、NAPTで変換が実行されている(p67)
  • Dockerをインストールした直後はデフォルトで3種類のネットワークが作成される(p74)
    • bridge: デフォルトで作成されるネットワーク。コンテナを起動するときネットワークを指定しないとデフォルトでこのネットワークに所属する
    • host: ホストのネットワーク。ホストと同じネットワークにコンテナを所属させる
    • none: どのネットワークにも所属させない
  • ip netns コマンドはネットワーク名前空間の作成、削除、表示が主な機能であるのに対し、nsenterコマンドはネットワークのみならずプロセスやユーザなどさまざまなタイプの名前空間に入るために使用される(p77)
  • macvlan ドライバを使うとコンテナに独自のMACアドレスを割り当てられる。これにより、物理ネットワーク上でコンテナを直接通信させられる(p81)
  • 外部からリクエストしてコンテナに流れていく様子(p98)
  • ポートフォワードは送信先/元IPの管理が必要である。オーバーレイネットワークの場合はあらかじめ環境を構築すればそのあとはコンテナのIPアドレスを指定するだけで通信でき、ホストのIPアドレスは不要となる(p113)
  • IngressはHTTP情報を見て通信をルーティングするため、HTTPS通信の場合はクライアントから送られてきた通信内容を復号する必要がある。IngressがSSL/TLS通信の終端になる(p176)
  • applyしたときの流れ(p188)
  • VXLANによって、あるコンテナは別コンテナのIPアドレスを直接指定して通信できる(p215)

疑問や感想。

  • ブリッジ・スイッチ・ルーターの違い
  • フレームとパケットの違い
  • コンテナにもMACアドレスがある
  • コンテナのフラッティングとARPの違いがわからない(p27)
  • veth がよくわからないな
  • 解説の薄い用語の整理
    • enX0: 物理NIC – 実際のネットワークへの接続
    • vxlan0: 仮想トンネル/VXLAN – L2 を L3 上で運ぶ overlay network
    • bridge: 仮想スイッチ – L2スイッチ。ケーブルが集まるハブ
    • veth: 仮想ケーブル/ペア – namespace / コンテナとの接続
  • vxlan: 別のホスト間でL2ネットワークを拡張したい
  • bridge: 複数のvethをまとめる、振り分ける
  • veth: 同一ホスト内で異なるネットワーク名前空間を接続したい
  • Kubenetesの章が知らない単語が多すぎてあまり頭に入ってこない。Kubenetesを知らないと厳しい
  • 小規模なコンテナネットワークを構築する場合はNATを利用する方法が簡単である(p198)、とあるが、コンテナにおけるNATはどのようなものか。そもそもNATが怪しい
  • ネットワークプラグインの用途にはどのようなものがあるか。マルチホストネットワークを作るだけではないのだろうか(p198)
    • CNIにはコンテナランタイムがネットワークプラグインに対してネットワークの追加や削除をするときのリクエストの仕様が定められている(p199)
    • ネットワークの要件(p198)とCNIは別なのだろうか
  • コンテナプラットフォームとCNIはどうやって情報をやりとりしているか。環境変数だけなのだろうか
    • 設定ファイルと環境変数だけ(p200)
    • この段階ではネットワーク設定はできてないから、環境変数を使って情報をやりとりするということか
  • なぜコンテナIDにNamespace.IDを設定するのだろうか(p210)
  • 前半読んだはずだが、VXLANがなにかを説明できない
  • eBPF optimization(p219)

関連

なし。