本頁面說明 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-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 連線機器的預設設定包括 Rack Select Network Daughter Card (rNDC) 上名為 gdcenet0 的繫結網路介面。這個介面會連結 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"
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 位址。您可以透過下列資源指定介面:CustomNetworkInterfaceConfig、Network(透過註解)、NetworkAttachmentDefinition(透過註解)。
spec.kubeletConfig.cpuManagerPolicy:指定 Kubernetes CPUManager 政策。有效值為None和Static。spec.kubeletConfig.topologyManagerPolicy:指定 KubernetesTopologyManager政策。有效值為None、BestEffort、Restricted和SingleNumaMode。spec.osConfig.cgroupConfig.noKernelMemory:從 Pod 記憶體用量計算中排除核心空間記憶體。有效值為true和false。spec.osConfig.hugePagesConfig:指定每個 NUMA 節點的巨頁設定。有效值為2MB和1GB。系統會將要求的大頁面數量平均分配到兩個 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_nocb、nohz_full和rcu_nocb_poll標記。KernelOptimized政策會將 CPU 標示為isolcpus,並在每個 CPU 上設定rcu_nocb和rcu_nocb_poll旗標,但不會設定nohz_full旗標。spec.sysctls.NodeLevel:指定您可以使用 Network Function 運算子,在節點上全域設定的sysctls參數。可設定的參數如下:fs.inotify.max_user_instancesfs.inotify.max_user_watcheskernel.sched_rt_runtime_uskernel.core_patternnet.ipv4.tcp_wmemnet.ipv4.tcp_rmemnet.ipv4.tcp_slow_start_after_idlenet.ipv4.udp_rmem_minnet.ipv4.udp_wmem_minnet.ipv4.tcp_rmemnet.ipv4.tcp_wmemnet.core.rmem_maxnet.core.wmem_maxnet.core.rmem_defaultnet.core.wmem_defaultnet.netfilter.nf_conntrack_tcp_timeout_unacknowledgednet.netfilter.nf_conntrack_tcp_timeout_max_retransnet.sctp.auth_enablenet.sctp.sctp_memnet.ipv4.udp_memnet.ipv4.tcp_memnet.ipv4.tcp_slow_start_after_idlenet.sctp.auth_enablevm.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:條件的狀態描述符。有效值為True、False和Unknown。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 驅動程式,請按照下列步驟操作:
如以下範例所示,設定
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" } }'在 Distributed Cloud Pod 定義中新增註解,如下所示。IPv4 網路:
apiVersion: v1 kind: pod metadata: name: macvlan-testpod1 annotations: k8s.v1.cni.cncf.io/networks: macvlan-b400-1IPv6 網路:
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 上建立次要網路介面。如要這樣做,請完成下列步驟:
設定
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
## 後續步驟