ポッド・ネットワーキング用の複数のセカンダリVNICのアタッチ

Kubernetes Engine (OKE)を使用して、ポッド・ネットワーキング用にワーカー・ノードに複数のセカンダリVNICをアタッチおよび構成する方法を確認します。アプリケーション・リソースを使用して1つのセカンダリVNICプロファイルにポッドを固定するか、MultusおよびNetworkAttachmentDefinitions (NAD)を使用して複数のポッド・インタフェースをアタッチできます。

Attaching multiple secondary VNICs to worker nodes enables you to segment pod networking across different subnets and security controls (for example, front-end pods on one secondary VNIC/subnet/NSG, and back-end pods on another). 各セカンダリVNICプロファイルは、ポッドIPアドレスの独自のプール(ipCountで制御)およびネットワーク設定(サブネット、NSGなど)で構成されます。オプションで、ワークロードがそのプロファイルを明示的に選択できるように、セカンダリVNICプロファイルをアプリケーション・リソース名に関連付けることができます。

セカンダリVNICプロファイルでアプリケーション・リソースを定義する場合、Kubernetesエンジンは、これらのアプリケーション・リソースをKubernetes拡張リソース(oke-application-resource.oci.oraclecloud.com/<resource-name>など)として各ノードに公開し、対応するセカンダリVNICプロファイルで使用可能なポッドIPの数を反映したノード容量を使用します。

ポッドは、次の方法でアプリケーション・リソースを使用できます。

  • ポッドで1つのセカンダリVNICプロファイル/インタフェースを選択する場合は、ポッドが(拡張リソース・リクエスト/制限を介して)1つのアプリケーション・リソースをリクエストできます。

  • アプリケーション・リソースを公開するノードは、アプリケーション・リソースを明示的にリクエストしないポッドがこれらのノードにスケジュールされないように(oci.oraclecloud.com/application-resource-only:NoSchedule taintを使用して)汚染されます。ポッドには、一致する許容範囲を含める必要があります。

  • スケジューリングは、要求されたアプリケーション・リソースを満たす必要があります(ノードには要求された拡張リソースに十分な容量が必要です)。

  • 特定のセカンダリ VNICプロファイルにスケジューラで強制的に固定する必要がない場合は、VNICプロファイルにアプリケーションリソースを定義しないでください。追加インタフェースを必要とするポッドは、MultusおよびNetworkAttachmentDefinitions (NAD)を使用してこれらのインタフェースをアタッチする必要があります。

ポッド・ネットワーキングに複数のセカンダリVNICの使用は、OCI VCNネイティブ・ポッド・ネットワーキングCNIプラグインでのみサポートされています。ポッド・ネットワーク用のflannel CNIプラグインを使用する場合、ポッド・ネットワーク用の複数のセカンダリVNICはサポートされません。コンピュート・シェイプのVNIC制限、サブネット/IPの可用性およびNSGルール制限は引き続き適用されます。

ポッドがアプリケーション・リソースをリクエストすると、ポッド・スケジューリングは次のように進みます。

  1. 単一のアプリケーション・リソースをリクエストするポッドを作成します(オプション: ポッドを選択可能な1つのセカンダリVNICプロファイルに固定する場合のみ)。

  2. 入学検証では、要求されたアプリケーション・リソースおよび要求数量が有効かどうかなど、ポッド仕様がチェックされます。

  3. Kubernetesスケジューラは、リクエストされたアプリケーション・リソースの容量を持つノードと、対応するセカンダリVNICプロファイルで使用可能なIPを選択します。

  4. OCI VCNネイティブ・ポッド・ネットワーキングCNIプラグインは、選択したセカンダリVNICプロファイルからポッドにIPアドレスを割り当てます。

  5. ポッドは、選択したプロファイル/インタフェースを、このスケジューリング・モデルのプライマリ・ネットワーク・パスとして使用します。

ポッド・ネットワークに複数のセカンダリVNICをアタッチする前に、次のことを確認してください:

  • クラスタはVCNネイティブ・ポッド・ネットワーキングを使用します。

  • VCN、サブネットおよびNSGは、必要なセグメンテーションに対して計画されています(各セカンダリVNICプロファイルが別のサブネットとセキュリティ・ポリシーを指す可能性があるため)。

  • ワーカー・ノードに使用されるコンピュート・シェイプでは、必要な数のVNICアタッチメントと予想されるポッド密度がサポートされます。

  • マルチインタフェース・ポッドが必要な場合は、Multusがデプロイされ、必要なCNIプラグインがワーカー・ノードに存在することを確認し、ご使用の環境でマルチインタフェース・サポートに必要なOCI VCNネイティブCNIプラグイン・バージョンを確認します。

ノート

同じポッド仕様でMultusポッド・ネットワーク注釈をポッド・レベルのアプリケーション・リソース・リクエストと組み合せないでください。これにより、スケジューリングおよびインタフェース選択の競合が発生する可能性があります。マルチインタフェース・ポッドで特定のセカンダリVNICプロファイルを選択する必要がある場合は、ポッドレベルのアプリケーション・リソース・リクエストを使用するかわりに、その選択をNAD構成で定義します。たとえば、deviceSelector.appResourcedeviceSelector.interfaceNameなどのdeviceSelectorフィールドを使用します。

  • ポッド・ネットワークに複数のセカンダリVNICをアタッチできます。

    • 新しいノード・プールを作成する場合(新しいクラスタを作成するとき、または既存のクラスタをスケール・アップするとき)。
    • 既存のノード・プールを更新する場合。

    どちらの場合も、クラスタのネットワーク・タイプVCNネイティブ・ポッド・ネットワーキングである必要があります。Multusを使用したマルチインタフェース・ポッド・ネットワーキングでは、環境用にサポートされているOCI VCNネイティブCNIプラグイン・バージョンも必要です。

    1. 管理対象ノード・プールを作成または更新する手順に従います(必要に応じて、「管理対象ノード・プールの作成」または「管理対象ノード・プールの更新」を参照)。

    2. ノード・プールの詳細を指定する場合:
      1. オプションで、「ネットワーク起動タイプ」を使用して、ワーカー・ノード・ネットワーキングのネットワーク起動タイプを選択します。値を選択しない場合、PARAVIRTUALIZEDがデフォルトとして使用されます。

        ほとんどの場合、「PARAVIRTUALIZED」を選択します。選択したシェイプおよびイメージがハードウェア支援のSR-IOVネットワークをサポートし、ワークロードで必要な場合にのみ、「VFIO」を選択します。準仮想化ネットワークをサポートしないイメージまたはワークロードとの互換性のために必要な場合にのみ、「E1000」を選択します。各起動タイプのサポートは、選択したコンピュート・シェイプおよびイメージによって異なります。

      2. 「ノードのセカンダリVNICの構成」を選択し、次のように最初のセカンダリVNICプロファイルの詳細を指定します:
        • VNICアタッチメント表示名: オプション。VNICアタッチメントの表示名を指定します。表示名は、ノード・プール構成でこのVNICアタッチメントを識別するのに役立ちます。

        • VNIC表示名: オプション。VNICの表示名を指定します。表示名は、ネットワーキングおよびコンピュート・リソースのVNICを識別するのに役立ちます。

        • NIC索引: オプション。このVNICアタッチメントに使用する物理NICを指定します。このオプションは通常、ワークロード・トラフィックを使用可能なNIC帯域幅に合せるなど、特定の物理NICにVNICを配置する場合、ベア・メタル・シェイプで使用されます。値を指定しない場合、Kubernetes Engineは選択したシェイプおよび構成に対してデフォルトの配置を使用します。

        • VNICサブネット・コンパートメント: このVNICのサブネットを含むコンパートメントを指定します。

        • VNICサブネット: このVNICのサブネットを指定します。サブネットによって、VNICで使用可能なネットワーク、ルート表、セキュリティ・ルールおよびIPアドレス・ファミリが決定されます。ポッド・ネットワークの場合は、割り当てるポッドIPの数に十分な使用可能なIPアドレスを持つサブネットを選択します。

        • VNICへのパブリックIPの割当て: オプション。パブリックIPv4アドレスをこのVNICに割り当てるかどうかを指定します。この設定はVNICにのみ適用されます。パブリックIPアドレスは、VNICがパブリック・サブネットにあるか、プライベート・サブネットにあるかに関係なく、ポッドに割り当てられません。ほとんどのポッド・ネットワーク設計では、このオプションを選択しないままにします。サブネットがパブリックであり、VNIC自体がパブリックIPアドレスを持つことが特定の要件である場合のみ、これを選択します。ルート表およびセキュリティ・ルールによってアクセスが適切に制限されていることを確認します。

        • VNICへのIPv6アドレスの割当て: オプション。IPv6アドレスをこのVNICに割り当てるかどうかを指定します。このオプションは、選択したサブネットが IPv6をサポートしている場合にのみ適用できます。

        • ソース/宛先チェックのスキップ: オプション。このVNICのソース/宛先チェックをスキップするかどうかを指定します。このオプションは、VNICが自身のIPアドレスのいずれにもアドレス指定されていないトラフィックを送信または受信する必要があるルーティング、転送またはNATのユース・ケースに対してのみ有効にします。

        • IPアドレスの数: このセカンダリVNICプロファイル(ipCount)に割り当てるポッドIPアドレスの数を指定します。ノード上のすべての構成済セカンダリVNICプロファイル全体で結合されたipCountは、最大256です。ポッド密度が期待できる十分なヘッドルームでこの値をサイズ設定し、サブネット容量およびコンピュート・シェイプのVNIC制限を考慮します。

        • アプリケーション・リソース: オプション。「アプリケーション・リソースの追加」を選択して、このセカンダリVNICプロファイルにアプリケーション・リソース名を追加します。ワークロードでこのVNICプロファイルを明示的に選択する場合は、アプリケーション・リソースを使用します。Kubernetes Engineは、アプリケーション・リソースをKubernetes拡張リソースとしてノードに公開し、ポッドは1つのアプリケーション・リソースをリクエストして、選択したプロファイルにポッドを固定できます。各ポッドは、ポッド・レベルのスケジューリング・モデルで1つのアプリケーション・リソースのみを要求できます。特定のプロファイルを選択するためにポッドを必要としない場合は、アプリケーション・リソースを定義しないでください。MultusおよびNetworkAttachmentDefinitions (NAD)を使用するマルチインタフェース・ポッドの場合、ポッド・レベルのアプリケーション・リソース・リクエストを使用するかわりに、NAD構成でインタフェース選択を定義します。

        • ネットワーク・セキュリティ・グループ: オプション。「ネットワーク・セキュリティ・グループの追加」を選択して、1つ以上のNSGをこのVNICに関連付けます。NSGを使用して、VNICとの間のトラフィックを制御します。ワークロードに必要なトラフィックのみが許可されるように、最小権限ルールを適用します。

        • VNICタグ: オプション。1つ以上のフリーフォーム・タグまたは定義済タグをVNICに追加するには、「タグの追加」を選択します。タグを使用して、タグ付け戦略に従ってVNICリソースを編成、追跡および管理します。

    3. 複数のセカンダリVNICプロファイルを使用する場合は、「VNICの追加」を選択し、1つ以上の追加のセカンダリVNICプロファイルの詳細を入力します。
  • 管理対象ノード・プールを作成または更新するときに、ポッド・ネットワーキングに複数のセカンダリVNICを指定できます。たとえば、oci ce node-pool createコマンドを次のように使用します(読みやすくするために省略)。

    oci ce node-pool create \
      ... \
      --secondary-vnics '[
        {
          "createVnicDetails": {
            "ipCount": 16,
            "applicationResources": ["ResourceC"],
            "subnetId": "...",
            "assignPublicIp": false
          }
        },
        {
          "createVnicDetails": {
            "ipCount": 16,
            "applicationResources": ["ResourceD"],
            "subnetId": "...",
            "assignPublicIp": false
          }
        }
      ]'

    CLIの使用の詳細は、コマンド・ライン・インタフェース(CLI)を参照してください。CLIコマンドで使用できるフラグおよびオプションの完全なリストは、コマンドライン・リファレンスを参照してください。

  • 次の操作を使用して、管理対象ノード・プールを作成または更新するときに、ポッド・ネットワーキングに複数のセカンダリVNICを指定できます:

複数のセカンダリVNICを使用するポッドのデプロイ

複数のセカンダリVNICプロファイルをノード・プールにアタッチする場合、ポッドで単一の固定ネットワーク・パスを使用するか、複数のインタフェースを使用するかに応じて、様々な方法でワークロードをデプロイできます。

オプション1: アプリケーション・リソースを使用した単一のセカンダリVNICプロファイルへのポッドの固定

このオプションは、ノードが複数の選択可能なセカンダリVNICプロファイルを公開し、ワークロードをそれらの1つに正確に固定する必要がある場合に使用します。

ステップ1: ノードの拡張リソース名と容量の確認

ノード・プールにワーカー・ノードが表示されたら、ノードの拡張リソース名と容量を確認します。

  1. ノードの通知された拡張リソースを確認します。

    kubectl describe node <node-name>
  2. 出力のCapacityセクションで、アプリケーション・リソースに対応する拡張リソース(oke-application-resource.oci.oraclecloud.com/frontendなど)を特定し、ゼロ以外の容量があることを確認します。
ステップ2: ポッド仕様に必要な許容範囲の追加

アプリケーション・リソースを公開するノードは、明示的なアプリケーション・リソース・リクエストのないポッドがそれらにランディングされないように、oci.oraclecloud.com/application-resource-only:NoScheduleで汚染されます。

対応する許容範囲をポッド仕様に追加します(ポッドの場合はspec.tolerations、デプロイメントの場合はspec.template.spec.tolerations)。

tolerations:
  - key: "oci.oraclecloud.com/application-resource-only"
    operator: "Exists"
    effect: "NoSchedule"

この許容範囲がない場合、スケジューラはリソース容量が存在する場合でも配置を拒否します。

ステップ3: 拡張リソースを1つのみリクエストする(ポッド当たり1つのアプリケーション・リソース)

ポッド仕様で、ポッドが使用する必要があるセカンダリVNICプロファイルに対応する拡張リソース(たとえば、spec.template.spec.containers[].resourcesのデプロイメント内)をリクエストします。スケジューラが容量を一貫して予約するように、要求および制限する単位は1つのみです。

例:

containers:
  - name: myapp
    image: <image>
    resources:
      requests:
        oke-application-resource.oci.oraclecloud.com/frontend: "1"
      limits:
        oke-application-resource.oci.oraclecloud.com/frontend: "1"

ステップ4: (オプション)正しいノード・プールのターゲット指定

組織でこれらのノードにノード・ラベル/セレクタ規則(gva_vnic: "yes"など)を使用する場合は、必要なリソースがないノード・プールにポッドが配置されないように、それを含めます。

nodeSelector:
  gva_vnic: "yes"

アプリケーション・リソースのリクエストおよび許容範囲がすでにスケジューリングを制限している場合、nodeSelectorはオプションです。nodeSelectorは、ターゲット・ノードにラベルを付けた場合(たとえば、ノード・プールのKubernetesラベルを使用)にのみ使用します。

ステップ5: スケジュールの確認

デプロイ後:

  1. 次のように入力します。
    kubectl get pods -o wide
  2. 関心のあるポッドには、次のように入力します:
    kubectl describe pod <pod-name>
  3. ポッドが実行中であり、スケジューリング・エラーがないことを確認します(たとえば、要求されたリソースのキャパシティが不十分です)。

オプション2: 1つのポッドで複数のインタフェースを使用する(マルチ+ NAD)

このオプションは、ポッドが複数のネットワーク・インタフェースに接続する必要がある場合に使用します。このモデルでは、Multusは追加のポッド・インタフェースをアタッチし、NADは各ポッド・インタフェースで使用するホスト・インタフェース(およびオプションでセカンダリVNICプロファイル)を定義します。

ノート

  • 同じポッド仕様で、Multusポッド・ネットワーク注釈をポッド・レベルのアプリケーション・リソース・リクエストと組み合せないでください。
  • セカンダリVNICプロファイルのインタフェースごとの選択が必要な場合は、その選択をNADで定義します(たとえば、deviceSelectorを使用します)。
ステップ1:Multusをインストールして検証する(まだインストールされていない場合)

NADを作成するか、マルチインタフェース・ポッドをデプロイする前に、Multusをインストールします。Multusのインストールの詳細は、GitHubのMultus-CNIドキュメントを参照してください。

組織の標準プロセスに従ってMultusをデプロイし、それが正常であることを確認します。

kubectl get pod -l app=multus -n kube-system
ステップ2: 必要なCNIプラグインがワーカー・ノードに存在することを確認します。

この項の例では、追加のポッド・インタフェースにipvlan CNIプラグインを使用します。マルチインタフェース・ポッドを実行できるすべてのワーカー・ノードの/opt/cni/bin/ipvlanに、ipvlanバイナリが存在することを確認します。

Oracleでは、ノードの作成、置換またはスケール・アウト時にプラグインがインストールされるように、ノード・プールのcloud-initスクリプトを使用してipvlanプラグインをインストールすることをお薦めします。フローティングダウンロードパスに従うのではなく、ターゲット環境の検証済みリリースにプラグインを固定します。次の例では、バージョンv1.9.0を使用します。

例:

#!/bin/bash

CNI_VERSION="v1.9.0"
CNI_ARCH="amd64"
CNI_TARBALL="cni-plugins-linux-${CNI_ARCH}-${CNI_VERSION}.tgz"
CNI_URL="https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/${CNI_TARBALL}"
CNI_BIN_DIR="/opt/cni/bin"

wget --fail -O "/tmp/${CNI_TARBALL}" "${CNI_URL}" && \
  tar xvzf "/tmp/${CNI_TARBALL}" -C "${CNI_BIN_DIR}" && \
  rm -f "/tmp/${CNI_TARBALL}"

curl --fail -H "Authorization: Bearer Oracle" -L0 \
  http://169.254.169.254/opc/v2/instance/metadata/oke_init_script \
  | base64 --decode > /var/run/oke-init.sh

bash /var/run/oke-init.sh

ワーカー・ノードがGitHubにアクセスできない場合は、必要なCNIプラグイン・アーカイブをOCIオブジェクト・ストレージまたは承認された別の内部場所にステージングし、cloud-initスクリプトでダウンロードURLを更新します。

ステップ3: ワーカー・ノードでのホスト・インタフェース名の識別

NADは、接続されたVNICによって作成される実際のホストインタフェース名をターゲットとする必要があります(たとえば、enp1s0enp2s0)。組織の標準アクセス方法を使用して、ワーカー・ノードでそれらを確認します。

ステップ4: 特定のインタフェースを選択するNADの作成

作成:

  • デフォルトのポッド・ネットワーク用に1つのNAD(eth0を戻すホスト・インタフェースを制御するため)
  • 追加インタフェース用の1つ以上のNAD (たとえば、net1)。

NAD構成では、deviceSelectorを使用してデバイスを選択できます(たとえば、interfaceNameによって、またはご使用の環境でサポートされている場合はappResourceを使用してアプリケーション・リソース名によって)。

次のNAD例では、意図的に異なるネームスペースを使用しています。oci-vcn-native-networkkube-systemで定義され、ipvlan-networkdefaultで定義されます。ワークロードが別のネームスペースで実行される場合、そのネームスペースにipvlan-networkを作成するか、ポッド注釈を更新して完全修飾NAD名を参照します。

デフォルトのネットワークNADがenp1s0に固定されました。

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: oci-vcn-native-network
  namespace: kube-system
spec:
  config: |
    {
      "name": "oci",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "cniVersion": "0.3.1",
          "type": "oci-ipvlan",
          "mode": "l2",
          "ipam": {
            "type": "oci-ipam",
            "deviceSelector": {
              "interfaceName": "enp1s0"
            }
          }
        },
        {
          "cniVersion": "0.3.1",
          "type": "oci-ptp",
          "containerInterface": "ptp-veth0",
          "mtu": 9000
        }
      ]
    }

セカンダリ・ネットワークNADがenp2s0に固定されました。

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: ipvlan-network
  namespace: default
spec:
  config: |
    {
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "ipvlan",
          "mode": "l2",
          "master": "enp2s0",
          "ipam": {
            "type": "oci-ipam",
            "deviceSelector": {
              "interfaceName": "enp2s0"
            }
          }
        }
      ]
    }

デフォルトのNADでは、OCI固有のoci-ipvlanおよびoci-ptpプラグインが使用されます。これは、そのインタフェースがOKE VCNネイティブのデフォルト・ネットワーク・パスに参加するためです。追加のNADは標準のipvlanプラグインを使用します。これは、Multusが特定のホストNICに追加のインタフェースをアタッチし、OCI IPAMは引き続きサブネット対応のIP割当てを提供するためです。

deviceSelectorは、次のようなフィールドを持つインタフェースをターゲットにできます。

{
  "appResource": "blue",
  "interfaceName": "enp2s0",
  "interfaceNamePrefix": "enp",
  "macAddress": "02:00:17:08:E3:07"
}

deviceSelectorブロックを使用すると、OCI IPAMはポッドIP割当てに使用されるターゲット・インタフェースまたはVNICを選択できます。次の1つ以上のフィールドを使用してデバイスを選択できます。

  • appResource: アプリケーション・リソース名でGVA VNICプロファイルを選択します。

  • interfaceName: 特定のホスト・インタフェース(enp1s0など)を選択します。

  • interfaceNamePrefix: 接頭辞でインタフェースを選択します(enpなど)。

  • macAddress: MACアドレスでインタフェースを選択します。

NADデバイス・セレクタでappResourceが設定されている場合、OCI IPAMプラグインは、そのアプリケーション・リソースを使用して、ポッドIPアドレスを提供し、そのインタフェースの親デバイスとして機能するGVA VNICプロファイルを決定します。これにより、次のように、同じポッド内の異なるNADを異なるVNICプロファイルにマップできます。

  • NAD1 -> Application Resource: vnic-a

  • NAD2 -> Application Resource: vnic-b

  • NAD3 -> Application Resource: vnic-c

ポッドが3つのNADをすべて使用している場合、各インタフェースは対応する VNICプロファイルを介して接続できます。

このドキュメントに示されているinterface-nameの例では:

  • oci-vcn-native-network NADはinterfaceName: enp1s0を使用するため、OCI IPAMはホストのenp1s0インタフェースからポッドのデフォルト・ネットワークIPを割り当てます。

  • ipvlan-network NADはinterfaceName: enp2s0を使用するため、OCI IPAMはホストのenp2s0インタフェースから追加のインタフェースIPを割り当てます。

これは、ポッドの例が次のように設定する理由でもあります。

annotations:
  v1.multus-cni.io/default-network: kube-system/oci-vcn-native-network
  k8s.v1.cni.cncf.io/networks: default/ipvlan-network

v1.multus-cni.io/default-network注釈は、eth0oci-vcn-native-network NADを使用するようにします。そのデフォルト・ネットワークを明示的に選択しないと、OCI IPAMは適格なホスト・インタフェースから割り当てることができ、プライマリ・ポッド・インタフェースを予測しやすくなります。デフォルトのNADを設定すると、eth0は目的のインタフェースを使用し、追加のネットワーク・アタッチメントから分離します。

これらのMultusポッド注釈を、同じポッド仕様のポッド・レベルのアプリケーション・リソース・リクエストと組み合せないでください。マルチインタフェース・ポッドでGVA VNICの選択が必要な場合は、ポッドレベルのアプリケーション・リソース・リクエストを使用するかわりに、各インタフェースのNAD deviceSelector.appResource構成内でその選択を定義します。

NADを適用します。

kubectl apply -f oci-vcn-native-network-nad.yaml
kubectl apply -f ipvlan-network.yaml
ステップ5: Multus注釈を使用したマルチインタフェース・ポッドのデプロイ

ポッドに注釈を付けてデフォルトのネットワークNADを選択し、追加のネットワークNADを接続します。次に例を示します。

metadata:
  annotations:
    v1.multus-cni.io/default-network: kube-system/oci-vcn-native-network
    k8s.v1.cni.cncf.io/networks: default/ipvlan-network
ステップ6: 複数のインタフェースの検証
  1. ポッドについて説明し、Multusネットワーク・ステータス注釈(存在する場合)を確認します。
    kubectl describe pod <pod-name>
  2. ご使用の環境で許可されている場合、ポッドにexecを実行してインタフェースを検査し(たとえば、ifconfigまたはip addr)、ポッドに予期されるインタフェース(eth0net1、...)およびIPアドレスがあることを確認します。

オプション3: アプリケーション・リソースを使用しないセカンダリVNICプロファイルの使用

複数のセカンダリVNICプロファイルをノード・プールにアタッチし、アプリケーション・リソースを定義しない場合、ポッドはスケジューラによって強制されるリソース・リクエストによって単一のセカンダリVNICプロファイルに固定されません。このオプションでは、拡張リソースをリクエストするためにポッドは必要ありません。追加インタフェースを必要とするポッドは、MultusおよびNetworkAttachmentDefinitions (NAD)を使用してこれらのインタフェースをアタッチする必要があります。

このモデルは、アプリケーション・リソースを使用して異なるワークロードを異なるプロファイルに固定するのではなく、ポッド全体のIP容量をサイズ設定する場合に使用します。マルチインタフェース・ポッドの場合は、NAD構成でインタフェース選択を定義します(たとえば、deviceSelector.interfaceNameまたはdeviceSelector.appResourceを使用)。

ワーカー・ノードでのkubelet max-podの構成

ほとんどの場合、ポッド・ネットワーキングに複数のセカンダリVNICプロファイルをアタッチするノード・プールに対してkubelet max-podsを手動で構成する必要はありません。Kubernetes Engineは、ノードで使用可能なポッドIP容量に基づいて、ノード当たりの最大ポッド数を設定します。

ポッド密度を手動で上限設定する特定の理由がある場合のみ、カスタムのmax-pods値を設定します。値を選択する場合は、ノードで使用可能なポッドIP容量を超えないようにしてください。

クラスタ内の有効なポッド制限を確認するには、ノードのレポートされた容量/割当て可能な値(kubectl describe node <node-name>など)を調べて、構成されたワークロード密度が使用可能なポッドIP容量を超えていないことを確認します。

トラブルシューティング

ポッドが「保留」ステータスでスタック

ポッドは、いくつかの理由で「保留中」ステータスのままにできます。一般的な原因と解決策は次のとおりです。

  • 原因: 容量が不足しています。

    選択したセカンダリVNICプロファイルに使用可能なポッドIPがないか、リクエストされたアプリケーション・リソースに十分な容量がない場合に発生します(ポッドが特定のセカンダリVNICプロファイルを選択するためにアプリケーション・リソースを使用している場合)。

    解決策:ノード・プールをスケール・アップしてポッド数を減らすか、(マルチインタフェース・ポッドの場合)追加のポッド・ネットワーク・アタッチメントの数を減らします。

  • 原因: 許容範囲がありません。

    アプリケーション・リソースを公開するノード上のoci.oraclecloud.com/application-resource-only:NoSchedule taintに必要な許容範囲がポッドにない場合に発生します。

    解決策:欠落している許容範囲を追加します。

  • 原因: リソース名が間違っています。

    ポッドがターゲット・ノードに存在しないアプリケーション・リソース(拡張リソース)をリクエストしたときに発生します。

    解決策:アプリケーション・リソース名がノード・プール構成(大/小文字の区別)と一致することを確認します。kubectl describe node <node-name>を実行し、Capacityセクションを確認して、ノードで使用可能なリソース名を確認します。

  • 原因: ノードの選択によりスケジューリングができません。

    ポッドに、必要な容量を持つすべてのノードを除外するnodeSelectorまたはその他の配置制約が含まれている場合に発生します。

    解決策:ノード・ラベルが存在し、完全に一致していることを確認するか、ノード選択制約を削除/調整します。

ポッドは作成時に拒否されました

ポッド作成が入学検証によって拒否された場合は、拒否メッセージを使用してポッド仕様を修正します。一般的な問題としては、サポートされていない組み合わせや拡張リソースの数量を要求したり、クラスタ構成に必要なパターンと一致しないリクエストや制限を指定したりすることが挙げられます。

マルチインタフェース・ポッドで必要なインタフェースが取得されない

マルチインタフェース・ポッドが正常に作成されるが、予期されるネットワーク・インタフェース、IPアドレスまたはインタフェースとサブネットのマッピングがない場合があります。たとえば、ポッドにnet1インタフェースがない場合、eth0インタフェースが意図したデフォルト・ネットワークを使用しない場合、または追加のインタフェースが予想とは異なるサブネットからIPアドレスを受信する場合があります。

一般的な原因は次のとおりです。

  • Multusがkube-systemで実行されていません。

  • 必要なCNIプラグイン(ipvlanなど)がワーカー・ノードに存在しません。

  • NADが不正なホストインタフェース名を参照しています。

  • ポッド注釈は、誤ったNAD名またはネームスペースを参照しています。

  • インタフェースの選択は、ポッドレベルのアプリケーション・リソース・リクエストとNAD構成で分割されます。

この問題を解決するには、KubernetesとMultusが使用する順序で構成(ノード・プール構成、ワーカー・ノード上の必要なCNIコンポーネント、NAD構成およびポッド注釈)を確認します。

Multusがインストールされ実行中であり、ワークロードを実行できるすべてのワーカー・ノードに必要なCNIプラグインが存在することを確認します。NAD名およびネームスペースがポッド注釈と一致し、NADのdeviceSelector値が実際のワーカー・ノード・インタフェース名またはアプリケーション・リソース名と一致することをチェックします。

ポッドレベルのアプリケーション・リソース・リクエストを、同じポッド仕様のMultusポッド・ネットワーク注釈と組み合せないでください。ポッドで特定のセカンダリ VNICプロファイルを選択する必要がある場合は、代わりにNAD構成でその選択を定義します。

構成を修正したら、ポッドを再作成し、Multusネットワーク・ステータス注釈とポッド内のインタフェースを検査します。ポッドにeth0net1などの必要なインタフェースがあり、IPアドレスが目的のサブネットから割り当てられていることを確認します。

ベストプラクティス

ポッド・ネットワーキングに複数のセカンダリVNICをアタッチする場合は、次のベスト・プラクティスを考慮してください。

  • ワークロードに単一のネットワーク・パスが必要か、複数のポッド・インタフェースが必要かを決定します。ワークロードが1つのプロファイルのみをターゲットとする必要がある場合、アプリケーション・リソースを使用して、特定のセカンダリVNICプロファイルにポッドを固定します。ポッドが複数のインタフェースをアタッチする必要がある場合は、MultusおよびNetworkAttachmentDefinitions (NAD)を使用します。

  • 最初にネットワーク・セグメンテーションを計画します(サブネット/NSG/セキュリティ・ゾーン)。アプリケーション・リソースを使用する場合は、各アプリケーション・リソースを適切なセカンダリVNICプロファイル、サブネットおよびNSGにマップします。

  • 適切なサイズのipCount割当てを行い、ヘッドルームを維持してスケジューリングの失敗を削減します。容量計画の一環として、サブネットの容量およびシェイプVNICの制限を確認します。

  • アプリケーション・リソースおよびVNICの表示名に一貫性のあるネーミングを使用します。Multusを使用する場合は、NADがどのホストインタフェースまたは VNICプロファイルを選択するかを選択するNADおよびドキュメントに対しても、一貫した命名を使用します。

  • 容量とスケジュールの健全性を監視します。アプリケーション・リソースを使用する場合は、アプリケーション・リソース使用率を監視し、低容量のアラートおよび(リソース・タイプごとに)スケジューリング失敗を通知します。アプリケーション・リソースを使用しない場合は、ノード・プール全体のポッドIP消費およびポッド・スケジューリングの失敗を監視します。

  • NSGルールに最小権限の原則を適用して、ワークロードが機能するために必要な最小ネットワーク・トラフィックのみを許可し、VCNフロー・ログを有効にします。同じポッド仕様で、マルチ・ポッド・ネットワーク注釈をポッド・レベルのアプリケーション・リソース・リクエストと組み合せないでください。マルチ・インタフェース・ポッドでVNICプロファイル選択が必要な場合は、NAD構成で選択を定義します。