Operador de função de rede

Esta página descreve o operador especializado do Kubernetes da função de rede que o Google Distributed Cloud oferece. Esse operador implementa um conjunto de CustomResourceDefinitions (CRDs) que permitem que o Distributed Cloud execute cargas de trabalho de alta performance.

O operador da função de rede e a funcionalidade SR-IOV não estão disponíveis nos servidores do Distributed Cloud.

O operador da função de rede permite que você faça o seguinte:

  • Pesquisar dispositivos de rede em um nó.
  • Consultar o endereço IP e o estado do link físico de cada dispositivo de rede em um nó.
  • Provisionar interfaces de rede adicionais em um nó.
  • Configurar recursos de sistema de baixo nível na máquina física do nó necessários para oferecer suporte a cargas de trabalho de alta performance.
  • Usar a virtualização de entrada/saída (SR-IOV) de raiz única em interfaces de rede PCI Express para virtualizá-las em várias interfaces virtuais. Em seguida, é possível configurar as cargas de trabalho do Distributed Cloud para usar essas interfaces de rede virtuais.

O suporte do Distributed Cloud para SR-IOV é baseado nos seguintes projetos de código aberto:

Pré-requisitos

O operador da 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 da função de rede o papel de leitor da rede de borda (roles/edgenetwork.viewer) usando o seguinte comando:

gcloud projects add-iam-policy-binding PROJECT_ID \
  --role roles/edgenetwork.viewer \
  --member "serviceAccount:PROJECT_ID.svc.id.goog[nf-operator/nf-angautomator-sa]"

Substitua PROJECT_ID pelo ID do projeto de destino Google Cloud .

Recursos do operador da função de rede

O operador da função de rede 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. É necessário criar a VLAN correspondente usando a API Distributed Cloud Edge Network antes de especificá-la nesse recurso. Para instruções, consulte Criar uma rede.
  • NetworkInterfaceState. Permite a descoberta de estados de interface de rede e a consulta de uma interface de rede para o estado do link e o endereço IP.
  • NodeSystemConfigUpdate. Permite a configuração de recursos de sistema de baixo nível, como opções de kernel e flags Kubelet.
  • SriovNetworkNodePolicy. Seleciona um grupo de interfaces de rede virtualizadas SR-IOV e instancia o grupo como um recurso do Kubernetes. É possível usar esse recurso em um recurso NetworkAttachmentDefinition.
  • SriovNetworkNodeState. Permite consultar o estado de provisionamento do recurso SriovNetworkNodePolicy em um nó do Distributed Cloud.
  • NetworkAttachmentDefinition. Permite anexar pods do Distributed Cloud a uma ou mais redes lógicas ou físicas no nó do Distributed Cloud. É necessário criar a VLAN correspondente antes de especificá-la nesse recurso. É necessário criar a VLAN correspondente usando a API Distributed Cloud Edge Network antes de especificá-la nesse recurso. Para instruções, consulte Criar uma rede.

O operador da função de rede também permite definir interfaces de rede secundárias que não usam funções virtuais SR-IOV.

Recurso Network

O recurso Network define uma rede virtual no rack do Distributed Cloud que os pods no cluster 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 nodeInterfaceMatcher.interfaceName.
  • spec.nodeInterfaceMatcher.interfaceName: o nome da interface de rede física no nó de destino do Distributed Cloud 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.

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
spec:
  type: L2
  nodeInterfaceMatcher:
    interfaceName: gdcenet0.200
  gateway4: 10.53.0.1

Recurso NetworkInterfaceState

O recurso NetworkInterfaceState é somente leitura e permite descobrir interfaces de rede físicas no nó e coletar estatísticas 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 do Distributed Cloud inclui uma interface de rede vinculada na placa filha de rede de seleção de rack (rNDC, na sigla em inglês) chamada gdcenet0. Essa interface vincula as interfaces de rede eno1np0 e eno2np1. Cada uma delas está conectada 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 comprimento 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: os flags de interface, por exemplo, BROADCAST.
  • status.interfaces.linkinfo.macAddress: o endereço MAC de transmissão única da interface de destino.
  • status.interfaces.linkinfo.mtu: o valor de MTU para a interface de destino.

Estatísticas de recebimento:

  • 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 de multicast recebidos pela interface de destino.
  • status.interfaces.statistics.rx.overErrors: o total de erros de recebimento de pacotes para a 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 para a 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"

Recurso NodeSystemConfigUpdate

O recurso NodeSystemConfigUpdate permite fazer mudanças na configuração do sistema operacional do nó e modificar flags Kubelet. As mudanças que não sejam sysctl exigem uma reinicialização do nó.

Ao instanciar esse recurso, especifique os nós de destino no campo nodeSelector. Inclua todos os pares de chave-valor para cada nó de destino no campo nodeSelector. Quando você especifica mais de um nó de destino nesse campo, os nós de destino são atualizados um de cada vez. Esse campo substitui o campo nodeName.

CUIDADO: o campo nodeName foi descontinuado. O uso dele reinicializa imediatamente os nós de destino, incluindo os nós do plano de controle local, o que pode interromper cargas de trabalho críticas.

O recurso NodeSystemConfigUpdate fornece os seguintes campos de configuração específicos do Distributed Cloud:

  • spec.containerRuntimeDNSConfig.ip: especifica uma lista de endereços IP para registros de imagem particulares.
  • spec.containerRuntimeDNSConfig: especifica uma lista de entradas DNS personalizadas usadas pelo ambiente de execução de contêiner em cada nó do Distributed Cloud. Cada entrada consiste nos seguintes campos:

    • ip: especifica o endereço IPv4 de destino,
    • domain: especifica o domínio correspondente,
    • interface: especifica a interface de saída de rede pela qual o endereço IP especificado no campo ip pode ser acessado. É possível especificar uma interface definida pelos seguintes recursos: CustomNetworkInterfaceConfig, Network (por anotação), NetworkAttachmentDefinition (por anotação). Esse é um recurso de pré-lançamento.
  • spec.kubeletConfig.cpuManagerPolicy: especifica a política do Kubernetes CPUManager. Os valores válidos são None e Static.

  • spec.kubeletConfig.topologyManagerPolicy: especifica a política do Kubernetes TopologyManager. Os valores válidos são None, BestEffort, Restricted e SingleNumaMode.

  • spec.osConfig.hugePagesConfig: especifica a configuração de huge pages por nó NUMA. Os valores válidos são 2MB e 1GB. O número de páginas grandes solicitadas é distribuído uniformemente entre os dois nós NUMA no sistema. Por exemplo, se você alocar 16 páginas grandes de 1 GB cada, cada nó receberá uma pré-alocação de 8 GB.

  • spec.osConfig.isolatedCpusPerSocket: especifica o número de CPUs isoladas por soquete. Necessário se cpuManagerPolicy estiver definido como Static.

  • spec.osConfig.cpuIsolationPolicy: especifica a política de isolamento de CPU. A política Default isola apenas as tarefas systemd das CPUs reservadas para cargas de trabalho. A política Kernel marca as CPUs como isolcpus e define os rcu_nocb, nohz_full e rcu_nocb_poll flags em cada CPU.

  • spec.sysctls.NodeLevel: especifica os parâmetros sysctls que você pode configurar globalmente em um nó usando o operador da função de rede. Os parâmetros configuráveis são os seguintes:

    • fs.inotify.max_user_instances
    • fs.inotify.max_user_watches
    • kernel.sched_rt_runtime_us
    • kernel.core_pattern
    • net.ipv4.tcp_wmem
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_slow_start_after_idle
    • net.ipv4.udp_rmem_min
    • net.ipv4.udp_wmem_min
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_wmem
    • net.core.rmem_max
    • net.core.wmem_max
    • net.core.rmem_default
    • net.core.wmem_default
    • net.netfilter.nf_conntrack_tcp_timeout_unacknowledged
    • net.netfilter.nf_conntrack_tcp_timeout_max_retrans
    • net.sctp.auth_enable
    • net.sctp.sctp_mem
    • net.ipv4.udp_mem
    • net.ipv4.tcp_mem
    • net.ipv4.tcp_slow_start_after_idle
    • net.sctp.auth_enable
    • vm.max_map_count

    Também é possível definir o escopo de parâmetros seguros e não seguros sysctls para um pod ou namespace específico usando o tuning plug-in da interface de rede de contêiner (CNI, na sigla em inglês).

O recurso NodeSystemConfigUpdate fornece os seguintes campos de status geral somente leitura:

  • status.lastReportTime: a hora mais recente em que o status foi informado para a interface de destino.
  • status.conditions.lastTransitionTime: a hora mais recente em que a condição da interface mudou.
  • status.conditions.observedGeneration: denota o valor .metadata.generation em que a condição inicial foi baseada.
  • status.conditions.message: uma mensagem informativa que descreve a mudança da condição da interface.
  • status.conditions.reason: um identificador programático que denota o motivo da última mudança da condição da interface.
  • status.conditions.status: o descritor de status da condição. Os valores válidos são True, False e Unknown.
  • status.conditions.type: o tipo de condição em camelCase.

O exemplo a seguir ilustra a estrutura do recurso:

apiVersion: networking.gke.io/v1
kind: NodeSystemConfigUpdate
metadata:
  name: node-pool-1-config
  namespace: default
spec:
  nodeSelector:
    baremetal.cluster.gke.io/node-pool: node-pool-1
    networking.gke.io/worker-network-sriov.capable: true
  sysctls:
    nodeLevel:
      "net.ipv4.udp_mem" : "12348035 16464042 24696060"
  kubeletConfig:
    topologyManagerPolicy: BestEffort
    cpuManagerPolicy: Static
  osConfig:
    hugePagesConfig:
      "TWO_MB": 0
      "ONE_GB": 16
    isolatedCpusPerSocket:
      "0": 10
      "1": 10

Recurso SriovNetworkNodePolicy

O recurso SriovNetworkNodePolicy permite alocar um grupo de funções virtuais (VFs) SR-IOV em uma máquina física do Distributed Cloud e instanciar esse grupo como um recurso do Kubernetes. Em seguida, é possível usar esse recurso em um recurso NetworkAttachmentDefinition.

É possível selecionar cada VF de destino pelo fornecedor e ID do dispositivo PCIe, pelos endereços do dispositivo PCIe ou pelo nome do dispositivo enumerado do Linux. O operador de rede SR-IOV configura cada interface de rede física para provisionar as VFs de destino. Isso inclui atualizar o firmware da interface de rede, configurar o driver do kernel do Linux e reiniciar a máquina do Distributed Cloud, se necessário.

Para descobrir as interfaces de rede disponíveis no nó, procure os NetworkInterfaceState recursos nesse nó no nf-operator namespace.

O exemplo a seguir ilustra a estrutura do recurso:

apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: mlnx6-p2-sriov-en2
  namespace: sriov-network-operator
spec:
  deviceType: netdevice
  isRdma: true
  mtu: 9000
  nicSelector:
    pfNames:
    - enp134s0f1np1
  nodeSelector:
    edgecontainer.googleapis.com/network-sriov.capable: "true"
  numVfs: 31
  priority: 99
  resourceName: mlnx6_p2_sriov_en2

O exemplo anterior cria um máximo de 31 VFs da segunda porta na interface de rede chamada enp134s0f1np1 com um valor de MTU de 9000 (o valor máximo permitido). Use o rótulo do seletor de nós edgecontainer.googleapis.com/network-sriov.capable, que está presente em todos os nós do Distributed Cloud capazes de SR-IOV.

Para informações sobre como usar esse recurso, consulte SriovNetworkNodeState.

Recurso SriovNetworkNodeState

O recurso somente leitura SriovNetworkNodeState permite consultar o estado de provisionamento do recurso SriovNetworkNodePolicy em um nó do Distributed Cloud. Ele retorna a configuração completa do recurso SriovNetworkNodePolicy no nó, bem como uma lista de VFs ativas no nó. O campo status.syncStatus indica se todos os recursos SriovNetworkNodePolicy definidos para o nó foram aplicados corretamente.

O exemplo a seguir ilustra a estrutura do recurso:

apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
  name: MyNode1
  namespace: sriov-network-operator
spec:
  dpConfigVersion: "1969684"
  interfaces:
  - mtu: 9000
    name: enp134s0f1np1
    numVfs: 31
    pciAddress: 0000:86:00.1
    vfGroups:
    - deviceType: netdevice
      mtu: 9000
      policyName: mlnx6-p2-sriov-en2
      resourceName: mlnx6_p2_sriov_en2
      vfRange: 0-30
status:

Status:
  Interfaces:
    Device ID:    1015
    Driver:       mlx5_core
    Link Speed:   25000 Mb/s
    Link Type:    ETH
    Mac:          ba:16:03:9e:9c:87
    Mtu:          9000
    Name:         eno1np0
    Pci Address:  0000:1a:00.0
    Vendor:       15b3
    Device ID:    1015
    Driver:       mlx5_core
    Link Speed:   25000 Mb/s
    Link Type:    ETH
    Mac:          ba:16:03:9e:9c:87
    Mtu:          9000
    Name:         eno2np1
    Pci Address:  0000:1a:00.1
    Vendor:       15b3
    Vfs:
  - Vfs:
    - deviceID: 101e
      driver: mlx5_core
      mac: c2:80:29:b5:63:55
      mtu: 9000
      name: enp134s0f1v0
      pciAddress: 0000:86:04.1
      vendor: 15b3
      vfID: 0
    - deviceID: 101e
      driver: mlx5_core
      mac: 7e:36:0c:82:d4:20
      mtu: 9000
      name: enp134s0f1v1
      pciAddress: 0000:86:04.2
      vendor: 15b3
      vfID: 1
      .. <omitted 29 other VFs here>
  syncStatus: Succeeded

Para informações sobre como usar esse recurso, consulte SriovNetworkNodeState.

Recurso NetworkAttachmentDefinition

O recurso NetworkAttachmentDefinition permite anexar pods do Distributed Cloud a uma ou mais redes lógicas ou físicas no nó do Distributed Cloud. Ele aproveita o framework Multus-CNI e o plug-in SRIOV-CNI.

Use uma anotação para fazer referência ao nome do recurso SriovNetworkNodePolicy apropriado. Ao criar essa anotação, faça o seguinte:

  • Use a chave k8s.v1.cni.cncf.io/resourceName.
  • Use o prefixo gke.io/ no valor, seguido pelo nome do recurso SriovNetworkNodePolicy de destino.

O exemplo a seguir ilustra a estrutura do recurso:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: sriov-net1
  namespace: mynamespace
  annotations:
    k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p2_sriov_en2

spec:
  config: '{
  "type": "sriov",
  "cniVersion": "0.3.1",
  "name": "sriov-network",
  "ipam": {
    "type": "host-local",
    "subnet": "10.56.217.0/24",
    "routes": [{
      "dst": "0.0.0.0/0"
    }],
    "gateway": "10.56.217.1"
  }
}'

Fazer upgrade de recursos NetworkAttachmentDefinition para o Distributed Cloud 1.4.0

A versão 1.4.0 do Distributed Cloud substitui a interface bond0 por uma nova interface chamada gdcenet0. A interface gdcenet0 permite usar a placa de interface de rede (NIC) de gerenciamento de host em cada máquina do Distributed Cloud no rack para cargas de trabalho, mantendo o tráfego de rede de gerenciamento e plano de controle do Distributed Cloud completamente separado. Para aproveitar esta funcionalidade, conclua as etapas desta seção para reconfigurar seus NetworkAttachmentDefinition recursos e siga as instruções em Configurar a rede do Distributed Cloud para provisionar as redes e sub-redes apropriadas.

Para cada cluster do Distributed Cloud em que você implantou um ou mais recursos NetworkAttachmentDefinition, as seguintes regras de migração se aplicam:

  • Para cada novo recurso NetworkAttachmentDefinition, use gdcenet0 em vez de bond0 como o valor do campo master. Se você aplicar um recurso que usa bond0 ou um valor vazio para esse campo, o Distributed Cloud vai substituir o valor por gdcenet0 e, em seguida, armazenar e aplicar o recurso ao cluster.
  • Para cada recurso NetworkAttachmentDefinition atual, substitua bond0 por gdcenet0 como o valor do campo master e reaplique o recurso ao cluster para restaurar a conectividade de rede completa aos pods afetados.

Para informações sobre como usar esse recurso, consulte NetworkAttachmentDefinition.

Configurar uma interface secundária em um pod usando VFs SR-IOV

Depois de configurar um recurso SriovNetworkNodePolicy e um recurso NetworkAttachmentDefinition correspondente, é possível configurar uma interface de rede secundária em um pod do Distributed Cloud usando funções virtuais SR-IOV.

Para fazer isso, adicione uma anotação à definição do pod do Distributed Cloud da seguinte maneira:

  • Chave: k8s.v1.cni.cncf.io/networks
  • Valor: nameSpace/<NetworkAttachmentDefinition1,nameSpace/NetworkAttachmentDefinition2...

O exemplo a seguir ilustra essa anotação:

apiVersion: v1
kind: Pod
metadata:
  name: sriovpod
  annotations:
    k8s.v1.cni.cncf.io/networks: mynamespace/sriov-net1
spec:
  containers:
  - name: sleeppodsriov
    command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
    securityContext:
      capabilities:
        add:
          - NET_ADMIN

Configurar uma interface secundária em um pod usando o driver MacVLAN

O Distributed Cloud também oferece suporte à criação de uma interface de rede secundária em um pod usando o driver MacVLAN. Somente a interface gdcenet0 oferece suporte a essa configuração e apenas em pods que executam cargas de trabalho em contêineres.

Para configurar uma interface para usar o driver MacVLAN:

  1. Configure um recurso NetworkAttachmentDefinition conforme mostrado no exemplo a seguir:

     apiVersion: "k8s.cni.cncf.io/v1"
     kind: NetworkAttachmentDefinition
     metadata:
       name: macvlan-b400-1
       annotations:
         networking.gke.io/gdce-vlan-id: 400
     spec:
       config: '{
       "type": "macvlan",
       "master": "gdcenet0.400",
       "ipam": {
         "type": "static",
         "addresses": [
           {
             "address": "192.168.100.20/27",
             "gateway": "192.168.100.1"
           }
         ]
       ...
       }
     }'
    
  2. Adicione uma anotação à definição do pod do Distributed Cloud da seguinte maneira:

     apiVersion: v1
     kind: Pod
     metadata:
       name: macvlan-testpod1
       annotations:
         k8s.v1.cni.cncf.io/networks: macvlan-b400-1
    

Configurar uma interface secundária em um pod usando várias redes do Distributed Cloud

O Distributed Cloud oferece suporte à criação de uma interface de rede secundária em um pod usando o recurso de várias redes. Para fazer isso, siga estas etapas:

  1. Configure um recurso Network. Exemplo:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vlan200-network
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: vlan200-interface
      gateway4: 10.53.0.1
    
  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":"eth1","network":"vlan200-network"}]
        networking.gke.io/default-interface: eth1
    ...
    
    

    A seguir