Member-only story
図解でわかるKubernetesのネットワーキング【第1回】
あなたはKubernetesクラスター上で多くのサービスを実行し、その恩恵を受けています。あるいは、そうなるように自分で計画を立てているのではないでしょうか。クラスタのセットアップや管理に利用できるツールがたくさんあるにもかかわらず、内部ですべてのことがどのように動いているのか疑問に思っていることでしょう。壊れたらどこに問い合わせればいいんだろうと思っている人もいるでしょう。私もそうでした。
確かにKubernetesはシンプルで簡単に使えます。しかし、実際は、Kubernetesの内部は複雑な構造をしています。多くの可動部品があり、それらがどのように組み合わされて動作するのかを知ることは、失敗に備えるためには必須です。その中でも最も複雑で、おそらく最も重要なパーツのひとつが「ネットワーク」です。
そこで私は、Kubernetesのネットワークがどのように機能するのかを正確に把握しようと思いました。ドキュメントを読み、いくつかの講演を見て、コードベースも閲覧しました。その結果、以下のことがわかりました。
Kubernetes Networking Model
Kubernetes Networkingの核となるのは、1つの重要な基本設計思想です。
「すべてのPodはユニークなIPを持っている」
このPod IPは、このPodに含まれるすべてのコンテナで共有され、他のすべてのPodからもルーティング可能です。Kubernetesノード上で動作している “一時停止 “しているコンテナを見たことがありませんか?これは「サンドボックスコンテナ」と呼ばれるもので、ポッド内のすべてのコンテナで共有されるネットワークネームスペース(netns)を確保して保持することだけが仕事です。これにより、コンテナが死んで新しいコンテナが作成されても、ポッドのIPは変更されません。このIPパーポッドモデルの大きな利点は、基盤となるホストとの間でIPやポートの衝突が発生しないことです。また、アプリケーションが使用するポートを気にする必要もありません。
これを導入した場合、Kubernetesの唯一の要件は、これらのPod IPが、どのノードにあるかに関わらず、他のすべてのPodからルーティング可能/アクセス可能であることになります。
Intra-node communication
まず、同じノードにあるポッド同士が通信できるようにすることから始まります。この考え方は、ノード間の通信、インターネットへの通信などに拡張されていきます。
すべてのKubernetesノード(この場合はLinuxマシン)には、ルートネットワークネームスペース(スーパーユーザーではなくベースの意味でのルート)である「root netns」があります。