Kubernetes

CNI(Container Network Interface) しーえぬあい

コンテナネットワークKubernetesネットワークプラグインPod間通信FlannelCalico
CNIについて教えて

簡単に言うとこんな感じ!

CNIは「コンテナ同士をネットワークでつなぐための共通ルール」だよ!マンションの各部屋(コンテナ)に電話線を引く工事業者が複数いても、同じ規格のコンセントを使えばどれでもつながる、そんな「差し込み口の統一規格」なんだ!


CNIとは

CNI(Container Network Interface) とは、コンテナ(アプリを動かす軽量な仮想環境)にネットワーク機能を付与するための標準インターフェース仕様です。Kubernetesをはじめとするコンテナ基盤が、ネットワーク処理をプラグイン形式で差し替えられるように設計された「共通の取り決め」と言えます。

Kubernetesでは複数のコンテナ群(Pod)がひとつのクラスター上で協調して動きますが、それぞれのPodにIPアドレスを割り当てたり、Pod間の通信経路を作ったりする処理は、Kubernetesのコアにはあえてビルトインされていません。その代わりにCNIという「口金の規格」を用意し、実際のネットワーク実装はサードパーティ製のCNIプラグインに委ねる設計になっています。

これにより、企業のネットワーク要件や運用方針に応じて、ネットワーク機能を自由に選択・交換できる柔軟性が生まれます。発注側の視点では「どのCNIプラグインを採用するか」がセキュリティ・パフォーマンス・運用コストに直結するため、システム選定時に確認すべき重要な要素の一つです。


CNIの仕組みと役割

CNIは「コンテナが生まれた瞬間」と「コンテナが消えた瞬間」にプラグインを呼び出し、ネットワーク設定を自動で行います。

タイミングCNIが行うこと
コンテナ起動時IPアドレスの割り当て・ルーティング設定・仮想NIC(ネットワークカード)の作成
コンテナ停止時IPアドレスの回収・ルーティングの削除・仮想NICの破棄

CNIプラグインの主な種類

プラグイン名特徴向いているシーン
Flannelシンプル・軽量。設定が容易小〜中規模・学習用途
Calicoネットワークポリシー(通信制限)が強力セキュリティ要件が厳しい本番環境
CiliumeBPFという最新技術を使い高性能高トラフィック・可観測性が必要な環境
Weave Net暗号化通信に対応マルチクラウド・セキュリティ重視

覚え方

「CNI = コンテナの Network を Inject(注入)する」 コンテナが生まれた瞬間にネットワークをポンと注入してあげるイメージ!


歴史と背景

  • 2014年頃Dockerなどコンテナ技術が普及し始め、コンテナのネットワーク管理が各ツールでバラバラに実装される問題が顕在化
  • 2015年 — CoreOSとDockerが共同でCNI仕様を提案。「ネットワーク処理は共通仕様に乗せ、実装は自由に」というアーキテクチャを提唱
  • 2016年 — KubernetesがCNIを標準のネットワークモデルとして採用。以降、主要なコンテナ基盤がCNIに対応
  • 2017年以降 — CalicoやFlannelが広く普及。クラウドベンダー(AWS・GCP・Azure)もマネージドKubernetesサービスでCNIプラグインを提供開始
  • 2020年代 — CiliumがeBPFを活用した次世代CNIとして注目を集め、大規模本番環境での採用が増加

CNIとKubernetesネットワークの関係

Kubernetesのネットワークモデルにおける各レイヤーとCNIの位置づけを図で示します。

KubernetesネットワークとCNIの位置づけ アプリケーション(Pod内のコンテナ) HTTPリクエスト・DBアクセスなど、アプリが行う通信 Kubernetes Service / kube-proxy Pod群へのロードバランシング・サービスディスカバリ 🔌 CNI(Container Network Interface) IPアドレス割り当て・ルーティング設定・Pod間通信経路の構築 ← ここをプラグインで差し替えられる! → ホストOS ネットワークスタック / 物理・仮想ネットワーク Linux カーネル・NIC・クラウドVPC・オンプレスイッチなど Flannel Calico Cilium Weave Net その他... ↑ CNI準拠のプラグインならどれでも差し替え可能

ネットワークポリシーとの関係

CNIプラグインの中には、ネットワークポリシー(どのPodとどのPodが通信してよいかを定義するルール)を実装できるものがあります。Flannelはネットワークポリシーを単独では実装できませんが、CalicoやCiliumは強力なポリシー制御が可能です。

【ネットワークポリシーのイメージ】

Pod A(Webサーバー)  ──許可──▶  Pod B(APIサーバー)
Pod A(Webサーバー)  ──拒否──✕  Pod C(DBサーバー)
Pod B(APIサーバー)  ──許可──▶  Pod C(DBサーバー)

→ CalicoやCiliumなら、このルールをCNIレベルで強制できる

関連する規格・RFC

規格・仕様内容
CNI Specification(GitHub: containernetworking/cni)CNIの公式インターフェース仕様。プラグインが実装すべきADD/DEL/CHECKコマンドを定義
Kubernetes Network ModelKubernetesがCNIプラグインに要求するネットワーク要件(全PodがNATなしに互いにアクセスできること等)
RFC 4632(CIDR)CNIがIPアドレス割り当てに使うサブネット表記の基礎仕様

関連用語

  • Kubernetes — CNIが使われるコンテナオーケストレーション基盤
  • Pod — CNIがIPアドレスを割り当てる対象となるKubernetesの最小実行単位
  • ネットワークポリシー — CNIプラグインが実装するPod間通信の制御ルール
  • kube-proxy — CNIと連携してServiceへのトラフィックを転送するKubernetesコンポーネント
  • eBPF — CiliumなどモダンなCNIプラグインが活用するLinuxカーネル拡張技術
  • コンテナ — CNIがネットワーク設定を行う対象となるアプリ実行環境