网络功能运营商

本页面介绍了 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-defaults ConfigMap 内 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 的绑定网络接口。此接口绑定了 eno1np0eno2np1 网络接口。每个连接分别连接到一个分布式云 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 上创建辅助网络接口。为此,请完成以下步骤:

  1. 配置 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: 27
    

    networking.gke.io/gdce-lb-service-vip-cidrs 注解用于指定相应虚拟网络的一个或多个 IP 地址池。您在此处指定的 CIDR 的前半部分必须包含服务虚拟 IP (SVIP) 地址。Distributed Cloud Connected 通过 Webhook 检查强制执行此要求,如下所示:

    • SVIP 地址范围必须在相应的 VLAN CIDR 范围内,并且
    • SVIP 地址范围只能跨越 VLAN CIDR 范围的前半部分。
  2. 向 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

## 后续步骤