ネットワーク機能オペレーター

このページでは、Google Distributed Cloud Connected に付属している専用の Network Function Kubernetes オペレータについて説明します。このオペレータは、Distributed Cloud に接続された高パフォーマンス ワークロードの実行を可能にする一連の CustomResourceDefinitions(CRD)を実装します。

ネットワーク機能オペレータを使用すると、次のことができます。

  • ノード上の既存のネットワーク デバイスをポーリングします。
  • ノード上の各ネットワーク デバイスの IP アドレスと物理リンクの状態をクエリします。
  • ノードに追加のネットワーク インターフェースをプロビジョニングします。
  • ハイ パフォーマンス ワークロードをサポートするために必要なノードの物理マシンで、低レベルのシステム機能を構成します。
  • PCI Express ネットワーク インターフェースでシングルルート入出力仮想化(SR-IOV)を使用して、複数の仮想インターフェースに仮想化します。その後、これらの仮想ネットワーク インターフェースを使用するように Distributed Cloud 接続ワークロードを構成できます。

Distributed Cloud Connected での SR-IOV のサポートは、次のオープンソース プロジェクトに基づいています。

ネットワーク機能のオペレーター プロファイル

Distributed Cloud Connected は、各 Distributed Cloud Connected フォーム ファクタで次のネットワーク機能オペレータ機能プロファイルを提供します。

  • Distributed Cloud 接続ラックは、次の機能を備えた完全なネットワーク機能オペレータ機能プロファイルをサポートしています。

    • ネットワーク自動化機能を使用すると、ワークロード Pod のネットワーキングの構成を自動化できます。たとえば、BGP ピアリングとセカンダリ ネットワーク インターフェースの構成です。

    • 状態のエクスポート関数を使用すると、ネットワーク インターフェースの構成やステータスなど、ホスト ネットワークの状態をユーザーにエクスポートできます。

    • ノード構成関数を使用すると、CPU 分離、巨大ページ、リアルタイム カーネル、kubelet パラメータ、sysctl など、ビジネスニーズに合わせてノードのパフォーマンスを微調整できます。

    • 電源管理機能を使用すると、分離された CPU の P 状態や C 状態など、ノードの消費電力を管理できます。

    • Webhook 関数を使用すると、ユーザー入力を検証できます。

    • その他の機能には、SR-IOV オペレーターを自動的に構成する SR-IOV オートメーターが含まれます。

  • Distributed Cloud 接続サーバーは、次の機能を備えたパフォーマンス最適化ネットワーク機能オペレータ機能プロファイルをサポートしています。

    • ネットワーク自動化機能を使用すると、ワークロード Pod のネットワーキングの構成を自動化できます。たとえば、BGP ピアリングとセカンダリ ネットワーク インターフェースの構成です。

    • 状態のエクスポート関数を使用すると、ネットワーク インターフェースの構成やステータスなど、ホスト ネットワークの状態をユーザーにエクスポートできます。

    • Webhook 関数を使用すると、ユーザー入力を検証できます。

前提条件

ネットワーク機能オペレーターは、Distributed Cloud Edge Network API からネットワーク構成を取得します。これを許可するには、次のコマンドを使用して、ネットワーク機能オペレーターのサービス アカウントにエッジ ネットワーク閲覧者ロール(roles/edgenetwork.viewer)を付与する必要があります。

gcloud projects add-iam-policy-binding ZONE_PROJECT_ID \
  --role roles/edgenetwork.viewer \
  --member "serviceAccount:CLUSTER_PROJECT_ID.svc.id.goog[nf-operator/nf-angautomator-sa]"

次のように置き換えます。

  • ZONE_PROJECT_ID は、Distributed Cloud Edge Network API リソースを保持する Google Cloud プロジェクトの ID に置き換えます。
  • CLUSTER_PROJECT_ID は、ターゲットの Distributed Cloud 接続クラスタを保持する Google Cloud プロジェクトの ID に置き換えます。

ネットワーク機能オペレーターのリソース

Distributed Cloud connected Network Function オペレーターは、次の Kubernetes CRD を実装します。

  • Network。Pod が内部リソースと外部リソースの通信に使用できる仮想ネットワークを定義します。このリソースで指定する前に、Distributed Cloud Edge Network API を使用して対応する VLAN を作成する必要があります。手順については、ネットワークを作成するをご覧ください。
  • NetworkInterfaceState。ネットワーク インターフェースの状態の検出を有効にし、リンク状態と IP アドレスのネットワーク インターフェースをクエリします。
  • NodeSystemConfigUpdate。カーネル オプションや Kubelet フラグなどの低レベルのシステム機能を構成できます。
  • SriovNetworkNodePolicy。SR-IOV 仮想化ネットワーク インターフェースのグループを選択し、そのグループを Kubernetes リソースとしてインスタンス化します。このリソースは NetworkAttachmentDefinition リソースで使用できます。
  • SriovNetworkNodeState。Distributed Cloud ノードの SriovNetworkNodePolicy リソースのプロビジョニング状態をクエリできます。
  • NetworkAttachmentDefinition。Distributed Cloud Pod を Distributed Cloud 接続ノードの 1 つ以上の論理ネットワークまたは物理ネットワークに接続できます。このリソースで指定する前に、Distributed Cloud Edge Network API を使用して対応する VLAN を作成する必要があります。手順については、ネットワークを作成するをご覧ください。

ネットワーク機能オペレータを使用すると、SR-IOV 仮想関数を使用しないセカンダリ ネットワーク インターフェースを定義することもできます。

Network 個のリソース

Network リソースは、Distributed Cloud 接続ラック内の仮想ネットワークを定義します。Distributed Cloud 接続クラスタ内の Pod は、この仮想ネットワークを使用して内部リソースおよび外部リソースと通信できます。

Network リソースは、書き込み可能なフィールドとして公開されるネットワーク インターフェースに対して、次の構成可能なパラメータを提供します。

  • spec.type: このネットワークのネットワーク トランスポート レイヤを指定します。有効な値は L2 のみです。nodeInterfaceMatcher.interfaceName 値も指定する必要があります。
  • spec.nodeInterfaceMatcher.interfaceName: このネットワークで使用するターゲット Distributed Cloud 接続ノードの物理ネットワーク インターフェースの名前。
  • spec.gateway4: このネットワークのネットワーク ゲートウェイの IP アドレス。
  • spec.l2NetworkConfig.prefixLength4: このネットワークの CIDR 範囲を指定します。
  • annotations.networking.gke.io/gdce-vlan-id: このネットワークの VLAN ID を指定します。
  • annotations.networking.gke.io/gdce-vlan-mtu: (省略可)このネットワークの MTU 値を指定します。省略すると、親インターフェースから MTU 値が継承されます。
  • annotations.networking.gke.io/gdce-lb-service-vip-cidr: ロード バランシング サービスの仮想 IP アドレス範囲を指定します。値は、CIDR ブロックまたは明示的なアドレス範囲の値にできます。このアノテーションは、レイヤ 3 では必須ですが、レイヤ 2 ロード バランシングでは省略可能です。

次の例は、リソースの構造を示しています。

apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: vlan200-network
  annotations:
    networking.gke.io/gdce-vlan-id: 200
    networking.gke.io/gdce-vlan-mtu: 1500
    networking.gke.io/gdce-lb-service-vip-cidrs: "10.1.1.0/24"
spec:
  type: L2
  nodeInterfaceMatcher:
    interfaceName: gdcenet0.200
  gateway4: 10.53.0.1

ロード バランシング サービスに複数の仮想 IP アドレス範囲を指定するには、networking.gke.io/gdce-lb-service-vip-cidrs アノテーションを使用します。このアノテーションの値は、カンマ区切りのリストまたは JSON ペイロードとして指定できます。次に例を示します。

[
  {
    "name": "test-oam-3",
    "addresses": ["10.235.128.133-10.235.128.133"],
    "autoAssign": false
  }
  ,
  {
    "name": "test-oam-4",
    "addresses": ["10.235.128.134-10.235.128.134"],
    "autoAssign": false
  },
  {
    "name": "test-oam-5",
    "addresses": ["10.235.128.135-10.235.128.135"],
    "autoAssign": false
  }
]

JSON ペイロードを使用する場合は、短縮 JSON 形式を使用することをおすすめします。次に例を示します。

apiVersion: networking.gke.io/v1
  kind: Network
  metadata:
    annotations:
      networking.gke.io/gdce-lb-service-vip-cidrs: '[{"name":"test-oam-3","addresses":["10.235.128.133-10.235.128.133"],"autoAssign":false},{"name":"test-oam-4","addresses":["10.235.128.134-10.235.128.134"],"autoAssign":false},{"name":"test-oam-5","addresses":["10.235.128.135-10.235.128.135"],"autoAssign":false}]'
      networking.gke.io/gdce-vlan-id: "81"
    name: test-network-vlan81
  spec:
    IPAMMode: Internal
    dnsConfig:
      nameservers:
      - 8.8.8.8
    gateway4: 192.168.81.1
    l2NetworkConfig:
      prefixLength4: 24
    nodeInterfaceMatcher:
      interfaceName: gdcenet0.81
    type: L2

autoAssign フィールドを省略すると、デフォルトで false になります。

NetworkInterfaceState 個のリソース

NetworkInterfaceState リソースは、ノード上の物理ネットワーク インターフェースを検出し、それらのインターフェースを通過するネットワーク トラフィックのランタイム統計情報を収集できる読み取り専用リソースです。Distributed Cloud は、クラスタ内の各ノードの NetworkInterfaceState リソースを作成します。

Distributed Cloud 接続マシンのデフォルト構成には、Rack Select Network Daughter Card(rNDC)のボンディングされたネットワーク インターフェース(gdcenet0)が含まれています。このインターフェースは、eno1np0eno2np1 のネットワーク インターフェースを結合します。それぞれが 1 つの Distributed Cloud ToR スイッチに接続されています。

NetworkInterfaceState リソースは、読み取り専用のステータス フィールドとして公開される次のカテゴリのネットワーク インターフェース情報を提供します。

全般情報:

  • status.interfaces.ifname: ターゲット ネットワーク インターフェースの名前。
  • status.lastReportTime: ターゲット インターフェースの最後のステータス レポートの日時。

IP アドレスの構成情報:

  • status.interfaces.interfaceinfo.address: ターゲット インターフェースに割り当てられた IP アドレス。
  • status.interfaces.interfaceinfo.dns: ターゲット インターフェースに割り当てられた DNS サーバーの IP アドレス。
  • status.interfaces.interfaceinfo.gateway: ターゲット インターフェースを処理するネットワーク ゲートウェイの IP アドレス。
  • status.interfaces.interfaceinfo.prefixlen: IP プレフィックスの長さ。

ハードウェア情報:

  • status.interfaces.linkinfo.broadcast: ターゲット インターフェースのブロードキャスト MAC アドレス。
  • status.interfaces.linkinfo.businfo: bus:slot.function 形式の PCIe デバイスパス。
  • status.interfaces.linkinfo.flags: インターフェース フラグ(例: BROADCAST)。
  • status.interfaces.linkinfo.macAddress: ターゲット インターフェースのユニキャスト MAC アドレス。
  • status.interfaces.linkinfo.mtu: ターゲット インターフェースの MTU 値。

受信の統計情報:

  • status.interfaces.statistics.rx.bytes: ターゲット インターフェースで受信した合計バイト数。
  • status.interfaces.statistics.rx.dropped: ターゲット インターフェースによってドロップされたパケットの合計数。
  • status.interfaces.statistics.rx.errors: ターゲット インターフェースのパケット受信エラーの合計数。
  • status.interfaces.statistics.rx.multicast: ターゲット インターフェースが受信したマルチキャスト パケットの合計数。
  • status.interfaces.statistics.rx.overErrors: ターゲット インターフェースのパケット受信エラーの合計数。
  • status.interfaces.statistics.rx.packets: ターゲット インターフェースで受信したパケットの合計数。

送信の統計情報:

  • status.interfaces.statistics.tx.bytes: ターゲット インターフェースによって送信された合計バイト数。
  • status.interfaces.statistics.tx.carrierErrors: ターゲット インターフェースで発生したキャリア エラーの合計数。
  • status.interfaces.statistics.tx.collisions: ターゲット インターフェースで発生したパケットの衝突の合計数。
  • status.interfaces.statistics.tx.dropped: ターゲット インターフェースによってドロップされたパケットの合計数。
  • status.interfaces.statistics.tx.errors: ターゲット インターフェースの合計伝送エラー数。
  • status.interfaces.statistics.tx.packets: ターゲット インターフェースによって送信されたパケットの合計数。

次の例は、リソースの構造を示しています。

apiVersion: networking.gke.io/v1
kind: NetworkInterfaceState
metadata:
  name: MyNode1
nodeName: MyNode1
status:
  interfaces:
  - ifname: eno1np0
    linkinfo:
      businfo: 0000:1a:00.0
      flags: up|broadcast|multicast
      macAddress: ba:16:03:9e:9c:87
      mtu: 9000
    statistics:
      rx:
        bytes: 1098522811
        errors: 2
        multicast: 190926
        packets: 4988200
      tx:
        bytes: 62157709961
        packets: 169847139
  - ifname: eno2np1
    linkinfo:
      businfo: 0000:1a:00.1
      flags: up|broadcast|multicast
      macAddress: ba:16:03:9e:9c:87
      mtu: 9000
    statistics:
      rx:
        bytes: 33061895405
        multicast: 110203
        packets: 110447356
      tx:
        bytes: 2370516278
        packets: 11324730
  - ifname: enp95s0f0np0
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2bf4
      prefixlen: 64
    linkinfo:
      businfo: 0000:5f:00.0
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:f4
      mtu: 9000
    statistics:
      rx:
        bytes: 37858381
        multicast: 205645
        packets: 205645
      tx:
        bytes: 1207334
        packets: 6542
  - ifname: enp95s0f1np1
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2bf5
      prefixlen: 64
    linkinfo:
      businfo: 0000:5f:00.1
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:f5
      mtu: 9000
    statistics:
      rx:
        bytes: 37852406
        multicast: 205607
        packets: 205607
      tx:
        bytes: 1207872
        packets: 6545
  - ifname: enp134s0f0np0
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2b6c
      prefixlen: 64
    linkinfo:
      businfo: 0000:86:00.0
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:6c
      mtu: 9000
    statistics:
      rx:
        bytes: 37988773
        multicast: 205584
        packets: 205584
      tx:
        bytes: 1212385
        packets: 6546
  - ifname: enp134s0f1np1
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2b6d
      prefixlen: 64
    linkinfo:
      businfo: 0000:86:00.1
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:6d
      mtu: 9000
    statistics:
      rx:
        bytes: 37980702
        multicast: 205548
        packets: 205548
      tx:
        bytes: 1212297
        packets: 6548
  - ifname: gdcenet0
    interfaceinfo:
    - address: 208.117.254.36
      prefixlen: 28
    - address: fe80::b816:3ff:fe9e:9c87
      prefixlen: 64
    linkinfo:
      flags: up|broadcast|multicast
      macAddress: ba:16:03:9e:9c:87
      mtu: 9000
    statistics:
      rx:
        bytes: 34160422968
        errors: 2
        multicast: 301129
        packets: 115435591
      tx:
        bytes: 64528301111
        packets: 181171964
     .. <remaining interfaces omitted>
   lastReportTime: "2022-03-30T07:35:44Z"

NodeSystemConfigUpdate 個のリソース

NodeSystemConfigUpdate リソースを使用すると、ノードのオペレーティング システム構成を変更したり、Kubelet フラグを変更したりできます。sysctl 以外の変更には、ノードの再起動が必要です。このリソースは、Distributed Cloud 接続サーバーのデプロイでは使用できません。

このリソースをインスタンス化するときは、nodeSelector フィールドでターゲット ノードを指定する必要があります。nodeSelector フィールドには、各ターゲット ノードのすべての Key-Value ペアを含める必要があります。このフィールドで複数のターゲット ノードを指定すると、ターゲット ノードは一度に 1 つずつ更新されます。

注意: nodeName フィールドは非推奨になりました。このコマンドをすぐに使用すると、ローカル コントロール プレーン ノードを含むターゲット ノードが再起動され、重要なワークロードが停止する可能性があります。

NodeSystemConfigUpdate リソースには、Distributed Cloud Connected に固有の次の構成フィールドがあります。

  • spec.containerRuntimeDNSConfig.ip: プライベート イメージ レジストリの IP アドレスのリストを指定します。
  • spec.containerRuntimeDNSConfig: 各 Distributed Cloud 接続ノードのコンテナ ランタイム環境で使用されるカスタム DNS エントリのリストを指定します。各エントリは次のフィールドで構成されます。

    • ip: ターゲット IPv4 アドレスを指定します。
    • domain: 対応するドメインを指定します。
    • interface: ip フィールドで指定された IP アドレスに到達可能なネットワークの下り(外向き)インターフェースを指定します。次のリソースで定義されたインターフェースを指定できます。CustomNetworkInterfaceConfigNetwork(アノテーションによる)、NetworkAttachmentDefinition(アノテーションによる)。
  • spec.kubeletConfig.cpuManagerPolicy: Kubernetes CPUManager ポリシーを指定します。有効な値は NoneStatic です。

  • spec.kubeletConfig.topologyManagerPolicy: Kubernetes TopologyManager ポリシーを指定します。有効な値は NoneBestEffortRestrictedSingleNumaMode です。

  • spec.osConfig.hugePagesConfig: NUMA ノードごとの巨大ページ構成を指定します。有効な値は 2MB1GB です。リクエストされた大容量ページの数は、システム内の両方の NUMA ノードに均等に分散されます。たとえば、1 GB の huge page を 16 個割り当てると、各ノードに 8 GB の事前割り当てが行われます。

  • spec.osConfig.isolatedCpusPerSocket: ソケットあたりの分離された CPU の数を指定します。cpuManagerPolicyStatic に設定されている場合は必須です。分離された CPU の最大数は、ノード内の CPU の合計数の 80% 未満にする必要があります。

  • spec.osConfig.cpuIsolationPolicy: CPU 分離ポリシーを指定します。Default ポリシーは、ワークロード用に予約された CPU から systemd タスクを分離するだけです。Kernel ポリシーは、CPU を isolcpus としてマークし、各 CPU に rcu_nocbnohz_fullrcu_nocb_poll フラグを設定します。kernelOptimized ポリシーは、CPU を isolcpus としてマークし、各 CPU に rcu_nocb フラグと rcu_nocb_poll フラグを設定しますが、nohz_full フラグは設定しません。

  • spec.sysctls.NodeLevel: Network Function オペレータを使用してノードでグローバルに構成できる sysctls パラメータを指定します。構成可能なパラメータは次のとおりです。

    • fs.inotify.max_user_instances
    • fs.inotify.max_user_watches
    • kernel.sched_rt_runtime_us
    • kernel.core_pattern
    • net.ipv4.tcp_wmem
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_slow_start_after_idle
    • net.ipv4.udp_rmem_min
    • net.ipv4.udp_wmem_min
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_wmem
    • net.core.rmem_max
    • net.core.wmem_max
    • net.core.rmem_default
    • net.core.wmem_default
    • net.netfilter.nf_conntrack_tcp_timeout_unacknowledged
    • net.netfilter.nf_conntrack_tcp_timeout_max_retrans
    • net.sctp.auth_enable
    • net.sctp.sctp_mem
    • net.ipv4.udp_mem
    • net.ipv4.tcp_mem
    • net.ipv4.tcp_slow_start_after_idle
    • net.sctp.auth_enable
    • vm.max_map_count

    tuning Container Networking Interface(CNI)プラグインを使用すると、安全な sysctls パラメータと安全でない sysctls パラメータの両方を特定の Pod または Namespace にスコープ設定することもできます。

NodeSystemConfigUpdate リソースには、次の読み取り専用の一般的なステータス フィールドが用意されています。

  • status.lastReportTime: ターゲット インターフェースのステータスが最後に報告された時刻。
  • status.conditions.lastTransitionTime: インターフェースの条件が最後に変更された時刻。
  • status.conditions.observedGeneration: 初期条件の基準となった .metadata.generation 値を示します。
  • status.conditions.message: インターフェースの条件の変更を説明する情報メッセージ。
  • status.conditions.reason: インターフェースの条件の最後の変更の理由を示すプログラマティック ID。
  • status.conditions.status: 条件のステータス記述子。有効な値は TrueFalseUnknown です。
  • status.conditions.type: camelCase の条件タイプ。

次の例は、リソースの構造を示しています。

apiVersion: networking.gke.io/v1
kind: NodeSystemConfigUpdate
metadata:
  name: node-pool-1-config
  namespace: default
spec:
  nodeSelector:
    baremetal.cluster.gke.io/node-pool: node-pool-1
    networking.gke.io/worker-network-sriov.capable: true
  sysctls:
    nodeLevel:
      "net.ipv4.udp_mem" : "12348035 16464042 24696060"
  kubeletConfig:
    topologyManagerPolicy: BestEffort
    cpuManagerPolicy: Static
  osConfig:
    hugePagesConfig:
      "TWO_MB": 0
      "ONE_GB": 16
    isolatedCpusPerSocket:
      "0": 10
      "1": 10

SriovNetworkNodePolicy 個のリソース

SriovNetworkNodePolicy リソースを使用すると、Distributed Cloud に接続された物理マシンに SR-IOV 仮想関数(VF)のグループを割り当て、そのグループを Kubernetes リソースとしてインスタンス化できます。このリソースは、NetworkAttachmentDefinition リソースで使用できます。このリソースは、Distributed Cloud 接続サーバーのデプロイでは使用できません。

各ターゲット VF は、PCIe ベンダーとデバイス ID、PCIe デバイス アドレス、または Linux 列挙デバイス名で選択できます。SR-IOV ネットワーク オペレーターは、ターゲット VF をプロビジョニングするように各物理ネットワーク インターフェースを構成します。これには、ネットワーク インターフェースのファームウェアの更新、Linux カーネル ドライバの構成、必要に応じた Distributed Cloud 接続マシンの再起動が含まれます。

ノードで使用可能なネットワーク インターフェースを検出するには、nf-operator Namespace のノードで NetworkInterfaceState リソースを検索します。

次の例は、リソースの構造を示しています。

apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: mlnx6-p2-sriov-en2
  namespace: sriov-network-operator
spec:
  deviceType: netdevice
  isRdma: true
  mtu: 9000
  nicSelector:
    pfNames:
    - enp134s0f1np1
  nodeSelector:
    edgecontainer.googleapis.com/network-sriov.capable: "true"
  numVfs: 31
  priority: 99
  resourceName: mlnx6_p2_sriov_en2

前の例では、MTU 値が 9000(最大許容値)の enp134s0f1np1 という名前のネットワーク インターフェースの 2 番目のポートから最大 31 個の VF を作成します。SR-IOV 対応のすべての Distributed Cloud 接続ノードに存在するノードセレクタ ラベル edgecontainer.googleapis.com/network-sriov.capable を使用します。

このリソースの使用方法については、SriovNetworkNodeState をご覧ください。

SriovNetworkNodeState 個のリソース

SriovNetworkNodeState 読み取り専用リソースを使用すると、Distributed Cloud 接続ノードの SriovNetworkNodePolicy リソースのプロビジョニング状態をクエリできます。ノードの SriovNetworkNodePolicy リソースの完全な構成と、ノード上のアクティブな VF のリストを返します。status.syncStatus フィールドは、ノードに定義されたすべての SriovNetworkNodePolicy リソースが正しく適用されたかどうかを示します。このリソースは、Distributed Cloud 接続サーバーのデプロイでは使用できません。

次の例は、リソースの構造を示しています。

apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
  name: MyNode1
  namespace: sriov-network-operator
spec:
  dpConfigVersion: "1969684"
  interfaces:
  - mtu: 9000
    name: enp134s0f1np1
    numVfs: 31
    pciAddress: 0000:86:00.1
    vfGroups:
    - deviceType: netdevice
      mtu: 9000
      policyName: mlnx6-p2-sriov-en2
      resourceName: mlnx6_p2_sriov_en2
      vfRange: 0-30
status:

Status:
  Interfaces:
    Device ID:    1015
    Driver:       mlx5_core
    Link Speed:   25000 Mb/s
    Link Type:    ETH
    Mac:          ba:16:03:9e:9c:87
    Mtu:          9000
    Name:         eno1np0
    Pci Address:  0000:1a:00.0
    Vendor:       15b3
    Device ID:    1015
    Driver:       mlx5_core
    Link Speed:   25000 Mb/s
    Link Type:    ETH
    Mac:          ba:16:03:9e:9c:87
    Mtu:          9000
    Name:         eno2np1
    Pci Address:  0000:1a:00.1
    Vendor:       15b3
    Vfs:
  - Vfs:
    - deviceID: 101e
      driver: mlx5_core
      mac: c2:80:29:b5:63:55
      mtu: 9000
      name: enp134s0f1v0
      pciAddress: 0000:86:04.1
      vendor: 15b3
      vfID: 0
    - deviceID: 101e
      driver: mlx5_core
      mac: 7e:36:0c:82:d4:20
      mtu: 9000
      name: enp134s0f1v1
      pciAddress: 0000:86:04.2
      vendor: 15b3
      vfID: 1
      .. <omitted 29 other VFs here>
  syncStatus: Succeeded

このリソースの使用方法については、SriovNetworkNodeState をご覧ください。

NetworkAttachmentDefinition 個のリソース

NetworkAttachmentDefinition リソースを使用すると、Distributed Cloud Pod を Distributed Cloud 接続ノードの 1 つ以上の論理ネットワークまたは物理ネットワークに接続できます。Multus-CNI フレームワークと次のプラグインを活用します。

アノテーションを使用して、適切な SriovNetworkNodePolicy リソースの名前を参照します。このアノテーションを作成するときは、次の操作を行います。

  • キー k8s.v1.cni.cncf.io/resourceName を使用します。
  • 値に接頭辞 gke.io/ を使用し、その後にターゲット SriovNetworkNodePolicy リソースの名前を指定します。

networking.gke.io/gdce-vlan-id アノテーションを使用して、ターゲット ネットワークの VLAN ID を指定します。このアノテーションは必須です。

次の例は、リソースの構造を示しています。IPv4 ネットワーキングの場合。

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: sriov-net1
  namespace: mynamespace
  annotations:
    k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p2_sriov_en2
    networking.gke.io/gdce-vlan-id: 225

spec:
  config: '{
  "type": "sriov",
  "cniVersion": "0.3.1",
  "name": "sriov-network",
  "ipam": {
    "type": "host-local",
    "subnet": "10.56.217.0/24",
    "routes": [{
      "dst": "0.0.0.0/0"
    }],
    "gateway": "10.56.217.1"
  }
}'

IPv6 ネットワーキングの場合:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: sriov-210-den102
  annotations:
    k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p0_sriov_en
    networking.gke.io/gdce-vlan-id: 225
spec:
  config: '{
  "type": "sriov",
  "cniVersion": "0.3.1",
  "name": "sriov-210-den102",
  "vlan": 210,
  
  "ipam": {
    "type": "host-local",
    "rangeStart": "2001:4860:1025:102:ffff:0220::2",
    "rangeEnd": "2001:4860:1025:102:ffff:0220::F",
    "subnet": "2001:4860:1025:102:ffff:0220::/96",
    "routes": [{
      "dst": "::/0"
    }],
    "gateway": "2001:4860:1025:102:ffff:0220::1"
  }
}'

SR-IOV VF を使用して Pod のセカンダリ インターフェースを構成する

SriovNetworkNodePolicy リソースと対応する NetworkAttachmentDefinition リソースを構成したら、SR-IOV 仮想関数を使用して、Distributed Cloud Pod のセカンダリ ネットワーク インターフェースを構成できます。

これを行うには、次のように Distributed Cloud Pod 定義にアノテーションを追加します。

  • キー: k8s.v1.cni.cncf.io/networks
  • 値: nameSpace/<NetworkAttachmentDefinition1,nameSpace/NetworkAttachmentDefinition2...

次の例は、このアノテーションを示しています。

apiVersion: v1
kind: pod
metadata:
  name: sriovpod
  annotations:
    k8s.v1.cni.cncf.io/networks: mynamespace/sriov-net1
spec:
  containers:
  - name: sleeppodsriov
    command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
    securityContext:
      capabilities:
        add:
          - NET_ADMIN

MacVLAN ドライバを使用して Pod のセカンダリ インターフェースを構成する

Distributed Cloud Connected は、MacVLAN ドライバを使用して Pod にセカンダリ ネットワーク インターフェースを作成することもサポートしています。この構成は gdcenet0 インターフェースでのみサポートされ、コンテナ化されたワークロードを実行する Pod でのみサポートされます。

MacVLAN ドライバを使用するようにインターフェースを構成するには:

  1. 次の例に示すように、NetworkAttachmentDefinition リソースを構成します。IPv4 ネットワーキングの場合:

     apiVersion: "k8s.cni.cncf.io/v1"
     kind: NetworkAttachmentDefinition
     metadata:
       name: macvlan-b400-1
       annotations:
         networking.gke.io/gdce-vlan-id: 400
     spec:
       config: '{
       "type": "macvlan",
       "master": "gdcenet0.400",
       "ipam": {
         "type": "static",
         "addresses": [
           {
             "address": "192.168.100.20/27",
             "gateway": "192.168.100.1"
           }
         ]
       ...
       }
     }'
    

    IPv6 ネットワーキングの場合:

     apiVersion: "k8s.cni.cncf.io/v1"
     kind: NetworkAttachmentDefinition
     metadata:
       name: macvlan-bond0-210-den402
       annotations:
           networking.gke.io/gdce-vlan-id
     spec:
       config: '{
       "type": "macvlan",
       "cniVersion": "0.3.1",
       "name": "bond0-210",
       "master": "bond0.210",
    
       "ipam": {
         "type": "host-local",
         "rangeStart": "2001:4860:1025:102:0001:0210::2",
         "rangeEnd": "2001:4860:1025:102:0001:0210::F",
         "subnet": "2001:4860:1025:102:0001:0210::/96",
         "routes": [{
           "dst": "::/0"
         }],
         "gateway": "2001:4860:1025:102:0001:0210::1"
       }
     }'
    
  2. 次のように、Distributed Cloud Pod 定義にアノテーションを追加します。IPv4 ネットワーキングの場合:

     apiVersion: v1
     kind: pod
     metadata:
       name: macvlan-testpod1
       annotations:
         k8s.v1.cni.cncf.io/networks: macvlan-b400-1
    

    IPv6 ネットワーキングの場合:

     apiVersion: v1
     kind: Pod
     metadata:
       name: vlan210-1
       namespace: default
       annotations:
         k8s.v1.cni.cncf.io/networks: default/macvlan-bond0-210-den402
    

Distributed Cloud マルチネットワーキングを使用して Pod にセカンダリ インターフェースを構成する

Distributed Cloud Connected は、マルチネットワーク機能を使用して Pod にセカンダリ ネットワーク インターフェースを作成することをサポートしています。手順は次のとおりです。

  1. Network リソースを構成します。次に例を示します。

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: my-network-410
      annotations:
          networking.gke.io/gdce-vlan-id: "410"
          networking.gke.io/gdce-lb-service-vip-cidrs: '[{"name":"myPool","addresses":["10.100.63.130-10.100.63.135"],"avoidBuggyIPs":false,"autoAssign":true}]'
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: gdcenet0.410
      gateway4: 10.100.63.129
      l2NetworkConfig:
        prefixLength4: 27
    

    networking.gke.io/gdce-lb-service-vip-cidrs アノテーションは、この仮想ネットワークの 1 つ以上の IP アドレスプールを指定します。ここで指定する CIDR の前半には、Service 仮想 IP(SVIP)アドレスを含める必要があります。Distributed Cloud コネクテッドは、Webhook チェックを通じてこの要件を次のように適用します。

    • SVIP アドレス範囲は対応する VLAN CIDR 範囲内にある必要があります。
    • SVIP アドレス範囲は、VLAN CIDR 範囲の前半までしか拡張できません。
  2. 次のように、Distributed Cloud Pod の定義にアノテーションを追加します。

    apiVersion: v1
    kind: pod
    metadata:
      name: myPod
      annotations:
        networking.gke.io/interfaces: '[{"interfaceName":"eth0","network":"pod-network"}, {"interfaceName":"eth1","network":"my-network-410"}]'
        networking.gke.io/default-interface: eth1
    

    このアノテーションは、MetalLB を使用したレイヤ 2 ロード バランシングで eth0 インターフェースをプライマリとして、eth1 インターフェースをセカンダリとして構成します。

このセクションで説明するようにセカンダリ インターフェースを構成すると、次のカスタム リソースが自動的に作成されます。

  • IPAddressPool リソース。Pod への SVIP アドレスの自動割り当てを有効にします。次に例を示します。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: test-410-pool
  namespace: kube-system
  annotations:
    networking.gke.io/network:my-network-410
    
  spec:
  addresses:
  - 10.100.63.130-10.100.63.135
  autoAssign: true
  • 指定された SVIP アドレスの広告を有効にする L2Advertisement リソース。次に例を示します。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertise-410
  namespace: kube-system
spec:
  ipAddressPools:
  - test-410-pool
  interfaces:
  - gdcenet0.410

## 次のステップ