Operador de la función de red

En esta página, se describe el operador especializado de Kubernetes para funciones de red que se incluye en Google Distributed Cloud Connected. Este operador implementa un conjunto de CustomResourceDefinitions (CRD) que permiten que Distributed Cloud connected ejecute cargas de trabajo de alto rendimiento.

El operador de funciones de red te permite hacer lo siguiente:

  • Sondea los dispositivos de red existentes en un nodo.
  • Consulta la dirección IP y el estado del vínculo físico de cada dispositivo de red en un nodo.
  • Aprovisiona interfaces de red adicionales en un nodo.
  • Configura las funciones del sistema de bajo nivel en la máquina física del nodo que se requieren para admitir cargas de trabajo de alto rendimiento.

Perfiles de operadores de funciones de red

Distributed Cloud Connected proporciona la siguiente funcionalidad del operador de funciones de red:

  • Las funciones de automatización de redes te permiten automatizar la configuración de las redes de Pods de tu carga de trabajo.

  • Las funciones de exportación de estado te permiten exportar los estados de la red del host al usuario, incluida la configuración y el estado de la interfaz de red.

  • Las funciones de webhook te permiten validar las entradas del usuario.

Requisitos previos

El operador de la función de red recupera la configuración de red de la API de Distributed Cloud Edge Network. Para permitir esto, debes otorgar a la cuenta de servicio del operador de funciones de red el rol de visualizador de redes perimetrales (roles/edgenetwork.viewer) con el siguiente comando:

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]"

Reemplaza lo siguiente:

  • ZONE_PROJECT_ID con el ID del proyecto Google Cloud que contiene los recursos de la API de Distributed Cloud Edge Network.
  • CLUSTER_PROJECT_ID con el ID del proyecto Google Cloud que contiene el clúster conectado de Distributed Cloud de destino.

Recursos del operador de la función de red

El operador de funciones de red conectadas de Distributed Cloud implementa los siguientes CRD de Kubernetes:

  • Network: Define una red virtual que los Pods pueden usar para comunicarse con recursos internos y externos. Debes crear la VLAN correspondiente con la API de Distributed Cloud Edge Network antes de especificarla en este recurso. Para obtener instrucciones, consulta Crea una subred.
  • NetworkInterfaceState: Permite el descubrimiento de estados de la interfaz de red y la consulta de una interfaz de red para obtener el estado del vínculo y la dirección IP.
  • NodeSystemConfigUpdate: Permite configurar funciones del sistema de bajo nivel, como opciones del kernel y marcas Kubelet.
  • NetworkAttachmentDefinition: Te permite conectar Pods de Distributed Cloud a una o más redes lógicas o físicas en tu nodo conectado de Distributed Cloud. Debes crear la VLAN correspondiente con la API de Distributed Cloud Edge Network antes de especificarla en este recurso. Para obtener instrucciones, consulta Crea una subred.

El operador de la función de red también te permite definir interfaces de red secundarias.

Network recurso

El recurso Network define una red virtual dentro de tu implementación conectada de Distributed Cloud que los Pods dentro de tu clúster conectado de Distributed Cloud pueden usar para comunicarse con recursos internos y externos.

El recurso Network proporciona los siguientes parámetros configurables para la interfaz de red expuesta como campos de escritura:

  • spec.type: Especifica la capa de transporte de red para esta red. El único valor válido es L2. También debes especificar un valor de nodeInterfaceMatcher.interfaceName.
  • spec.nodeInterfaceMatcher.interfaceName: Es el nombre de la interfaz de red física en el nodo conectado de Distributed Cloud de destino que se usará con esta red.
  • spec.gateway4: Es la dirección IP de la puerta de enlace de red para esta red.
  • spec.l2NetworkConfig.prefixLength4: Especifica el rango de CIDR para esta red.
  • annotations.networking.gke.io/gdce-per-node-ipam-size: Especifica el tamaño de la máscara de subred para un nodo individual. Si se omite, el tamaño de la máscara de subred se establece en el valor del campo cluster-cidr-config-per-node-mask-size en el ConfigMap nf-operator-defaults en el espacio de nombres nf-operator.
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr: Especifica un bloque CIDR para acceder a los clústeres a través de la puerta de enlace de Connect. CoreDNS usa este valor en las interfaces de red secundarias.
  • annotations.networking.gke.io/gke-gateway-pod-cidr: Especifica un bloque de CIDR para un Pod que se puede asignar en interfaces de red secundarias.
  • annotations.networking.gke.io/gdce-vlan-id: Especifica el ID de VLAN para esta red.
  • annotations.networking.gke.io/gdce-vlan-mtu: (opcional) Especifica el valor de MTU para esta red. Si se omite, hereda el valor de MTU de la interfaz principal.
  • annotations.networking.gke.io/gdce-lb-service-vip-cidr: Especifica el rango de direcciones IP virtuales para el servicio de balanceo de cargas. El valor puede ser un bloque CIDR o un valor de rango de direcciones explícito. Esta anotación es obligatoria para el balanceo de cargas de capa 3 y opcional para el de capa 2.

En el siguiente ejemplo, se ilustra la estructura del recurso:

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

Para especificar varios rangos de direcciones IP virtuales para el servicio de balanceo de cargas, usa la anotación networking.gke.io/gdce-lb-service-vip-cidrs. Puedes proporcionar los valores para esta anotación como una lista separada por comas o como una carga útil JSON. Por ejemplo:

[
  {
    "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
  }
]

Si eliges usar una carga útil JSON, te recomendamos que uses el formato JSON condensado. Por ejemplo:

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

Ten en cuenta que el campo autoAssign se establece de forma predeterminada en false si se omite.

NetworkInterfaceState recurso

El recurso NetworkInterfaceState es de solo lectura y te permite descubrir interfaces de red físicas en el nodo y recopilar estadísticas de tiempo de ejecución sobre el tráfico de red que fluye a través de esas interfaces. Distributed Cloud crea un recurso NetworkInterfaceState para cada nodo de un clúster.

La configuración predeterminada de las máquinas conectadas de Distributed Cloud incluye una interfaz de red vinculada llamada uplink0. Esta interfaz vincula las interfaces de red eno1np0 y eno2np1. Cada uno de ellos está conectado a un conmutador ToR de Distributed Cloud, respectivamente.

El recurso NetworkInterfaceState proporciona las siguientes categorías de información de la interfaz de red expuestas como campos de estado de solo lectura.

Información general:

  • status.interfaces.ifname: Es el nombre de la interfaz de red de destino.
  • status.lastReportTime: Es la fecha y hora del último informe de estado de la interfaz de destino.

Información de configuración de la dirección IP:

  • status.interfaces.interfaceinfo.address: Es la dirección IP asignada a la interfaz de destino.
  • status.interfaces.interfaceinfo.dns: Es la dirección IP del servidor DNS asignado a la interfaz de destino.
  • status.interfaces.interfaceinfo.gateway: Es la dirección IP de la puerta de enlace de red que entrega la interfaz de destino.
  • status.interfaces.interfaceinfo.prefixlen: Es la longitud del prefijo de IP.

Información del hardware:

  • status.interfaces.linkinfo.broadcast: Es la dirección MAC de transmisión de la interfaz de destino.
  • status.interfaces.linkinfo.businfo: Es la ruta de acceso del dispositivo PCIe en formato bus:slot.function.
  • status.interfaces.linkinfo.flags: Son las marcas de la interfaz, por ejemplo, BROADCAST.
  • status.interfaces.linkinfo.macAddress: Es la dirección MAC de unidifusión de la interfaz de destino.
  • status.interfaces.linkinfo.mtu: Es el valor de la MTU para la interfaz de destino.

Estadísticas de recepción:

  • status.interfaces.statistics.rx.bytes: Son los bytes totales recibidos por la interfaz de destino.
  • status.interfaces.statistics.rx.dropped: Es la cantidad total de paquetes descartados por la interfaz de destino.
  • status.interfaces.statistics.rx.errors: Son los errores totales de recepción de paquetes para la interfaz de destino.
  • status.interfaces.statistics.rx.multicast: Son los paquetes de multidifusión totales que recibió la interfaz de destino.
  • status.interfaces.statistics.rx.overErrors: Es la cantidad total de errores en la recepción de paquetes para la interfaz de destino.
  • status.interfaces.statistics.rx.packets: Son los paquetes totales que recibió la interfaz de destino.

Estadísticas de transmisión:

  • status.interfaces.statistics.tx.bytes: Son los bytes totales transmitidos por la interfaz de destino.
  • status.interfaces.statistics.tx.carrierErrors: Son los errores totales del operador que encontró la interfaz de destino.
  • status.interfaces.statistics.tx.collisions: Son las colisiones totales de paquetes que encontró la interfaz de destino.
  • status.interfaces.statistics.tx.dropped: Es la cantidad total de paquetes descartados por la interfaz de destino.
  • status.interfaces.statistics.tx.errors: Son los errores de transmisión totales para la interfaz de destino.
  • status.interfaces.statistics.tx.packets: Son los paquetes totales transmitidos por la interfaz de destino.

En el siguiente ejemplo, se ilustra la estructura del recurso:

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"

Configura una interfaz secundaria en un pod con redes múltiples de Distributed Cloud

Distributed Cloud Connected admite la creación de una interfaz de red secundaria en un pod a través de su función de varias redes. Para ello, completa los siguientes pasos:

  1. Configura un recurso Network. Por ejemplo:

    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
    

    La anotación networking.gke.io/gdce-lb-service-vip-cidrs especifica uno o más grupos de direcciones IP para esta red virtual. La primera mitad del CIDR que especifiques aquí debe incluir direcciones IP virtuales de servicio (SVIP). Distributed Cloud conectado aplica este requisito a través de verificaciones de webhook de la siguiente manera:

    • El rango de direcciones IP virtuales del servidor debe estar dentro del rango CIDR de la VLAN correspondiente.
    • El rango de direcciones IP virtuales conmutadas solo puede abarcar hasta la primera mitad del rango de CIDR de la VLAN.
  2. Agrega una anotación a la definición de tu pod de Distributed Cloud de la siguiente manera:

    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
    

    Esta anotación configura la interfaz eth0 como principal y la interfaz eth1 como secundaria con el balanceo de cargas de capa 2 con MetalLB.

Si configuras tu interfaz secundaria como se describe en esta sección, se crearán automáticamente los siguientes recursos personalizados:

  • Un recurso IPAddressPool, que permite la asignación automática de direcciones IP virtuales estáticas a los Pods. Por ejemplo:
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
  • Es un recurso L2Advertisement que permite la publicidad de las direcciones de SVIP especificadas. Por ejemplo:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertise-410
  namespace: kube-system
spec:
  ipAddressPools:
  - test-410-pool
  interfaces:
  - gdcenet0.410

## Qué sigue