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

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

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

  • ノード上の既存のネットワーク デバイスをポーリングします。
  • ノード上の各ネットワーク デバイスの IP アドレスと物理リンクの状態をクエリします。
  • ノードに追加のネットワーク インターフェースをプロビジョニングします。
  • ハイ パフォーマンス ワークロードをサポートするために必要なノードの物理マシンで、低レベルのシステム機能を構成します。

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

Distributed Cloud Connected は、次のネットワーク機能オペレータ機能を提供します。

  • ネットワーク自動化機能を使用すると、ワークロード Pod ネットワーキングの構成を自動化できます。

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

  • 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 フラグなどの低レベルのシステム機能を構成できます。
  • NetworkAttachmentDefinition。Distributed Cloud Pod を Distributed Cloud 接続ノードの 1 つ以上の論理ネットワークまたは物理ネットワークに接続できます。このリソースで指定する前に、Distributed Cloud Edge Network API を使用して対応する VLAN を作成する必要があります。手順については、サブネットワークを作成するをご覧ください。

ネットワーク機能オペレータを使用すると、セカンダリ ネットワーク インターフェースを定義することもできます。

Network 個のリソース

Network リソースは、Distributed Cloud 接続クラスタ内の Pod が内部リソースと外部リソースの通信に使用できる、Distributed Cloud 接続デプロイ内の仮想ネットワークを定義します。

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

  • spec.type: このネットワークのネットワーク トランスポート レイヤを指定します。有効な値は L2 のみです。nodeInterfaceMatcher.interfaceName 値も指定する必要があります。
  • spec.nodeInterfaceMatcher.interfaceName: このネットワークで使用するターゲット Distributed Cloud 接続ノードの物理ネットワーク インターフェースの名前。
  • spec.gateway4: このネットワークのネットワーク ゲートウェイの IP アドレス。
  • spec.l2NetworkConfig.prefixLength4: このネットワークの CIDR 範囲を指定します。
  • annotations.networking.gke.io/gdce-per-node-ipam-size: 個々のノードのサブネット マスクサイズを指定します。省略すると、サブネット マスクのサイズは、nf-operator Namespace の nf-operator-defaults ConfigMap の cluster-cidr-config-per-node-mask-size フィールドの値に設定されます。
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr: Connect ゲートウェイを介してクラスタにアクセスするための CIDR ブロックを指定します。これは、セカンダリ ネットワーク インターフェースの CoreDNS で使用されます。
  • annotations.networking.gke.io/gke-gateway-pod-cidr: セカンダリ ネットワーク インターフェースに割り当てることができる Pod の 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 接続マシンのデフォルト構成には、uplink0 という名前のボンディングされたネットワーク インターフェースが含まれています。このインターフェースは、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"

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

## 次のステップ