網路功能運算子

本頁面說明 Google Distributed Cloud 連結網路方案隨附的專用網路功能 Kubernetes 運算子。這個運算子會實作一組 CustomResourceDefinitions (CRD),讓 Distributed Cloud 連線執行高效能工作負載。

網路函式運算子可讓您執行下列操作:

  • 輪詢節點上的現有網路裝置。
  • 查詢節點上每個網路裝置的 IP 位址和實體連結狀態。
  • 在節點上佈建額外網路介面。
  • 在節點的實體機器上設定低階系統功能,以支援高效能工作負載。
  • 在 PCI Express 網路介面上使用單一根目錄輸入/輸出虛擬化 (SR-IOV),將其虛擬化為多個虛擬介面。然後,您可以設定 Distributed Cloud 連線工作負載,使用這些虛擬網路介面。

Distributed Cloud 連線支援 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 擷取網路設定。如要允許這項操作,請使用下列指令,將 Edge Network 檢視者角色 (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,其中 Google Cloud 是保存目標 Distributed Cloud 連線叢集的專案 ID。

網路功能運算子資源

Distributed Cloud connected 網路功能運算子會實作下列 Kubernetes CRD:

  • Network。定義 Pod 可用來與內部和外部資源通訊的虛擬網路。您必須先使用 Distributed Cloud Edge Network API 建立對應的 VLAN,才能在這個資源中指定該 VLAN。如需操作說明,請參閱建立子網路
  • NetworkInterfaceState。可讓您探索網路介面狀態,並查詢網路介面的連結狀態和 IP 位址。
  • NodeSystemConfigUpdate。可設定核心選項和 Kubelet 標記等低階系統功能。
  • SriovNetworkNodePolicy. 選取一組 SR-IOV 虛擬化網路介面,並將該組介面例項化為 Kubernetes 資源。您可以在 NetworkAttachmentDefinition 資源中使用這項資源。
  • SriovNetworkNodeState:可查詢 Distributed Cloud 節點上 SriovNetworkNodePolicy 資源的佈建狀態。
  • NetworkAttachmentDefinition:可將 Distributed Cloud Pod 連接至 Distributed Cloud 連結節點上的一或多個邏輯或實體網路。您必須先使用 Distributed Cloud Edge Network API 建立對應的 VLAN,才能在這個資源中指定該 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-per-node-ipam-size:指定個別節點的子網路遮罩大小。如果省略這個欄位,子網路遮罩大小會設為 nf-operator 命名空間中 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 連線機器的預設設定包括 Rack Select Network Daughter Card (rNDC) 上名為 gdcenet0 的繫結網路介面。這個介面會連結 eno1np0eno2np1 網路介面。每個伺服器分別連接至一個 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:PCIe 裝置路徑,格式為 bus:slot.function
  • 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 欄位中,為每個目標節點加入所有鍵/值組合。如果在這個欄位中指定多個目標節點,系統會一次更新一個目標節點。

注意:nodeName 欄位已淘汰,立即使用會重新啟動目標節點,包括本機控制層節點,這可能會停止重要工作負載。

NodeSystemConfigUpdate 資源提供下列 Distributed Cloud connected 專屬的設定欄位:

  • spec.containerRuntimeDNSConfig.ip:指定私人映像檔登錄檔的 IP 位址清單。
  • spec.containerRuntimeDNSConfig:指定 Container Runtime Environment 在每個 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.cgroupConfig.noKernelMemory:從 Pod 記憶體用量計算中排除核心空間記憶體。有效值為 truefalse

  • spec.osConfig.hugePagesConfig:指定每個 NUMA 節點的巨頁設定。有效值為 2MB1GB。系統會將要求的大頁面數量平均分配到兩個 NUMA 節點。舉例來說,如果您配置 16 個巨頁,每個巨頁為 1 GB,則每個節點會預先配置 8 GB。

  • spec.osConfig.isolatedCpusPerSocket:指定每個插槽的隔離 CPU 數量。如果 cpuManagerPolicy 設為 Static,則為必要屬性。隔離 CPU 數量上限必須少於節點中 CPU 總數的 80%。

  • spec.osConfig.cpuIsolationPolicy:指定 CPU 隔離政策。Default 政策只會將 systemd 工作與為工作負載保留的 CPU 隔離。Kernel 政策會將 CPU 標示為 isolcpus,並在每個 CPU 上設定 rcu_nocbnohz_fullrcu_nocb_poll 標記。KernelOptimized 政策會將 CPU 標示為 isolcpus,並在每個 CPU 上設定 rcu_nocbrcu_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 容器網路介面 (CNI) 外掛程式,將安全和不安全的 sysctls 參數範圍限定在特定 Pod 或命名空間。

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 connected 伺服器部署作業

您可以依據每個目標 VF 的 PCIe 供應商和裝置 ID、PCIe 裝置位址,或 Linux 列舉的裝置名稱選取目標 VF。SR-IOV 網路運算子會設定每個實體網路介面,以佈建目標 VF。包括更新網路介面韌體、設定 Linux 核心驅動程式,以及視需要重新啟動 Distributed Cloud 連線裝置。

如要探索節點上可用的網路介面,請在 nf-operator 命名空間中,查詢該節點上的 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

上述範例會從名為 enp134s0f1np1 的網路介面上的第二個連接埠,建立最多 31 個 VF,MTU 值為 9000 (允許的最大值)。使用節點選取器標籤 edgecontainer.googleapis.com/network-sriov.capable,所有支援 SR-IOV 的 Distributed Cloud 連線節點上都有這個標籤。

如要瞭解如何使用這項資源,請參閱 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 connected 節點上的一或多個邏輯或實體網路。這項功能採用 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 註解會為這個虛擬網路指定一或多個 IP 位址集區。您在此指定的 CIDR 前半部必須包含服務虛擬 IP (SVIP) 位址。Distributed Cloud connected 會透過 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
    

    這項註解會將 eth0 介面設為主要介面,並將 eth1 介面設為次要介面,同時使用 MetalLB 進行第 2 層負載平衡。

按照本節所述設定次要介面後,系統會自動建立下列自訂資源:

  • IPAddressPool 資源,可讓系統自動將 SVIP 位址指派給 Pod。例如:
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
  • L2Advertisement 資源,可放送指定 SVIP 位址的廣告。例如:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertise-410
  namespace: kube-system
spec:
  ipAddressPools:
  - test-410-pool
  interfaces:
  - gdcenet0.410

## 後續步驟