Calico

Calico 新しいタブで開く は、コンテナーと仮想マシン用のネットワーキングを提供するオープン・ソース・コミュニティー・プロジェクトです。

Calico は、開放型システム間相互接続 (OSI) モデルの 3 番目の層 (レイヤー 3 またはネットワーク層としても知られる) の上に構築されています。 Calico は、Border Gateway Protocol (BGP) を使用して、エージェント・ノード間の通信を容易にするルーティング・テーブルを構築します。 このプロトコルを使用することで、Calico ネットワークはパフォーマンスとネットワーク分離を向上させます。

Calico は、Kubernetes コンテナー・ネットワーク・インターフェース (CNI) をプラグインとして実装しており、コンテナーとポッド用のネットワーキングを提供するための Kubernetes 用のエージェントを提供します。

Calico は、フラットなレイヤー 3 ネットワークを作成して、自由にルーティング可能な IP アドレスをすべてのポッドに割り当てます。 これは、単一の大きいネットワーク CIDR を複数の小さい IP アドレス・ブロックに分割して、これらの小さいブロックの 1 つ以上をクラスター内のノードに割り当てます。 この分割は、CIDR 表記の config.yaml 内の network_cidr パラメーターを使用して、IBM Cloud Private のインストール時に行われます。

Calico はデフォルトで、クラスターのすべてのノードの間に BGP メッシュを作成して、コンテナー・ネットワークの経路をすべてのワーカー・ノードにブロードキャストします。 各ノードは、サブネットのレイヤー 3 ゲートウェイとして機能するように構成されています。 サブネットは、ワーカー・ノードに割り当てられて、ホスト上でホストされているポッド・サブネットへの接続を提供します。 すべてのノードは BGP メッシュに参加し、BGP メッシュによって、ワーカー・ノードが所有しているすべてのローカル経路が他のすべてのノードに通知されます。 クラスターの外部の BGP ピアも参加できますが、クラスターのサイズは、これらの外部ピアが受信できる BGP 通知の数に影響を及ぼします。 クラスターのスケールが特定のサイズを超える場合は、ルート・リフレクターが必要になることがあります。

詳しくは、Configuring BGP Peers 新しいタブで開く を参照してください。

ポッド・トラフィックをルーティングする際に、Calico はノードのローカル経路テーブルや iptables などのシステム機能を利用します。 すべてのポッド・トラフィックは iptables ルールを全探索してから、宛先にルーティングされます。

Calico の状態は、etcd キー/値ストアを使用して保持されます。 IBM Cloud Private では、Calico はデフォルトで Kubernetes と同じ etcd キー/値ストアを使用して、ポリシーとネットワーク構成の状態を保管します。

IP-in-IP トンネリングを使用してまたは使用せずにポッドが相互通信することを許可するように、Calico を構成できます。 IP-in-IP を使用すると、カプセル化の一環としてすべてのパケットの追加ヘッダーが追加されますが、コンテナーは、ほぼどの非重複アンダーレー・ネットワークを通じても、コンテナー自体のオーバーレイ・ネットワーク上で通信できるようになります。

アンダーレー・サブネットのアドレス・スペースが制約されており、追加の IP プールを追加するためのアクセス権がない一部の環境では、一部のパブリック・クラウドと同様に、Calico が適合します。 ただし、オーバーレイを必要としない環境では、IP-in-IP トンネリングを無効にすることで、パケット・カプセル化のオーバーヘッドを解消して、任意の物理ルーティング・インフラストラクチャーが遵守と監査のためのパケット検査を実行できるようにする必要があります。 このようなシナリオでは、アンダーレー・ネットワークのルーターを BGP メッシュに追加することで、アンダーレー・ネットワークによって追加のポッド・サブネットが認識されるようにすることができます。 複数のノードが別々のネットワーク・セグメントに配置されている場合の Calico ネットワークについて詳しくは、複数のネットワーク・セグメントにまたがる Calico ネットワークを参照してください。

Calico のコンポーネント

Calico には以下のコンポーネントがあります。

  1. calico/node agent]
  2. calico/cni
  3. calico/kube-controller

ノードが Calico のシステム要件を満たしていることを確認するには、ノードの準備の情報を参照してください。

図: クラスター内のマスター・ノードとワーカー・ノードにまたがる Calico コンポーネントの分散例

calico/node agent

このエンティティーは、felix、bird、および confd という 3 つのコンポーネントで構成されています。

calico/cni

CNI プラグインは、ノード上でホストされているポッドの IP アドレスをプロビジョンすることで、IP アドレス管理 (IPAM) 機能を提供します。

calico/kube-controller

calico/kube-controller は、Kubernetes NetworkPolicy オブジェクトを監視して、Calico データ・ストアを Kubernetes オブジェクトと同期した状態に保ちます。 各ノード上で実行されている calico/node は、Calico etcd データ・ストア内の情報を使用してローカル iptables をプログラムします。

calicoctl

calicoctl は、Calico のネットワーク、セキュリティー・ポリシーおよびその他の Calico 構成を管理するために使用できるコマンド・ライン・ツールです。 このツールは etcd と直接通信してデータ・ストアを操作します。 いくつかのリソース管理コマンドが用意され、Calico ネットワークの問題をトラブルシューティングするために使用できます。 Calico CLI をセットアップするには、Calico CLI (calicoctl) のインストールを参照してください。

複数のネットワーク・セグメントにまたがる Calico ネットワーク

複数のノードが別々のネットワーク・セグメント上にある場合は、これらのノードはアンダーレーおよびインフラストラクチャー・ネットワーク内のルーターによって接続されます。 異なるサブネット上の 2 つのノード間のトラフィックは、これらのサブネットのゲートウェイであるこのルーターを通過します。 このルーターは、ポッド・サブネットを認識していない場合はホスト間でパケットを転送できません。

図: 異なるネットワーク上の 2 つのノードとこれらのノードを接続する 1 台のルーター

この状況に対処するには、次の 2 つの方法があります。

  1. ノード上でホストされているすべてのサブネット用に、各ノード上で IP-in-IP トンネル・エンドポイントを作成するように Calico を構成できます。 ポッドによって生成されて、ノードから egress されるすべてのパケットは、IP-in-IP ヘッダーを使用してカプセル化されて、ノードの IP アドレスが送信元として使用されます。 このようにすることで、インフラストラクチャー・ルーター側ではポッドの IP アドレスが認識されません。

    IP-in-IP トンネリングを使用すると、各エンドポイントでパケットをカプセル化およびカプセル化解除するための追加のパケット処理が実行されるため、ネットワークのスループットと待ち時間が増大します。 ベアメタルでは、特定のネットワーク処理がネットワーク・インターフェース・カードにオフロードされるため、オーバーヘッドは大きくなりません。 ただし、仮想マシンでは、オーバーヘッドが大きくなる可能性があるとともに、ハイパーバイザーによって構成および使用される CPU コアとネットワーク入出力テクノロジーの数がオーバーヘッドに影響を及ぼす可能性もあります。 小さめの最大伝送単位 (MTU) サイズが使用されている場合は、パケットのフラグメント化が生じることがあるため、パケットのカプセル化に伴う追加のオーバーヘッドも大きくなる可能性があります。 可能な場合は常に、ジャンボ・フレームを有効にする必要があります。

  2. 2 つ目の方法は、インフラストラクチャー・ルーターにポッド・ネットワークを認識させることです。 このためには、ルーター上で BGP を有効にして、クラスターにノードを BGP ピアとして追加します。 これらの操作を実行することで、ルーターとホストは経路情報を交換できるようになります。 このシナリオでは、BGP メッシュの場合と同様、クラスターのサイズが影響を及ぼす可能性があります。 ルーター上で BGP を有効にすると、クラスター内の各ノードはルーターのピアになります。

Calico コンテナー・ネットワーキングを使用するための IBM Cloud Private の構成オプション

config.yaml:

network_type: calico
network_cidr: 10.1.0.0/16
calico_ipip_mode: Always
calico_tunnel_mtu: 1430
calico_ip_autodetection_method: can-reach={{ groups['master'][0] }}

Calico が使用される IBM Cloud Private のデプロイメント・トポロジーについて詳しくは、IBM Cloud Private デプロイメント・トポロジーを参照してください。

Prometheus/Grafana での Calico の監視

デフォルトでは、管理ノード上で実行されている Prometheus コンポーネントは、IBM Cloud Private で実行されている Calico ノード・エージェントをメトリックのために収集します。 IBM Cloud Private に付随している Grafana ダッシュボードには、Calico から取得されたクラスター・ネットワーク・メトリックがグラフィック表示されます。

また、Felix から収集されたこれらのメトリックを使用してアラートを設定できます。