このページでは、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-operatorNamespace のnf-operator-defaultsConfigMap の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 という名前のボンディングされたネットワーク インターフェースが含まれています。このインターフェースは、eno1np0 と eno2np1 のネットワーク インターフェースを結合します。それぞれが 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 にセカンダリ ネットワーク インターフェースを作成することをサポートしています。手順は次のとおりです。
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: 27networking.gke.io/gdce-lb-service-vip-cidrsアノテーションは、この仮想ネットワークの 1 つ以上の IP アドレスプールを指定します。ここで指定する CIDR の前半には、Service 仮想 IP(SVIP)アドレスを含める必要があります。Distributed Cloud コネクテッドは、Webhook チェックを通じてこの要件を次のように適用します。- SVIP アドレス範囲は対応する VLAN CIDR 範囲内にある必要があります。
- SVIP アドレス範囲は、VLAN CIDR 範囲の前半までしか拡張できません。
次のように、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
## 次のステップ