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.

  • 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_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 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 pelo 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 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:

  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. 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.
  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
    

    Essa anotação configura a interface eth0 como primária 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