本页面介绍了 Google Distributed Cloud 随附的专用网络功能 Kubernetes 运算符。此运算符实现了一组 CustomResourceDefinitions (CRD),可让 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。
网络功能运营商资源
分布式云网络功能运算符实现了以下 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 资源定义了分布式云机架内的虚拟网络,分布式云集群中的 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 机器的默认配置包括一个在机架选择网络子卡 (rNDC) 上绑定的网络接口,名为 gdcenet0。此接口会绑定 eno1np0 和 eno2np1 网络接口。每个连接分别连接到一个分布式云 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:采用驼峰命名法的条件类型。
以下示例展示了资源的结构:
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 内核驱动程序,以及在必要时重新启动分布式云机器。
如需发现节点上可用的网络接口,您可以查找 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 只读资源,您可以查询分布式云节点上 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
分布式云版本 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 虚拟功能在分布式云 Pod 上配置辅助网络接口。
为此,请按如下所示向分布式云 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 ...后续步骤