「Oracle Cloud Hangout Cafe (OCHaCafe)」ダイジェスト2 3

Oracle Cloud Hangout Cafe Season 4 #2「Kubernetesのネットワーク」(2021年5月12日開催)

第2弾の連載第3回では、2021年5月12日に開催された 「Oracle Cloud Hangout Cafe Season4 #2『Kubernetesのネットワーク』」の発表内容に基づいて紹介していきます。

仁井田 拓也

2024年2月20日 6:30

はじめに

Oracle Cloud Hangout Cafe」(通称「おちゃかふぇ」/以降、OCHaCafe)は、日本オラクルが主催するコミュニティの1つです。定期的に、開発者・エンジニアに向けたクラウドネイティブな時代に身につけておくべきテクノロジーを深堀する勉強会を開催しています。

連載第3回の今回は、2021年5月12日に開催された「Oracle Cloud Hangout Cafe Season 4 #2『Kubernetesのネットワーク』」の発表内容に基づいて紹介していきます。

Dockerのネットワークから始まり、Kubernetesクラスタを実現するネットワークや、そのインタフェースであるContainer Network Interface(CNI)の仕組み、代表的なCNIプラグイン、CNIプラグインを使用したファイアウォールの仕組みであるNetworkPolicyを見ていきます。

アジェンダ

今回は、以下のアジェンダの流れに従って、順に解説します。

  • Dockerのネットワーク
    • bridge、host、none
  • Kubernetesのネットワークの仕組み
    • ネットワーク名前空間、Container Network Interface(CNI)、Cluster Networking
  • Container Network Interface(CNI)の代表的なプラグイン
    • flannel、Calico、Weave Net、Cilium、kube-router、Antrea
  • NetworkPolicyとPod間セキュリティ
    • NetworkPolicy

発表資料と動画については、下記のリンクを参照してください。
資料リンク
動画リンク

Dockerのネットワーク

まず、Kubernetesのネットワークに入る前に、Dockerのネットワークをおさらいします。Dockerのネットワークには、以下の3つの要素があります。

  • 仮想ブリッジ
    • Linux上に仮想的なL2スイッチを構成する機能
    • 仮想マシンやホスト同士を通信させるために利用
  • veth
    • 仮想的なL2ネットワークインタフェース(仮想NIC)
    • 2つのインタフェースをペアとして作成
  • iptables
    • Linuxに実装されたパケットフィルタリング/ネットワークアドレス変換の機能
    • ファイアウォール/NAT(SNAT/DNAT/Masquerade)などの機能を提供

Dockerがデフォルトで用意しているネットワーク

Dockerのネットワークは、デフォルトで以下の3パターンが実装されています。これらはDockerインストール直後から利用できるネットワークで、docker network lsで表示できます。

  • bridge
    • Dockerのデフォルトのネットワークであり、最も利用される仕組み
      • Linuxのbridge機能を利用してLinux上にDockerおよびコンテナ用のネットワークを構築
        • Dockerがdocker0(仮想ブリッジ)というbridge networkを作成
          • コンテナ側とDockerデーモン側のネットワーク(≠ホストネットワーク)をvethペアで接続
          • docker0はDockerデーモン側のネットワークとホストネットワークのvethと接続
    • コンテナそれぞれにIPを付与
    • ホストの任意ポートをコンテナの任意のポートにマッピングできる(docker runコマンドの-p(--publish)オプションの利用)
    • 独自のbridge networkも作成できる

bridge-network

  • host
    • ホスト側のネットワークインタフェースに接続
      • ネットワーク設定はホストと同一
    • bridgeのようなポートマッピングは不可(docker runコマンドの-p(--publish)オプションの利用)
      • 特定のポートで起動するコンテナを2つ以上起動させることはできない

host-network

  • none
    • ループバックアドレス(localhost)のみが利用できるネットワーク
    • 主にコンテナのネットワークを無効化したい場合に利用

none-network

ここまでは同一ホスト上のコンテナネットワークについて見てきましたが、参考として、異なるホスト上に存在するコンテナのネットワークの仕組みであるoverlay networkという仕組みも紹介します。

overlay networkはVXLAN(L2 over L3)の技術を利用して実現するもので、Dockerホストが異なる拠点やデータセンタに存在しても、同じネットワーク上に存在しているものとしてアクセスできます。overlay networkにはKVS(Key-Value Store)が必須になっており、Dockerホストのディスカバリなどに利用します。Key-Value StoreはConsul/etcd/ZooKeeperをサポートしています。

overlay-network

bridgeネットワークの操作

ここでは、Dockerネットワークについて実際にCLIでの操作を見ていきます。今回は先ほど紹介した3パターンの中から、最もよく利用されるbridgeについて解説します。

  • Dockerネットワークの作成
    $ docker network create --driver bridge <ネットワーク名>
  • Dockerネットワークの詳細確認
    $ docker network inspect <作成したネットワーク名>
  • 作成したbridgeネットワークの利用(1)
    $ docker run --net=<作成したネットワーク名> --name=<コンテナ名> image名
  • 作成したbridgeネットワークの利用(2)
    $ docker network connect <作成したネットワーク名> <コンテナ名>

Dockerのネットワークにおける課題

Dockerのネットワークの仕組みには課題があります。特に最もよく利用されるbridgeネットワークでは、iptablesによるNAT形式での通信を利用(overlay networkは除く)します。この仕組みはコンテナが増えるたびにiptable(NATテーブル)に追記していくことになり、コンテナが増えれば増えるほどNATテーブルの管理が煩雑になります。

この後で紹介するKubernetesは、特にコンテナ間の通信について「NAT不要のテクノロジーを利用してフラットなネットワークを構築しよう」という世界観に基づいて設計されています。

docker-issue

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る