CNI(Container Network Interface) しーえぬあい
簡単に言うとこんな感じ!
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 | ネットワークポリシー(通信制限)が強力 | セキュリティ要件が厳しい本番環境 |
| Cilium | eBPFという最新技術を使い高性能 | 高トラフィック・可観測性が必要な環境 |
| 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の位置づけを図で示します。
ネットワークポリシーとの関係
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 Model | Kubernetesが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がネットワーク設定を行う対象となるアプリ実行環境