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.

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

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.
  • Use a virtualização de entrada/saída de raiz única (SR-IOV) em interfaces de rede PCI Express para virtualizá-las em várias interfaces virtuais. Em seguida, configure as cargas de trabalho conectadas do Distributed Cloud para usar essas interfaces de rede virtual.

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

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 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 Google 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 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.
  • SriovNetworkNodePolicy. Seleciona um grupo de interfaces de rede virtualizadas SR-IOV e cria uma instância do grupo como um recurso do Kubernetes. Você pode 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ó 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 rede.

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

Network recurso

O recurso Network define uma rede virtual no rack conectado 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.

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

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 na placa filha de rede de seleção de rack (rNDC) chamada gdcenet0. 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"

NodeSystemConfigUpdate recurso

Com o recurso NodeSystemConfigUpdate, é possível fazer mudanças na configuração do sistema operacional do nó e modificar flags Kubelet. Mudanças que não sejam de 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, eles são atualizados um por vez.

ATENÇÃO: o campo nodeName foi descontinuado. O uso imediato reinicializa os nós de destino, incluindo os nós locais do plano de controle, o que pode interromper cargas de trabalho críticas.

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

  • spec.containerRuntimeDNSConfig.ip: especifica uma lista de endereços IP para registros de imagens particulares.
  • spec.containerRuntimeDNSConfig: especifica uma lista de entradas DNS personalizadas usadas pelo ambiente de execução de contêiner em cada nó conectado 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). Este é um recurso em pré-lançamento.
  • spec.kubeletConfig.cpuManagerPolicy: especifica a política do CPUManager do Kubernetes. Os valores válidos são None e Static.

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

  • spec.osConfig.hugePagesConfig: especifica a configuração de página grande por nó NUMA. Os valores válidos são 2MB e 1GB. O número de páginas enormes solicitadas é distribuído igualmente entre os dois nós NUMA no sistema. Por exemplo, se você alocar 16 páginas enormes 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. Obrigatório se cpuManagerPolicy estiver definido como Static. O número máximo de CPUs isoladas precisa ser menor que 80% do total de CPUs no nó.

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

  • spec.sysctls.NodeLevel: especifica os parâmetros sysctls que podem ser configurados globalmente em um nó usando o operador de 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 dos parâmetros sysctls seguros e não seguros para um pod ou namespace específico usando o plug-in da interface de rede de contêineres (CNI) tuning.

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

  • status.lastReportTime: a última vez que o status foi informado para a interface de destino.
  • status.conditions.lastTransitionTime: o horário mais recente em que a condição da interface mudou.
  • status.conditions.observedGeneration: denota o valor .metadata.generation em que a condição inicial se baseou.
  • status.conditions.message: uma mensagem informativa que descreve a mudança na condição da interface.
  • status.conditions.reason: um identificador programático que indica o motivo da última mudança na 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

SriovNetworkNodePolicy recurso

O recurso SriovNetworkNodePolicy permite alocar um grupo de funções virtuais (VFs) do SR-IOV em uma máquina física conectada ao Distributed Cloud e instanciar esse grupo como um recurso do Kubernetes. Em seguida, use 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 conectada do Distributed Cloud, se necessário.

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

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 conectados do Distributed Cloud compatíveis com SR-IOV.

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

SriovNetworkNodeState recurso

O recurso somente leitura SriovNetworkNodeState permite consultar o estado de provisionamento do recurso SriovNetworkNodePolicy em um nó conectado 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.

NetworkAttachmentDefinition recurso

O recurso NetworkAttachmentDefinition permite anexar pods do Distributed Cloud a uma ou mais redes lógicas ou físicas no nó conectado do Distributed Cloud. Ele usa 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"
  }
}'

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 Connected também permite criar uma interface de rede secundária em um pod usando o driver MacVLAN. Apenas a interface gdcenet0 aceita essa configuração e somente 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 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: 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