本頁面說明 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-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 網路介面。每個伺服器分別連接至一個 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 上建立次要網路介面。如要這樣做,請完成下列步驟:
設定
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註解會為這個虛擬網路指定一或多個 IP 位址集區。您在此指定的 CIDR 前半部必須包含服務虛擬 IP (SVIP) 位址。Distributed Cloud connected 會透過 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這項註解會將
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
## 後續步驟