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_IDcon el ID del proyecto Google Cloud que contiene los recursos de la API de Distributed Cloud Edge Network.CLUSTER_PROJECT_IDcon 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 marcasKubelet.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 esL2. También debes especificar un valor denodeInterfaceMatcher.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 campocluster-cidr-config-per-node-mask-sizeen el ConfigMapnf-operator-defaultsen el espacio de nombresnf-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.CoreDNSusa 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 formatobus: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:
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: 27La anotación
networking.gke.io/gdce-lb-service-vip-cidrsespecifica 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.
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: eth1Esta anotación configura la interfaz
eth0como principal y la interfazeth1como 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
L2Advertisementque 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