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.
Com as funções de webhook, é possível 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 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 peloCoreDNSem 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 recepção:
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 em relação a 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. A primeira metade do CIDR especificado aqui precisa incluir endereços IP virtuais de serviço (SVIPs). O Distributed Cloud Connected aplica esse requisito por meio de verificações de webhook da seguinte maneira:- O intervalo de endereços SVIP precisa estar dentro do intervalo CIDR da VLAN correspondente, e
- O intervalo de endereços SVIP só pode abranger até a primeira metade do intervalo de 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: eth1Essa anotação configura a interface
eth0como primária 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
A seguir