クラウドネイティブのCaaSプラットフォーム

高セキュリティのもとで、

圧倒的なユーザビリティで

マルチクラウドの開発・運用をサポート

  • スピーディーにデプロイ
  • コスト削減
  • 高可用性
  • 優れたスケーラビリティ

3.《CNI および CNI プラグインについて》

はじめに:ネットワークアーキテクチャは、K8sの複雑な箇所の1つです。 K8sネットワークモデル自体には、それぞれのネットワーク機能に対するそれぞれの要求があるため、業界にはすでに特定の環境と要求を満たすための多くのネットワークソリューションがあります。CNIは、コンテナが作成または破棄されたときにユーザーがコンテナネットワークをより簡単に構成できるようにするためのコンテナネットワークのAPIインターフェースを意味します。この記事では、一般的なネットワークプラグインの動作原理を理解し、CNIプラグインの使用方法を習得するための方法を説明します。

CNI とは何か

最初に、CNIとは何かを紹介しましょう。その正式名称は、Container Network Interface、つまりコンテナネットワークのAPIインターフェースです。
それはK8sに標準に実装されたネットワークインターフェースです。 Kubeletはこの標準APIを使用して、さまざまなネットワークプラグインを呼び出し、さまざまなネットワーク構成メソッドを実現します。このインターフェースを実装するのは、一連のCNI APIインターフェースを実装するCNIプラグインです。 一般的なCNIプラグインには、Calico、flannel、Terway、Weave Net、およびContivが含まれます。

Kubernetes でCNIを使用する方法

K8sはCNI構成ファイルにより、使用するCNIを決定します。
基本的な使用方法は次のとおりです。

具体的なプロセスを次の図に示します。

クラスターにPodを作成する場合、Pod構成は最初にapiserverを介して書き込まれます。 apiserverの一部の管理コンポーネント(スケジューラーなど)は、特定のノードにスケジュールされます。 このPodの作成を監視した後、Kubeletはローカルでいくつかの作成操作を実行します。
ネットワークを作成するステップを実行すると、最初に、前述の構成ディレクトリにある構成ファイルが読み取られます。構成ファイルは、使用するプラグインを宣言し、特定のCNIプラグインのバイナリファイルを実行します。 次に、CNIプラグインがPodネットワークスペースに入り、Podネットワークを構成します。 構成が完了すると、KuberletはPod作成プロセス全体を完了し、Podはオンラインになります。
上記のプロセスには多くのステップ(CNI構成ファイルの構成、バイナリプラグインのインストールなど)があり、すこし複雑に見えます。
しかし、ユーザーとしてCNIプラグインのみを使用する場合、多くのCNIプラグインがすでにワンクリックインストール機能を提供しているため、比較的簡単です。 次の図に示すように、一般的に使用されるFlannelを例にとります。kubectlapply Flannelのデプロイテンプレートを使用するだけで、構成ファイルとバイナリファイルを各ノードに自動的にインストールできます。

インストール後、クラスター全体のCNIプラグインがインストールされます。
したがって、CNIプラグインのみを使用する場合、多くのCNIプラグインはすでにワンクリックインストールスクリプトを提供しており、Kubernetesの内部構成方法やAPIの呼び出し方法を誰もが気にする必要はありません。

どのCNIプラグインが私達にとって適切か?

コミュニティには、Calico、flannel、Terwayなど、多くのCNIプラグインがあります。では、具体的な使用環境では、どのCNIプラグインを選択すればよいでしょうか。CNIのいくつかの実装モデルから話していきましょう。 私達はさまざまなシナリオに従ってさまざまな実装モードを選択してから、特定のプラグインを選択する必要があります。
一般的に、CNIプラグインは、オーバーレイ、ルーティング、アンダーレイの3つのモードに分類できます。

上記の3つの一般的に使用される実装モードを理解したら、環境とニーズに応じて実装できるモードを決定し、対応するモードでCNIプラグインを見つけます。
しかし、コミュニティには非常に多くのプラグインがあります。それらはどのモデルに属しているのでしょうか? どのようにして選ぶのでしょうか? あなたに適したものを選ぶ方法は?次の3つの方面から考えることができます。

1. 環境制約
異なった環境においてサポートされる下層レイヤーの能力も異なります。

環境制約を考慮した後、何を使用できるか、何を使用できないかを知り、いくつかの選択肢を念頭に置く必要があります。これに基づき機能要件を考慮する必要があります。

2. 機能要件

3. 性能要件
Pod作成速度とPodネットワークパフォーマンスの観点から、さまざまなプラグインのパフォーマンスを測定できます。

独自のCNIプラグインを開発する方法

コミュニティプラグインは、独自のニーズを満たすことができない場合があります。たとえば、Alibaba Cloudでは、vxlanなどのオーバーレイプラグインしか使用できず、オーバーレイプラグインのパフォーマンスは比較的低く、Alibaba Cloudの一部のビジネスニーズを満たすことができません。そこでTerwayプラグインがAlibaba Cloud上で開発されました。
自己の環境が比較的特殊で、コミュニティで適切なネットワークプラグインが見つからない場合は、独自のCNIプラグインを開発できます。
CNIプラグインの実装は通常、2つの部分で構成されています。

1. インターネットケーブルをPodに差し込む
では、どのようにPodにインターネットケーブルに接続する最初のステップを実現するのでしょうか?通常このような一つのステップになります。

Pod用のネットワークカードを準備する
通常、「veth」仮想ネットワークカードを使用します。一方の端はPodネットワークスペースに配置され、もう一方の端はホストネットワークスペースに配置されるため、Podとホストの2つの名前空間が接続されます。

PodにIPアドレスを割り当てる
このIPアドレスには要件があり、これは以前にネットワークについて紹介したときにも言及したものです。つまり、このIPアドレスはクラスター内で一意である必要があります。 ではどうやってPodにクラスター内で一意のIPアドレスが割り当てられていることを保証すればよいでしょうか?
一般的に、クラスター全体を作成するときは、Podの大きなネットワークセグメントを指定し、各ノードに応じてノードネットワークセグメントを割り当てます。たとえば、上図の右側に172.16ネットワークセグメントを作成し、各ノードに/ 24セグメントを割り当てて、各ノードのアドレスが互いに競合しないようにします。 次に、各Podに特定のノードのネットワークセグメントから特定のIPアドレスを割り当てます。たとえば、Pod1は172.16.0.1に割り当てられ、Pod2は172.16.0.2に割り当てられます。このようにして、ノードでのIPアドレス割り当てに競合はありません。また、異なるノードは異なるネットワークセグメントに属しているため、競合は発生しません。
このようにして、Podにはクラスター内で一意のIPアドレスが割り当てられます。

PodIPとルーティングの構成

2. Podをネットワークに接続する
先程の記事でPodをインターネットに接続しました。つまり、PodにIPアドレスとルーティングテーブルが割り当てられました。Pod間の通信はどのように開くのでしょうか?それは、各PodのIPアドレスにクラスター内でアクセスできます。 通常、これらのことはCNI Daemonプロセスで行います。 一般的には、このような一つのステップです。

この記事のまとめ
この記事の主な内容はここまでです。ここに簡単にまとめます。