網路功能運算子

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

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

  • 輪詢節點上的現有網路裝置。
  • 查詢節點上每個網路裝置的 IP 位址和實體連結狀態。
  • 在節點上佈建額外網路介面。
  • 在節點的實體機器上設定低階系統功能,以支援高效能工作負載。

網路功能運算子設定檔

Distributed Cloud connected 提供下列網路功能運算子功能:

  • 網路自動化功能可自動設定工作負載 Pod 網路。

  • 狀態匯出函式可將主機網路狀態匯出給使用者,包括網路介面設定和狀態。

  • 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 標記等低階系統功能。
  • NetworkAttachmentDefinition:可將 Distributed Cloud Pod 連接至 Distributed Cloud 連結節點上的一或多個邏輯或實體網路。您必須先使用 Distributed Cloud Edge Network API 建立對應的 VLAN,才能在這個資源中指定該 VLAN。如需操作說明,請參閱建立子網路

網路功能運算子也可讓您定義次要網路介面。

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 連線裝置的預設設定包含名為 uplink0 的繫結網路介面。這個介面會繫結 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"

使用 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

## 後續步驟