Esta página descreve o operador especializado do Kubernetes de função de rede que o Google Distributed Cloud Connected vem com. Esse operador implementa um conjunto de CustomResourceDefinitions (CRDs) que permitem que o Distributed Cloud Connected execute cargas de trabalho de alta performance.
Com o operador de função de rede, é possível:
- Faz uma pesquisa de dispositivos de rede em um nó.
- Consulte o endereço IP e o estado do link físico de cada dispositivo de rede em um nó.
- Provisione outras interfaces de rede em um nó.
- Configure os recursos de sistema de baixo nível na máquina física do nó necessários para oferecer suporte a cargas de trabalho de alto desempenho.
Perfis de operador de função de rede
O Distributed Cloud Connected oferece a seguinte funcionalidade do operador de função de rede:
As funções de automação de rede permitem automatizar a configuração da rede de pods da sua carga de trabalho.
As funções de exportação de estado permitem exportar estados de rede do host para o usuário, incluindo configuração e status da interface de rede.
As funções de webhook permitem validar as entradas do usuário.
Pré-requisitos
O operador de função de rede busca a configuração de rede na API Distributed Cloud Edge Network.
Para permitir isso, conceda à conta de serviço do operador de função de rede o papel de visualizador de rede de borda
(roles/edgenetwork.viewer) usando o seguinte 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]"
Substitua:
ZONE_PROJECT_IDcom o ID do projeto Google Cloud que contém os recursos da API Distributed Cloud Edge Network.CLUSTER_PROJECT_IDcom o ID do projeto Google Cloud que contém o cluster conectado do Distributed Cloud de destino.
Recursos do operador de função de rede
O operador de função de rede conectada do Distributed Cloud implementa os seguintes CRDs do Kubernetes:
Network. Define uma rede virtual que os pods podem usar para se comunicar com recursos internos e externos. É preciso criar a VLAN correspondente usando a API Distributed Cloud Edge Network antes de especificá-la neste recurso. Para instruções, consulte Criar uma sub-rede.NetworkInterfaceState. Permite a descoberta de estados de interface de rede e a consulta de uma interface de rede para estado de link e endereço IP.NodeSystemConfigUpdate. Permite a configuração de recursos de sistema de baixo nível, como opções de kernel e flagsKubelet.NetworkAttachmentDefinition. Permite anexar pods do Distributed Cloud a uma ou mais redes lógicas ou físicas no nó conectado do Distributed Cloud. É preciso criar a VLAN correspondente usando a API Distributed Cloud Edge Network antes de especificá-la neste recurso. Para instruções, consulte Criar uma sub-rede.
O operador de função de rede também permite definir interfaces de rede secundárias.
Network recurso
O recurso Network define uma rede virtual na sua
implantação conectada do Distributed Cloud que os pods no seu
cluster conectado do Distributed Cloud podem usar para se comunicar com
recursos internos e externos.
O recurso Network fornece os seguintes parâmetros configuráveis para a
interface de rede exposta como campos graváveis:
spec.type: especifica a camada de transporte de rede para essa rede. O único valor válido éL2. Também é necessário especificar um valor denodeInterfaceMatcher.interfaceName.spec.nodeInterfaceMatcher.interfaceName: o nome da interface de rede física no nó conectado do Distributed Cloud de destino a ser usado com essa rede.spec.gateway4: o endereço IP do gateway de rede para essa rede.spec.l2NetworkConfig.prefixLength4: especifica o intervalo CIDR para essa rede.annotations.networking.gke.io/gdce-per-node-ipam-size: especifica o tamanho da máscara de sub-rede para um nó individual. Se isso for omitido, o tamanho da máscara de sub-rede será definido como o valor do campocluster-cidr-config-per-node-mask-sizeno ConfigMapnf-operator-defaultsno namespacenf-operator.annotations.networking.gke.io/gke-gateway-clusterip-cidr: especifica um bloco CIDR para acessar clusters pelo gateway do Connect. Isso é usado porCoreDNSem interfaces de rede secundárias.annotations.networking.gke.io/gke-gateway-pod-cidr: especifica um bloco CIDR para um pod que pode ser alocado em interfaces de rede secundárias.annotations.networking.gke.io/gdce-vlan-id: especifica o ID da VLAN para esta rede.annotations.networking.gke.io/gdce-vlan-mtu: (opcional) especifica o valor da MTU para essa rede. Se omitido, herda o valor da MTU da interface principal.annotations.networking.gke.io/gdce-lb-service-vip-cidr: especifica o intervalo de endereços IP virtuais para o serviço de balanceamento de carga. O valor pode ser um bloco CIDR ou um valor de intervalo de endereços explícito. Essa anotação é obrigatória para o balanceamento de carga da camada 3 e opcional para a camada 2.
O exemplo a seguir ilustra a estrutura do 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 vários intervalos de endereços IP virtuais para o serviço de balanceamento de carga, use
a anotação networking.gke.io/gdce-lb-service-vip-cidrs. É possível fornecer os valores dessa anotação como uma lista separada por vírgulas ou como um payload JSON.
Exemplo:
[
{
"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
}
]
Se você optar por usar um payload JSON, recomendamos que use o formato JSON condensado. Exemplo:
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
O campo autoAssign é definido como false por padrão se for omitido.
NetworkInterfaceState recurso
O recurso NetworkInterfaceState é somente leitura e permite descobrir interfaces de rede físicas no nó e coletar estatísticas de tempo de execução sobre o tráfego de rede que flui por essas interfaces.
O Distributed Cloud cria um recurso NetworkInterfaceState para cada nó em um cluster.
A configuração padrão das máquinas conectadas do Distributed Cloud
inclui uma interface de rede vinculada chamada uplink0. Essa interface vincula as interfaces de rede eno1np0 e eno2np1. Cada um deles está conectado a um switch ToR do Distributed Cloud, respectivamente.
O recurso NetworkInterfaceState fornece as seguintes categorias de informações de interface de rede expostas como campos de status somente leitura.
Informações gerais:
status.interfaces.ifname: o nome da interface de rede de destino.status.lastReportTime: a hora e a data do último relatório de status da interface de destino.
Informações de configuração do endereço IP:
status.interfaces.interfaceinfo.address: o endereço IP atribuído à interface de destino.status.interfaces.interfaceinfo.dns: o endereço IP do servidor DNS atribuído à interface de destino.status.interfaces.interfaceinfo.gateway: o endereço IP do gateway de rede que atende à interface de destino.status.interfaces.interfaceinfo.prefixlen: o tamanho do prefixo IP.
Informações de hardware:
status.interfaces.linkinfo.broadcast: o endereço MAC de transmissão da interface de destino.status.interfaces.linkinfo.businfo: o caminho do dispositivo PCIe no formatobus:slot.function.status.interfaces.linkinfo.flags: as flags da interface. Por exemplo,BROADCAST.status.interfaces.linkinfo.macAddress: o endereço MAC unicast da interface de destino.status.interfaces.linkinfo.mtu: o valor da MTU para a interface de destino.
Estatísticas de sinal:
status.interfaces.statistics.rx.bytes: o total de bytes recebidos pela interface de destino.status.interfaces.statistics.rx.dropped: o total de pacotes descartados pela interface de destino.status.interfaces.statistics.rx.errors: o total de erros de recebimento de pacotes para a interface de destino.status.interfaces.statistics.rx.multicast: o total de pacotes multicast recebidos pela interface de destino.status.interfaces.statistics.rx.overErrors: o total de pacotes recebidos por erros na interface de destino.status.interfaces.statistics.rx.packets: o total de pacotes recebidos pela interface de destino.
Estatísticas de transmissão:
status.interfaces.statistics.tx.bytes: o total de bytes transmitidos pela interface de destino.status.interfaces.statistics.tx.carrierErrors: o total de erros de operadora encontrados pela interface de destino.status.interfaces.statistics.tx.collisions: o total de colisões de pacotes encontradas pela interface de destino.status.interfaces.statistics.tx.dropped: o total de pacotes descartados pela interface de destino.status.interfaces.statistics.tx.errors: o total de erros de transmissão da interface de destino.status.interfaces.statistics.tx.packets: o total de pacotes transmitidos pela interface de destino.
O exemplo a seguir ilustra a estrutura do 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"
Configurar uma interface secundária em um pod usando a multirrede do Distributed Cloud
O Distributed Cloud Connected permite criar uma interface de rede secundária em um pod usando o recurso de várias redes. Para isso, siga estas etapas:
Configure um recurso
Network. Exemplo: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: 27A anotação
networking.gke.io/gdce-lb-service-vip-cidrsespecifica um ou mais pools de endereços IP para essa rede virtual. O CIDR especificado aqui precisa ser um subconjunto da primeira metade do CIDR da VLAN para a rede. O Distributed Cloud Connected aplica esse requisito por meio de verificações de webhook da seguinte maneira:- O intervalo de endereços IP virtual de serviço (SVIP) precisa estar dentro do intervalo CIDR da VLAN correspondente.
- O intervalo de endereços SVIP só pode abranger até a primeira metade do intervalo CIDR da VLAN.
Adicione uma anotação à definição do pod do Distributed Cloud da seguinte maneira:
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: eth1Quando você fornece essa anotação ao recurso
Network, o balanceamento de carga da camada 2 com o MetalLB é configurado automaticamente. Essa anotação configura a interfaceeth0como principal e a interfaceeth1como secundária com balanceamento de carga da camada 2 com o MetalLB.
A configuração da interface secundária, conforme descrito nesta seção, resulta na criação automática dos seguintes recursos personalizados:
- Um recurso
IPAddressPool, que permite a atribuição automática de endereços SVIP a pods. Exemplo:
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
- Um recurso
L2Advertisement, que permite a publicidade dos endereços SVIP especificados. Exemplo:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2advertise-410
namespace: kube-system
spec:
ipAddressPools:
- test-410-pool
interfaces:
- gdcenet0.410