コンテナ・ネットワーク・インターフェースの選択

仮想プライベートクラウド

コンテナ・ネットワーク・インターフェース(CNI)を選択するために、以下の情報を確認する。

Red Hat OpenShift on IBM Cloud バージョン 4.20 以降では、 Calico がデフォルトの CNI ですが、RHCOS ワーカーノードを使用する VPC クラスタには、クラスタ CNI として Open Virtual Network (OVN) を選択するオプションがあります。

Calico デフォルト
Calico は、クラウド、オンプレミス、エッジのあらゆる Kubernetes ディストリビューション向けの、ネットワーキング、ネットワーク・セキュリティ、および観測可能性のための単一プラットフォームです。 Kubernetes を使い始めたばかりでも、大規模な運用でも、 Calico のオープンソース、エンタープライズ、クラウドの各エディションは、必要なネットワーキング、セキュリティ、観測性を提供します。 詳しくは、 Calico のドキュメントを参照。
OVN- Kubernetes (OVN) 4.20 以降 RHCOS ワーカーノードのみ
OVN- Kubernetes はOpen Virtual Network (OVN)に基づいており、オーバーレイベースのネットワーキング実装を提供する。 OVN- Kubernetes プラグインを使用するクラスタは、各ノードで Open vSwitch (OVS) も実行します。 OVNは、宣言されたネットワーク構成を実装するために、各ノード上でOVSを設定する。 詳しくは、 Red Hat のドキュメントをご覧ください

Calico とOVNの比較

以下の表で、 Calico と OVN の特徴と機能を比較してください。

OVNを使用する場合、VPCのサブネットが次の表で指定されている追加サブネットと重複しないようにする必要があります。 サブネットが重複している場合、ポッド間のネットワーキングは失敗する。

Layer2 また、 layer3 のユーザー定義ネットワーク(UDN)は、 OpenShift Virtualizationの仮想マシンなど、DHCPを使用するワークロードではサポートされていません。

Calico とOVNの比較表
コンポーネント Calico OVN Kubernetes
カプセル化
  • IP プロトコルの IP( UDP または TCP ではなく)
  • 異なるサブネットにあるノード上で動作するポッドからのポッド間トラフィックのみをカプセル化します。
  • Geneve: UDP ポート6081のプロトコル
  • すべてのポッド間トラフィックをカプセル化する
デフォルトのクラスタ・ネットワーク/ポッドMTU デフォルトで1480バイト(20バイトの IPinIP ヘッダー)。 これは変更可能だ。 デフォルトで1400バイト(100バイトのGeneveヘッダー)。 これは変更可能だ。 デーモンセットは、 ip link set dev ens3 mtu を実行するだけでなく、 NetworkManager ファイルを作成する必要がある。 また、新しいワーカーノードを再起動する必要がある。
ポッドIPAM Calico は、各新規ノードに/26サブネット(64個のIP、少なくとも1つは通常 tunl0 IPとして使用され、残りはポッドに使用可能)を割り当てます。 もし/26のすべてのポッドIPが使われると、 Calico、ノードに2つ目の/26サブネットが割り当てられ、必要な場合はさらに割り当てられる。 calicoctl ipam check 、各ノードに割り当てられたサブネットを確認できる。 OVNは最初に/24ポッドサブネット(256 IP)を各新規クラスタノードに割り当てます。 これ以上ポッドサブネットを追加するオプションはない。 また、OVNが内部的に使用する結合サブネットIPを各新規ノードに割り当てます
ポッド間のルーティング
  • リナックスルートを使用。
  • ルート配布にBGPを使用
  • tunl0 カプセル化のために各ノードのインターフェイスを使用します。
  • Open vSwitch (OVS) は各ノード上で実行され、ポッド間のトラフィックをルーティングする。
  • OVNはOVSフローを構成して、ポッド間のルーティングを定義します。
  • 各ノードには、他にも次のような多くのインターフェイスが作成される: ovs-system genev_sys_6081ovn-k8s-mp0br-intbr-ex のような他の多くのインターフェースが各ノード上に作成され、OVNとOVSによって使用される
Kubernetes ネットワーク・ポリシー
  • calico-node 、iptablesルールを追加することで実装。
  • ネットワークポリシーによってブロックされたトラフィックのロギングは可能ですが、複雑です。 Log "アクションを使う Calico ポリシーを追加し、Logアクションをいつ、どこに置くかを考え、計画する必要がある。
  • ログはワーカーノードの syslog に送られます。
  • ログには、どのポリシーがトラフィックを許可またはブロックしたかは含まれません。
  • 論理ポートの ACL を使用して OVS で実装される(iptables ではない)。
  • アノテーションを使用することで、ネットワークポリシーのドロップや許可されたトラフィックのロギングがより簡単になる。
  • ポリシーの活動をログに記録する名前空間と、許可、拒否、またはその両方をログに記録する場合に注釈を付けます。
  • ログは ovnkube-node ポッド内のファイル /var/log/ovn/acl-audit-log.log に送信されます。
  • これらのログを他のログターゲットに送信する構成オプションもあります。
  • ログには、どのポリシーがトラフィックを許可したかは含まれますが、どのトラフィックが拒否したかは含まれません。
  • 許可されたトラフィックがログに記録されるためには、少なくとも1つのポリシーが存在しなければなりません。
ホスト・ネットワーク・ポリシー Calico GlobalNetworkPolicies なし
追加サブネット なし
  • 参加サブネット: 100.64.0.0/16 ( OpenShift デフォルト)。
  • マスカレード・サブネット: 169.254.64.0/18。 これは、 OpenShift のデフォルトである 169.254.0.0/17 とは異なる。 この違いは、ローカルレジストリのハプロキシーに使用される 169.254.2.0/24 IPとの競合を避けるためである。
  • トランジット・サブネット:100.88.0.0/16 ( OpenShift デフォルト)。
APIserverウォッチ
  • calico-typha リソースウォッチを登録し、 calico-node ポッドへのプロキシとして動作し、変更を通知する。
  • calico-node calico-typha ポッドのひとつに接続し、リソースの変更を通知するように登録します。
  • 制御プレーンの ovnkube-cluster-manager コンテナが新しいノードを監視する。
  • 各クラスタノードの ovnkube-controller コンテナはリソースを監視し、nbdb の OVN 論理エントリに変換する。
シーエヌアイ calicocalico-ipam CNIバイナリは、 install-cni initContainer calico-node podによって各ノードにコピーされる。 ovnkube-node podの ovnkube-controller コンテナは、追加と削除の呼び出しのためにCNIバイナリを実行する。
リソースが作成されました
  • calico-apiserver 名前空間
  • calico-apiserver (デプロイメント、2 ポッド)
  • calico-system 名前空間
  • calico-node (各ノード)
  • calico-typha (デプロイメント、2 - 10 ポッド)。
  • calico-kube-controllers (1ノード)。
  • openshift-kube-proxy 名前空間。
  • openshift-kube-proxy (各ノード)。
  • tigera-operator 名前空間。
  • tigera-operator (デプロイメント、1ポッド)。
  • calico CNIバイナリ、 calico-ipam CNIバイナリ、およびその他のさまざまなCNIバイナリは、 install-cni initContainer calico-node によって各ノードにコピーされます。
  • openshift-ovn-kubernetes ネームスペース、 ovnkube-node 、8つのコンテナを持つ各ノード上で、 ovnkube-controller 、リソースを監視し、ポッドIPを割り当て、リソースを nbdb のOVN論理エントリに変換する。 CNIの追加と削除も処理する。
  • nbdb 論理エントリを格納する。
  • northd nbdb の論理エントリを sbdb の論理フローに変換。
  • sbdb の論理フローを格納。
  • ovn-controller sbdb の論理フローを変換し、OVSスイッチをプログラムします。
  • ovn-acl-logging
  • kube-rbac-proxy-node 許可されたユーザーだけがスクレイピングできるように、ノード・メトリクスを保護します。
  • kube-rbac-proxy-ovn-metrics OVN メトリクスを保護し、許可されたユーザーだけがスクレイピングできるようにします。
ポッド間の接続
  • calico-node podは最初に、 TCP 172.20.0.1:2040 でリッスンしているプロキシポッドのローカルHaproxy経由でkube apiserverに接続し、 calico-typha podリストを取得します。
  • calico-node podは、 TCP ポート5473で calico-typha podの1つに接続し、クラスタリソースの更新をリッスンします。
  • calico-node ポッドはバード BGP デーモンを実行し、 TCP ポート 179 で他のすべての calico-node バード BGP デーモンにフルメッシュで接続します。
  • ポッド間のトラフィックは、同じサブネット内のノード上のポッドに対して直接発生します。
  • 異なるサブネット上のノード上のポッド間のポッド間トラフィックは、 IPinIP カプセル化(または Satellite クラスタの場合は VxLAN )を使用してカプセル化されます。
  • 各ノードの ovnkube-controller コンテナは、 TCP 172.20.0.1:2040 でリソースウォッチをリスンしているプロキシポッドのローカル haproxy を介して kube apiserver に接続します。
  • すべてのPod間トラフィックはGeneveを使用してカプセル化され、 UDP ポート6081経由で送信されます。
  • 詳細については、 ファイアウォールの設定を参照してください。