本页面介绍了 Google Distributed Cloud 附带的专用网络功能 Kubernetes 运算符。此运算符实现了一组 CustomResourceDefinitions (CRD),让 Distributed Cloud 可以执行高性能工作负载。
Distributed Cloud 服务器不支持网络功能运算符和 SR-IOV 功能。
借助网络功能运算符,您可以执行以下操作:
- 轮询节点上的现有网络设备。
- 查询节点上每个网络设备的 IP 地址和物理链接状态。
- 在节点上预配其他网络接口。
- 在节点物理机上配置支持高性能工作负载所需的底层系统功能。
- 在 PCI Express 网络接口上使用单根输入/输出虚拟化 (SR-IOV),将其虚拟化为多个虚拟接口。然后,您可以将 Distributed Cloud 工作负载配置为使用这些虚拟网络接口。
Distributed Cloud 对 SR-IOV 的支持基于以下开源项目:
前提条件
网络功能运算符从 Distributed Cloud Edge Network API 获取网络配置。为此,您必须使用以下命令为网络功能运算符服务帐号授予 Edge Network Viewer 角色 (roles/edgenetwork.viewer):
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/edgenetwork.viewer \ --member "serviceAccount:PROJECT_ID.svc.id.goog[nf-operator/nf-angautomator-sa]"
将 PROJECT_ID 替换为目标 Google Cloud 项目的 ID。
网络功能运算符资源
Distributed Cloud 网络功能运算符实现了以下 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 范围。
以下示例展示了资源的结构:
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
spec:
type: L2
nodeInterfaceMatcher:
interfaceName: gdcenet0.200
gateway4: 10.53.0.1
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: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"
NodeSystemConfigUpdate 资源
借助 NodeSystemConfigUpdate 资源,您可以更改节点的操作系统配置以及修改 Kubelet 标志。除了 sysctl 更改之外,其他更改都需要重启节点。
实例化此资源时,您必须在 nodeSelector 字段中指定目标节点。您必须在 nodeSelector 字段中包含每个目标节点的所有键值对。如果您在此字段中指定多个目标节点,则目标节点会一次更新一个节点。
注意:nodeName 字段已弃用。使用此字段会立即重启目标节点(包括本地控制平面节点),这可能会导致关键工作负载停止运行。
NodeSystemConfigUpdate 资源提供了以下特定于 Distributed Cloud 的配置字段:
spec.containerRuntimeDNSConfig.ip:指定私有映像注册表的 IP 地址列表。spec.containerRuntimeDNSConfig:指定每个 Distributed Cloud 节点上的容器运行时环境使用的自定义 DNS 条目列表。每个条目都包含以下字段:ip:指定目标 IPv4 地址,domain:指定相应网域,interface:指定 IP 地址(在ip字段中指定)可通过其访问的网络出站流量接口。 您可以指定通过以下资源定义的接口:CustomNetworkInterfaceConfig、Network(通过注解)、NetworkAttachmentDefinition(通过注解)。这是一项预览版功能。
spec.kubeletConfig.cpuManagerPolicy:指定 Kubernetes CPUManager 政策。有效值为None和Static。spec.kubeletConfig.topologyManagerPolicy:指定 Kubernetes TopologyManager 政策。有效值为None、BestEffort、Restricted和SingleNumaMode。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标志。spec.sysctls.NodeLevel:指定您可以使用网络功能运算符在节点上全局配置的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:表示接口条件上次更改原因的程序化标识符。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 资源中使用此资源。
您可以按 PCIe 供应商和设备 ID、PCIe 设备地址或 Linux 枚举的设备名称选择每个目标 VF。SR-IOV 网络运算符会配置每个物理网络接口以预配目标 VF。 这包括更新网络接口固件、配置 Linux 内核驱动程序以及重启 Distributed Cloud 机器(如有必要)。
如需发现节点上可用的网络接口,您可以在该节点上的
NetworkInterfaceState资源
中查找nf-operator命名空间。
以下示例展示了资源的结构:
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 资源是否已正确应用。
以下示例展示了资源的结构:
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 节点上的一个或多个逻辑或物理网络。它利用了
Multus-CNI 框架和
SRIOV-CNI 插件。
使用注解引用相应 SriovNetworkNodePolicy 资源的名称。创建此注解时,请执行以下操作:
- 使用键
k8s.v1.cni.cncf.io/resourceName。 - 在其值中使用前缀
gke.io/,后跟目标SriovNetworkNodePolicy资源的名称。
以下示例展示了资源的结构:
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
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"
}
}'
将 NetworkAttachmentDefinition 资源升级到 Distributed Cloud 1.4.0
Distributed Cloud 1.4.0 版将 bond0 接口替换为名为 gdcenet0 的新接口。借助 gdcenet0 接口,您可以在机架中的每台 Distributed Cloud 机器中使用主机管理网络接口卡 (NIC) 来处理工作负载,同时将 Distributed Cloud 管理和控制平面网络流量完全分开。如需利用此
功能,请完成本部分中的步骤以重新配置您的
NetworkAttachmentDefinition资源,然后按照
配置 Distributed Cloud 网络
中的说明预配相应的网络和子网络。
对于您已在其中部署了一个或多个 NetworkAttachmentDefinition 资源的每个 Distributed Cloud 集群,适用以下迁移规则:
- 对于每个新的
NetworkAttachmentDefinition资源,请使用gdcenet0而不是bond0作为master字段的值。如果您应用为此字段使用bond0或空值的资源,Distributed Cloud 会将该值替换为gdcenet0,然后将该资源存储并应用到集群。 - 对于每个现有的
NetworkAttachmentDefinition资源,请将bond0替换为gdcenet0作为master字段的值,然后将该资源重新应用于集群,以恢复受影响 Pod 的完整网络连接。
如需了解如何使用此资源,请参阅
NetworkAttachmentDefinition。
使用 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 还支持使用 MacVLAN 驱动程序在 Pod 上创建辅助网络接口。只有 gdcenet0 接口支持此配置,并且仅适用于运行容器化工作负载的 Pod。
如需配置接口以使用 MacVLAN 驱动程序,请执行以下操作:
配置
NetworkAttachmentDefinition资源,如以下示例所示: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" } ] ... } }'按如下方式向 Distributed Cloud Pod 定义添加注解:
apiVersion: v1 kind: Pod metadata: name: macvlan-testpod1 annotations: k8s.v1.cni.cncf.io/networks: macvlan-b400-1
使用 Distributed Cloud 多网络功能在 Pod 上配置辅助接口
Distributed Cloud 支持使用其多网络功能在 Pod 上创建辅助网络接口。为此,请完成以下步骤:
配置
Network资源。例如:apiVersion: networking.gke.io/v1 kind: Network metadata: name: vlan200-network spec: type: L2 nodeInterfaceMatcher: interfaceName: vlan200-interface gateway4: 10.53.0.1按如下方式向 Distributed Cloud Pod 定义添加注解:
apiVersion: v1 kind: Pod metadata: name: myPod annotations: networking.gke.io/interfaces: [{"interfaceName":"eth1","network":"vlan200-network"}] networking.gke.io/default-interface: eth1 ...后续步骤