【K8Sシリーズ】k8sネットワークプラグインの徹底分析 – Canal

序文

何かをするのは難しいことではありません。難しいのは継続することです。しばらく続けることは難しくありませんが、難しいのは最後まで続けることです。

記事タグの色の説明:

  • 黄色:重要なタイトル
  • : 結論を示すために使用されます
  • : 引数をマークするために使用されます
  • : 引数をマークするために使用されます

最新のコンテナ化アプリケーションの世界では、コンテナ オーケストレーション プラットフォーム Kubernetes が標準になっています。Kubernetes は分散システムであり、複雑なアプリケーションとマイクロサービス アーキテクチャをサポートするために、ネットワークは Kubernetes クラスターの不可欠な部分です。

コンテナ化されたアプリケーションを管理および調整できます。監視は、ユーザーがクラスターの健全性、パフォーマンス、可用性を理解するのに非常に重要な側面です。

この記事では、Kubernetesネットワークプラグインの「Canal」プラグインについて詳しく紹介します。

この記事があなたに何かを得るだけでなく、楽しく学んでいただければ幸いです。ご提案がございましたら、メッセージを残してご連絡ください。

 コラム紹介

この記事はこのコラムです。購読歓迎: [k8s の徹底分析] コラム

このコラムの内容を簡単に紹介しましょう。

1 基本的な紹介 

Kubernetes では、ネットワーク プラグインはコンテナ ネットワーク インターフェイス (CNI) プラグインとも呼ばれ、コンテナ間の通信とネットワーク接続を実装するために使用されます。一般的な Kubernetes ネットワーク プラグインをいくつか示します。

  1. Flannel : Flannel は、仮想ネットワーク オーバーレイ テクノロジ (オーバーレイ ネットワーク) を使用して、異なるノード上のコンテナーを接続する人気のある CNI プラグインです。Flannel は、VXLAN、UDP、Host-GW などのさまざまなバックエンド ドライバーをサポートしています。

  2. Calico : Calico は、コンテナ間のルーティングに BGP プロトコルを使用するオープンソース ネットワーキングおよびセキュリティ ソリューションです。Calico は柔軟なネットワーク ポリシーとセキュリティ ルールをサポートしており、大規模な展開に使用できます。

  3. Weave Net : Weave Net は、仮想ネットワーク デバイスとネットワーク プロキシを作成することで、異なるノード上のコンテナーを接続する軽量の CNI プラグインです。Weave Net はオーバーレイ モードと直接接続モードをサポートし、柔軟性を提供します。

  4. Cilium : Cilium は、Kubernetes 用の高性能ネットワークおよびセキュリティ ソリューションであり、eBPF (Extended Berkeley Packet Filter) テクノロジーを使用して、高速なコンテナ間通信とネットワーク ポリシーの適用を提供します。

  5. Canal : Canal は、Calico と Flannel の機能を組み合わせた包括的な CNI プラグインです。Calico のネットワーク ポリシーとセキュリティ機能を使用しながら、Flannel を使用してオーバーレイ ネットワークを提供できます。

  6. Antrea : Antrea は、Kubernetes ネットワーキングとセキュリティ向けに設計された Open vSwitch ベースの CNI プラグインです。高性能のネットワーク接続とネットワーク ポリシー機能を提供します。

  7. kube-router : kube-router は、ネットワークとサービス プロキシ機能を組み合わせたオープン ソース CNI プラグインです。BGP および IPIP プロトコルをサポートし、負荷分散機能を備えています。

これらは Kubernetes ネットワーク プラグイン間で一般的なオプションの一部であり、それぞれに固有の利点と適用可能なシナリオがあります。適切なネットワーク プラグインの選択は、ニーズ、ネットワーク トポロジ、パフォーマンス要件などの要因によって異なります。

同時に、Kubernetes コミュニティは常に進化しており、変化するニーズに対応するために新しいネットワーク プラグインをリリースしています。

2 運河の紹介

2.1 概念の紹介

Canal は、MySQL プロトコルに基づくネットワーク プラグインで、MySQL データベースの binlog イベントを、Kubernetes クラスター内の他のリソース (ポッド、サービスなど) に同期できます。

これは、Canal を通じて、MySQL データベースと Kubernetes クラスターのシームレスな統合を実現できることを意味します。

Canal の中心となるコンセプトには主に次の側面が含まれます。

  1. データ フロー: Canal の核心はデータ フローですMySQL データベースの binlog イベントをリッスンし、これらのイベントを Kubernetes が理解できるデータ形式に変換して、指定された Kubernetes リソースにデータを送信します。

  2. イベント変換: Canal は、MySQL binlog イベントを Kubernetes リソース オブジェクトに変換できるイベント変換ルールの完全なセットを提供します。このようにして、Kubernetes API を通じてこれらのリソースを管理および操作できます。

  3. データの永続性: データの完全性と一貫性を確保するために、Canal はデータの永続化機能を提供します。受信したデータはローカルに保存され、必要に応じてデータをローカルから読み取ったり、MySQL データベースに書き込んだりできます。

Canalからのその他の紹介は次のとおりです。

  1. ネットワーク機能: Canal は、ネットワーク相互接続、ネットワーク分離、ルーティングなどのネットワーク機能を Kubernetes クラスターに提供できます。これは、仮想ネットワークとネットワーク ポリシーを作成することによって、コンテナーとポッドが相互に通信し、クラスターの外部のネットワークに接続できるようにするソフトウェア定義ネットワーク (SDN) ソリューションを実装します。

  2. ネットワーク分離: Canal には強力なネットワーク分離機能があり、Kubernetes クラスター内の異なる名前空間または異なるポッド グループを分離して、それらの間の通信を防止できます。この分離機能は、ユーザーがマルチテナント環境でセキュリティとパフォーマンスの分離を実現するのに役立ちます。

  3. ネットワーク ルーティング: Canal は、Kubernetes クラスターに柔軟なネットワーク ルーティング機能を提供できます。IP アドレスとポートに基づいた負荷分散をサポートし、ユーザー定義のルールに基づいてトラフィックをさまざまな Pod またはサービスに誘導して、高可用性と負荷分散を実現できます。

  4. 環境適応性: Canal は、クラウド環境やローカル環境など、さまざまなネットワーク環境に適応できます。仮想 LAN (VLAN)、VXLAN、オーバーレイなどの複数のネットワーク モデルをサポートし、さまざまなネットワーク デバイスやクラウド サービス プロバイダーと統合できます。

  5. コンテナ ネットワーク アクセス: Canal はコンテナにネットワーク アクセス機能を提供し、コンテナがネットワーク経由で他のコンテナや外部サービスと通信できるようにします。IP、IPv6、VLAN、VXLAN、UDP/TCP などのさまざまなネットワーク プロトコルとテクノロジーをサポートします。

  6. プラグイン エコシステム: Canal は、豊富なプラグイン エコシステムを提供するオープン プラグイン アーキテクチャです。ユーザーは、ネットワーク ポリシー プラグイン、負荷分散プラグイン、ログ プラグインなど、独自のニーズに応じて適切なプラグインを選択し、さまざまな使用シナリオに対応できます。

2.2 実装原理

Canal の実装原理は、MySQL のマスター/スレーブ レプリケーションの原理に基づいています。Canal は、MySQL スレーブの対話プロトコルをシミュレートし、MySQL スレーブを装ってダンプ プロトコルを MySQL マスターに送信します。

MySQL マスターは canal から送信されたダンプ リクエストを受信し、バイナリ ログを canal にプッシュし始め、canal はバイナリ ログを解析して、MySQL、Kafka、Elastic Search などの保存先に送信します。

Canal のワークフローは次のとおりです。

  1. クライアント (Canal Server) は、Canal Server クラスターにリクエストを送信し、Canal Server クラスターとの接続を確立します。
  2. Canal Server クラスター内のノードの 1 つがリクエストを受信すると、Canal Server クラスターに正常に接続したことを示す応答を返します。
  3. クライアントは、Canal Server クラスター内の各ノードにリクエストを送信し、各ノードとの接続を確立します。
  4. クライアントが開始コマンドを送信すると、Canal Server クラスター内の各ノードは MySQL データベースにダンプ コマンドを送信し、受信したバイナリ ログ イベントをクライアントに送信します。
  5. クライアントは受信したバイナリ ログ イベントを解析し、JSON 形式のデータに変換します。
  6. クライアントは、変換されたデータを、MySQL、Kafka、Elastic Search などの指定された保存先に送信します。

2.3 アーキテクチャの紹介

Canal は、Calico プロジェクトと Flannel プロジェクトに基づくネットワーク プラグインで、コンテナ ネットワーク機能と分離を実装するために使用されます。以下は、Canal アーキテクチャの詳細な紹介です。

  1. コントロールプレーン
  2. データプレーン
  3. コンポーネントの相互作用

コントロールプレーン:

  • etcd ストレージ: Canal はetcd を分散キーバリュー ストアとして使用し、ネットワークのステータスと構成情報を保存します。etcd は高可用性と一貫性を提供し、クラスターのネットワークのステータスと構成の信頼性を保証します。
  • Flannel コントローラー: Canal は、Flannel コントローラーをコントロール プレーンの一部として使用しますFlannel コントローラーは、ポッドの作成、削除、更新などの Kubernetes API サーバー イベントやネットワーク ポリシーの変更を監視する役割を果たします。これらのイベントをネットワーク構成の更新に変換し、etcd ストレージに書き込みます。
  • ネットワーク ポリシー コントローラー: Canal コントロール プレーンには、ネットワーク ポリシーの構成と更新を処理するネットワーク ポリシー コントローラー も含まれています。Kubernetes API サーバー上のネットワーク ポリシー イベントをリッスンし、それらをネットワーク ポリシー構成情報に変換し、etcd ストレージに書き込みます。

データプレーン

  • ネットワーク プロキシ: Canal は各ノードで 1 つ以上のネットワーク プロキシ コンポーネントを実行し、ネットワーク接続とデータ転送の処理を担当します。これらのネットワーク プロキシ コンポーネントは、etcd 内のネットワーク ステータスと構成情報をリッスンし、それに基づいて対応する操作を実行します。ネットワーク プロキシ コンポーネントは、ノード上のネットワーク インターフェイスとルーティング テーブルを管理し、ネットワーク トラフィックのルーティングと転送を処理します。
  • Calico データ プレーン: Canal は Calico のデータ プレーンを使用して、高性能のネットワーク転送とセキュリティ機能を提供します。Calico データ プレーンには、ルーター (ルート リフレクター)、BGP ピアリング、ルーティング テーブル、ACL (アクセス コントロール リスト) などのコンポーネントが含まれており、これらは IP アドレス管理とネットワーク トラフィック転送の実装に使用されます。

コンポーネントの相互作用

  • コントロール プレーンとデータ プレーン間の通信は etcd ストレージを通じて行われます。コントロール プレーンはネットワーク構成とステータス情報を etcd に書き込み、データ プレーンは etcd 上の変更イベントを監視し、変更に基づいて対応する操作を実行します。
  • コントロール プレーンと Kubernetes API サーバーは API を介して直接通信し、ポッドとネットワーク ポリシー情報を取得し、関連イベントをリッスンします。

上記のアーキテクチャにより、Canal はKubernetes クラスター内のネットワーク機能と Pod の分離を実現しますCalico の高性能データ プレーンを使用して、強力なネットワーク転送とセキュリティ機能を提供します。

同時に、Flannel コントローラーおよびネットワーク ポリシー コントローラーとの統合により、 Canalは IP アドレス管理、ネットワーク ポリシー構成、動的更新などの機能を実現できます。

このようにして、Canal はコンテナ化されたアプリケーション シナリオにおけるネットワーク ニーズを満たし、信頼性の高いコンテナ ネットワーク ソリューションを提供できます。

2.4 使用シナリオ

Canal ネットワーク機能とポリシーの管理機能を提供します。

マルチテナント環境でのネットワーク分離、高可用性と負荷分散ネットワーク ルーティング、コンテナ ネットワーク アクセスなど、さまざまなシナリオに適しています。

クラウドでもオンプレミスでも、Canal は信頼性の高いネットワーキング ソリューションを提供します。 

2.5 メリットとデメリット

Canal の長所と短所について話すときは、これは特定の Web プラグインであるため、その長所と短所は他の Web プラグインと比較したものであることに注意することが重要です。

以下に、Canal のメリットとデメリットを詳しく紹介します。

アドバンテージ:

  1. 包括的なネットワーク機能: Canal は、ネットワーク相互接続、ネットワーク分離、ルーティングなどの幅広いネットワーク機能を提供します。複数のネットワーク モデルとプロトコルをサポートし、ユーザー定義のルールに従ってトラフィックを管理できる柔軟なネットワーク ルーティング機能を備えています。これにより、ユーザーはニーズに基づいて複雑なネットワーク トポロジとポリシーを構築できます。

  2. マルチテナントのサポート: Canal は、マルチテナント環境にセキュリティとパフォーマンスの分離を提供する強力なネットワーク分離機能を備えています。異なる名前空間またはポッド グループを分離してそれらの間の通信を防止し、それによってテナントのデータとアプリケーションを保護できます。

  3. 環境適応性: Canal は、クラウド環境やローカル環境など、さまざまなネットワーク環境に適応できます。複数のネットワーク モデルとテクノロジーをサポートし、さまざまなネットワーク デバイスやクラウド サービス プロバイダーと統合できます。これにより、ユーザーはネットワーク アーキテクチャを変更せずに、さまざまな導入環境で Canal を使用できるようになります。

  4. プラグイン エコシステム: Canal は豊富なプラグイン エコシステムを提供し、ユーザーはニーズに応じて適切なプラグインを選択できます。これにより、ユーザーはネットワーク ポリシー、負荷分散、ロギングなどの Canal の機能を拡張できます。

欠点:

  1. 学習曲線: Canal は比較的複雑なネットワーク プラグインであるため、使用するには学習と理解にある程度のコストが必要になる場合があります。ユーザーは、Canal が正しく展開され、使用されるように、Canal の概念、構成、管理方法に精通している必要があります。

  2. 構成の複雑さ: Canal は、特に高度なネットワーク機能とポリシーを実装する必要がある場合、構成が比較的複雑になる可能性があります。ユーザーは、ネットワークが正しく構成および管理されていることを確認するために、Canal の構成オプションとパラメーターをさらに詳しく調べる必要がある場合があります。

  3. パフォーマンスのオーバーヘッド: 他のネットワーク プラグインと同様に、Canal も特定のパフォーマンス オーバーヘッドをもたらします。特に、大量のネットワーク トラフィックや複雑なネットワーク ルーティングを処理する場合、パフォーマンスが影響を受ける可能性があります。ユーザーは、アプリケーションのパフォーマンス要件を満たすためにネットワーク構成を評価し、最適化する必要があります。

Canal の長所と短所は絶対的なものではなく、ユーザーのニーズ、導入環境、その他の要因によって異なる可能性があることに注意してください。

Canal を選択して使用する前に、その長所と短所を慎重に評価し、他のネットワーク プラグインと比較して、最適なソリューションを選択することをお勧めします。

3 インストールと使用方法

3.1 インストール手順

 1 Kubernetes クラスターを準備します。

まず、Kubernetes クラスターが実行中であることを確認します。これは、ローカル クラスターまたはクラウド プロバイダーのホストされたクラスターにすることができます。

2 ダウンロード運河:

公式 Canal GitHub リポジトリ (https://github.com/projectcalico/canal) から最新バージョンの Canal をダウンロードします 。

3 カナルを展開する

kubectl または他の Kubernetes デプロイメント ツールを使用して、Canal を Kubernetes クラスターにデプロイします。Canal は、次のコマンドを使用して Kubernetes デプロイメントとしてデプロイできます。

kubectl apply -f canal.yaml

このうち、canal.yaml は、Canal デプロイメント構成を含む YAML ファイルです。必要に応じて、構成ファイル内のパラメータを調整できます。

4 導入が完了するまで待ちます

Canal が Kubernetes クラスターでのデプロイを完了するまで待ちます。次のコマンドを使用してポッドのステータスを確認できます。

kubectl get pods -n kube-system

 确保 Canal 相关的 Pod 正常运行并处于就绪状态。 

5 ネットワーク プラグインを確認します。

Canal の展開が完了すると、ネットワーク プラグインが適切に動作していることを確認できます。単純なテスト Pod を作成し、他の Pod またはクラスターの外部からその Pod にアクセスしてみることができます。ネットワーク通信が正常であれば、Canal は正常にインストールおよび設定されています。

6 ネットワーク ポリシーを構成します (オプション)。

ニーズに応じて、Canal のネットワーク ポリシーを構成できます。ネットワーク ポリシーでは、Pod 間の通信を許可または禁止するルールを定義して、より厳格なネットワーク分離とセキュリティを実現できます。ネットワーク ポリシー YAML ファイルを作成し、kubectl apply コマンドを使用してそれを Kubernetes クラスターに適用できます。

3.2 ネットワーク プラグインが正常にインストールされていることを確認する

ネットワーク プラグイン (Canal など) が正常にインストールされ、適切に動作することを確認するには、次の手順を実行します。

1 プラグインの実行ステータスを確認します。

次のコマンドを使用して、プラグインに関連する Pod が実行されているかどうかを確認します。

kubectl get pods -n kube-system

Canal に関連付けられたポッドが実行中であること、および READY 列のレプリカの数が必要な数であることを確認してください。エラーまたは例外がある場合は、関連するポッドのログで詳細を確認してください。

2 テスト ポッドを作成します。

簡単なテスト ポッドを作成して、他のポッドまたはクラスターの外部とのネットワーク通信を検証します。単純な Nginx ポッドは、次の YAML ファイルを使用して作成できます。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
spec:
  containers:
    - name: nginx
      image: nginx

具体的な手順: 

上記の YAML ファイルを「nginx-test.yaml」として保存し、次のコマンドを使用してポッドを作成します。

kubectl apply -f nginx-test.yaml

ポッドの作成後、次のコマンドを使用してステータスを確認できます。

kubectl get pods

テスト ポッドが実行中であり、READY 列のレプリカの数が 1 であることを確認します。

ネットワーク接続のテスト: 次のコマンドを使用して、テスト ポッドでネットワーク接続テストを実行します。

kubectl exec -it nginx-test -- curl <目标IP或域名>

`<ターゲット IP またはドメイン名>` を、テストするターゲット IP アドレスまたはドメイン名に置き換えます。ネットワーク通信が正常であれば、ターゲットからの応答が表示されます。

他のポッドで同じコマンドを実行して、テスト ポッドへのネットワーク接続をテストすることもできます。

上記の手順を実行すると、ネットワーク プラグインのインストールが成功したことを確認し、Pod 間のネットワーク通信が適切に機能していることを確認できます。

問題が発生した場合は、関連するログ、構成、ドキュメントを確認して、さらにトラブルシューティングを行って問題を解決できます。

4 よくある質問

Canal の使用中に、いくつかの一般的な問題が発生する可能性があります。考えられる問題とそれに対応する解決策をいくつか示します。

Canal Pod は非実行状態であるか、起動できません: 

  • Kubernetes クラスターのネットワークが正常かどうかを確認し、ネットワーク プラグインの依存コンポーネント (etcd など) が正常に実行されていることを確認します。
  • 詳細については、Canal Pod のログを確認してください。ログを表示するには、次のコマンドを使用します。
    kubectl logs <canal-pod-name> -n kube-system
  • ポッドのリソース割り当て (CPU、メモリなど) が動作要件を満たすのに十分であることを確認してください。

ネットワーク通信がブロックされているか、外部サービスにアクセスできません。

  • ネットワーク ポリシーが正しく構成されていることを確認し、ポッド間または外部サービスとの通信が許可されていることを確認します。
  • ネットワーク プラグインのルーティング ルールをチェックして、トラフィックがターゲットのポッドまたはサービスに正しく転送されていることを確認します。
  • ネットワーク プラグインのネットワーク分離機能が必要なネットワーク トラフィックをブロックしていないことを確認してください。

ポッドは IP アドレスを取得できないか、ネットワーク経由で到達できません。

  • IP アドレスの割り当てに問題があるかどうかを確認し、Canal が IP アドレスをポッドに正しく割り当てていることを確認します。
  • ノードのネットワーク インターフェイス (CNI インターフェイスなど) が適切に構成されており、ネットワーク プラグインと互換性があることを確認してください。
  • ノードのネットワーク構成をチェックして、ネットワーク プラグインがポッドのネットワーク接続を正しく管理できることを確認します。

Canal バージョンのアップグレード後に問題が発生しました:

  • Canal バージョンをアップグレードする前に、リリース ノートとドキュメントをよく読み、互換性の問題や構成の変更の可能性について理解してください。
  • 新しいバージョンの構成要件と重要なポイントを確認し、必要に応じて適切な構成変更が行われていることを確認します。
  • データの損失や回復不能な損傷を防ぐために、アップグレード プロセス中に重要なデータをバックアップおよび復元します。

パフォーマンスの問題または過剰な負荷:

  • クラスターのリソース構成を評価して、ノードに十分な CPU、メモリー、およびネットワーク帯域幅があることを確認します。
  • 同時接続数や接続タイムアウトなど、実際の負荷条件に応じて Canal の設定パラメータを調整します。
  • パフォーマンス監視ツール (Prometheus + Grafana など) を使用して、クラスターのパフォーマンス指標を監視および分析し、ボトルネックを特定して最適化します。

5 まとめ

全体として、Canal は、Kubernetes クラスターにネットワーク機能とコンテナー ネットワーク分離を提供する強力なネットワーク プラグインです。

その設計は柔軟でスケーラブルであり、さまざまなサイズやニーズのコンテナ化されたアプリケーション シナリオに対応します。

6票

 

おすすめ

転載: blog.csdn.net/weixin_36755535/article/details/132838370