Operador de função de rede

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_ID com o ID do projeto Google Cloud que contém os recursos da API Distributed Cloud Edge Network.
  • CLUSTER_PROJECT_ID com 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 flags Kubelet.
  • 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 de nodeInterfaceMatcher.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 campo cluster-cidr-config-per-node-mask-size no ConfigMap nf-operator-defaults no namespace nf-operator.
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr: especifica um bloco CIDR para acessar clusters pelo gateway do Connect. Isso é usado por CoreDNS em 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 formato bus: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:

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

    A anotação networking.gke.io/gdce-lb-service-vip-cidrs especifica 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.
  2. 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: eth1
    

    Quando 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 interface eth0 como principal e a interface eth1 como 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