本页面介绍了 Google Distributed Cloud Connected 随附的专用网络功能 Kubernetes 运算符。此运算符实现了一组 CustomResourceDefinitions (CRD),可让 Distributed Cloud 连接的集群执行高性能工作负载。
借助网络功能运算符,您可以执行以下操作:
- 轮询节点上的现有网络设备。
- 查询节点上每个网络设备的 IP 地址和物理链路状态。
- 在节点上预配其他网络接口。
- 在节点的物理机上配置支持高性能工作负载所需的低级系统功能。
网络功能运营商配置文件
Distributed Cloud Connected 提供以下网络功能运营商功能:
借助网络自动化功能,您可以自动配置工作负载 Pod 网络。
借助状态导出功能,您可以将主机网络状态导出给用户,包括网络接口配置和状态。
借助 Webhook 函数,您可以验证用户输入。
前提条件
网络功能运营商从 Distributed Cloud Edge Network API 获取网络配置。
如需允许此操作,您必须使用以下命令向网络功能运营商服务账号授予 Edge Network Viewer 角色 (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替换为包含目标 Distributed Cloud Connected Cluster 的 Google Cloud 项目的 ID。
网络功能运营商资源
分布式云互联网络功能运算符实现了以下 Kubernetes CRD:
Network。定义 Pod 可用于与内部和外部资源通信的虚拟网络。您必须先使用 Distributed Cloud Edge Network API 创建相应的 VLAN,然后才能在此资源中指定该 VLAN。如需了解相关说明,请参阅创建子网。NetworkInterfaceState。支持发现网络接口状态,以及查询网络接口的链路状态和 IP 地址。NodeSystemConfigUpdate。可用于配置内核选项和Kubelet标志等低层级系统功能。NetworkAttachmentDefinition。可让您将 Distributed Cloud pod 连接到 Distributed Cloud connected 节点上的一个或多个逻辑或物理网络。您必须先使用 Distributed Cloud Edge Network API 创建相应的 VLAN,然后才能在此资源中指定该 VLAN。如需了解相关说明,请参阅创建子网。
网络功能运算符还允许您定义辅助网络接口。
Network 项资源
Network 资源用于定义 Distributed Cloud Connected 部署中的虚拟网络,Distributed Cloud Connected 集群中的 Pod 可以使用该虚拟网络与内部和外部资源进行通信。
Network 资源为作为可写字段公开的网络接口提供以下可配置的参数:
spec.type:指定相应网络的网络传输层。唯一的有效值为L2。您还必须指定nodeInterfaceMatcher.interfaceName值。spec.nodeInterfaceMatcher.interfaceName:目标 Distributed Cloud connected 节点上要与此网络配合使用的物理网络接口的名称。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 connected 机器的默认配置包含一个名为 uplink0 的绑定网络接口。此接口绑定了 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"
使用 Distributed Cloud 多网络功能在 pod 上配置辅助接口
分布式云互联支持使用其多网络功能在 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资源,可实现向 Pod 自动分配 SVIP 地址。例如:
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
## 后续步骤