Configure várias interfaces de rede para pods

Este documento descreve como configurar o Google Distributed Cloud (apenas software) para o VMware de modo a fornecer várias interfaces de rede, ou multi-NIC, para os seus pods. A funcionalidade de várias NICs para pods pode ajudar a separar o tráfego do plano de controlo do tráfego do plano de dados, criando isolamento entre planos. As interfaces de rede adicionais também ativam a capacidade de multicast para os seus pods. As placas de rede múltiplas para pods são suportadas para clusters de utilizadores, mas não são permitidas para clusters de administrador.

Esta página destina-se a especialistas de redes que instalam, configuram e oferecem apoio técnico para equipamento de rede. Para saber mais sobre as funções comuns e as tarefas de exemplo a que fazemos referência no conteúdo, consulte o artigo Funções e tarefas comuns de utilizadores do GKE. Google Cloud

O isolamento do plano de rede é importante para os sistemas que usam virtualizações de funções de rede (NFVs), como redes definidas por software numa rede de área alargada (SD-WAN), um agente de segurança de acesso à nuvem (CASB) e firewalls de nova geração (NG-FWs). Estes tipos de NFVs baseiam-se no acesso a várias interfaces para manter os planos de controlo e de dados separados.

A configuração de várias interfaces de rede suporta a associação de interfaces de rede a conjuntos de nós, o que pode oferecer vantagens de desempenho. Por exemplo, um cluster pode conter uma combinação de tipos de nós. Quando agrupa máquinas de elevado desempenho num único conjunto de nós, pode criar interfaces adicionais para o conjunto de nós de modo a melhorar o fluxo de tráfego.

Configure várias interfaces de rede

Geralmente, existem três passos para configurar várias interfaces de rede para os seus pods:

  1. Ative a funcionalidade multi-NIC para o cluster de utilizadores através dos campos multipleNetworkInterfaces e enableDataplaneV2 no ficheiro de configuração do cluster.

  2. Especifique interfaces de rede com a secção additionalNodeInterfaces no ficheiro de configuração do cluster e crie um ou mais recursos personalizados NetworkAttachmentDefinition.

  3. Atribua interfaces de rede a pods com a anotação k8s.v1.cni.cncf.io/networks.

Ative a funcionalidade multi-NIC

Ative a funcionalidade de várias NICs para os seus pods definindo os campos multipleNetworkInterfaces e enableDataplaneV2 no ficheiro de configuração do cluster de utilizadores como true.

apiVersion: v1
multipleNetworkInterfaces: true
enableDataplaneV2: true
  ...

Especifique interfaces de rede

No ficheiro de configuração do cluster, especifique interfaces de rede de nós adicionais na secção additionalNodeInterfaces.

Por exemplo, segue-se uma parte de um ficheiro de configuração de cluster de utilizadores que mostra uma interface de rede de nós adicional:

apiVersion: v1
multipleNetworkInterfaces: true
enableDataplaneV2: true
network:
  serviceCIDR: "10.96.0.0/20"
  podCIDR: "192.168.0.0/16"
  vCenter:
    networkName: network-private310
  ...
  # New multiple network configs
  additionalNodeInterfaces:
  - networkName: "gke-network-1"
    ipBlockFilePath: "my-block-yaml"
    type: static

Depois de criar um cluster com a configuração anterior, tem de criar um ou mais recursos personalizados NetworkAttachmentDefinition (NAD) no cluster de utilizadores onde especifica interfaces de rede adicionais. Os NetworkAttachmentDefinitions correspondem às redes disponíveis para os seus Pods. O exemplo seguinte mostra um manifesto para um NetworkAttachmentDefinition:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: gke-network-1
  namespace: default
spec:
  config: '{
  "cniVersion":"0.3.0",
  "type": "ipvlan",
  "master": "ens224", # defines the node interface that this Pod interface would map to
  "mode": "l2",
  "ipam": {
    "type": "whereabouts",
    "range": "172.16.0.0/24"
   }
}'

Guarde o manifesto como um ficheiro YAML, por exemplo, my-nad.yaml, e crie o NetworkAttachmentDefinition:

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f my-nad.yaml

Atribua interfaces de rede a um pod

Use a anotação k8s.v1.cni.cncf.io/networks para atribuir uma ou mais interfaces de rede a um pod. Cada interface de rede é especificada com um espaço de nomes e o nome de um NetworkAttachmentDefinition, separados por uma barra (/). Use uma lista separada por vírgulas para especificar várias interfaces de rede.

No exemplo seguinte, são atribuídas duas interfaces de rede ao samplepod Pod. As interfaces de rede são especificadas pelos nomes de dois NetworkAttachmentDefinitions, gke-network-1 e gke-network-2, que foram criados no espaço de nomes default.

---
apiVersion: v1
kind: Pod
metadata:
  name: samplepod
  annotations:
    k8s.v1.cni.cncf.io/networks: default/gke-network-1,default/gke-network-2
spec:
  containers:
  ...

Restrinja as interfaces de rede a um conjunto de nós

Se não quiser que um NetworkAttachmentDefinition seja aplicável a um cluster inteiro, pode limitar a respetiva funcionalidade a um conjunto de nós.

Pode agrupar nós de cluster usando a etiqueta padrão atribuída ao nó ou a sua própria etiqueta personalizada. Em seguida, pode especificar a etiqueta do nó no manifesto NetworkAttachmentDefinition através da anotação k8s.v1.cni.cncf.io/nodeSelector. O Google Distributed Cloud força a implementação de todos os pods que referenciam este recurso personalizado nos nós que têm esta etiqueta.

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  annotations:
    k8s.v1.cni.cncf.io/nodeSelector: LABEL_KEY=LABEL_VALUE
  name: gke-network-1
spec:
...

O exemplo seguinte mostra a etiqueta my-label=multinicNP indicada no NetworkAttachmentDefinition e força a implementação de todos os pods aos quais a rede gke-network-1 está atribuída aos nós que têm esta etiqueta.

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  annotations:
    k8s.v1.cni.cncf.io/nodeSelector: my-label=multinicNP
  name: gke-network-1
spec:
...

Para aplicar uma etiqueta personalizada a um nó, use o comando kubectl label nodes:

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] label nodes NODE_NAME LABEL_KEY=LABEL_VALUE 

Substitua o seguinte:

  • NODE_NAME: o nome do nó que está a etiquetar.
  • LABEL_KEY: a chave a usar para a sua etiqueta.
  • LABEL_VALUE: o valor da etiqueta.

Neste exemplo, o nó my-node recebe a etiqueta environment=production:

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] label nodes my-node environment=production

Preocupações de segurança.

Um NetworkAttachmentDefinition fornece acesso total a uma rede, pelo que os administradores do cluster têm de ter cuidado ao conceder acesso de criação, atualização ou eliminação a outros utilizadores. Se um determinado NetworkAttachmentDefinition tiver de ser isolado, pode especificar um espaço de nomes não predefinido quando o criar, em que apenas os pods desse espaço de nomes podem aceder ao mesmo.

No diagrama seguinte, os pods do espaço de nomes default não conseguem aceder à interface de rede no espaço de nomes privileged.

Utilização de espaços de nomes para isolar o tráfego de rede.

Plug-ins CNI suportados

Esta secção apresenta uma lista dos plug-ins CNI suportados pela funcionalidade de várias NICs para o Google Distributed Cloud. Use apenas os seguintes plug-ins quando especificar um NetworkAttachmentDefinition.

Criação de interface:

  • ipvlan
  • macvlan
  • bridge

Plug-ins da Meta:

  • portmap
  • sbr
  • tuning

Plugins de IPAM:

  • host-local
  • static
  • whereabouts

Configuração do trajeto

Um pod com um ou mais NetworkAttachmentDefinitions atribuídos tem várias interfaces de rede. Por predefinição, a tabela de encaminhamento do pod nesta situação é expandida com as interfaces adicionais disponíveis localmente apenas a partir do NetworkAttachmentDefinitions atribuído. Os pacotes destinados ao gateway predefinido continuam configurados para usar a interface predefinida do Pod, eth0. Pode modificar este comportamento através dos seguintes plug-ins CNI:

  • sbr
  • static
  • whereabouts

Por exemplo, pode querer que a maioria do tráfego passe pelo gateway predefinido, o que significa que o tráfego passa pela interface de rede predefinida. No entanto, quer que algum tráfego específico passe por uma das interfaces não predefinidas. Pode ser difícil desambiguar o tráfego com base no IP de destino (encaminhamento normal), porque o mesmo ponto final está disponível nos dois tipos de interface. Neste caso, o encaminhamento baseado na origem (SBR) pode ajudar.

Plugin SBR

O plug-in sbr dá à aplicação o controlo sobre as decisões de encaminhamento. A aplicação controla o que é usado como o endereço IP de origem da ligação que estabelece. Quando a aplicação opta por usar o endereço IP do NetworkAttachmentDefinition como IP de origem, os pacotes são encaminhados para a tabela de encaminhamento adicional que o sbr configurou. A tabela de encaminhamento do sbr envia tráfego através do seu próprio gateway predefinido, que passa pela interface do NetworkAttachmentDefinition. O IP do gateway predefinido nessa tabela é controlado com o campo gateway nos plug-ins whereabouts ou static. O plugin sbr é executado como um plugin encadeado. Para mais informações sobre o plug-in sbr, incluindo informações de utilização, consulte o artigo Plug-in de encaminhamento baseado na origem.

O exemplo seguinte mostra "gateway":"21.0.111.254" definido em whereabouts e sbr definido como plug-in encadeado após ipvlan:

# ip route
default via 192.168.0.64 dev eth0  mtu 1500
192.168.0.64 dev eth0 scope link
# ip route list table 100
default via 21.0.111.254 dev net1
21.0.104.0/21 dev net1 proto kernel scope link src 21.0.111.1

Plug-ins estáticos e de localização

O plug-in whereabouts é basicamente uma extensão do plug-in static e estes dois partilham a configuração de encaminhamento. Para ver um exemplo de configuração, consulte o plug-in de gestão de endereços IP estáticos. Pode definir um gateway e um trajeto para adicionar à tabela de encaminhamento do pod. No entanto, não pode modificar o gateway predefinido do Pod desta forma.

O exemplo seguinte mostra a adição de "routes": [{ "dst": "172.31.0.0/16" }] no elemento NetworkAttachmentDefinition:

# ip route
default via 192.168.0.64 dev eth0  mtu 1500
172.31.0.0/16 via 21.0.111.254 dev net1
21.0.104.0/21 dev net1 proto kernel scope link src 21.0.111.1
192.168.0.64 dev eth0 scope link

Exemplos de configuração

Esta secção ilustra algumas das configurações de rede comuns suportadas pela funcionalidade de várias NICs.

Anexo de rede único usado por vários pods:

Anexo de rede único usado por vários pods.

Vários anexos de rede usados por um único agrupamento:

Vários anexos de rede usados por um único agrupamento.

Vários anexos de rede que apontam para a mesma interface usada por um único agrupamento:

Vários anexos de rede que apontam para a mesma interface usada por um único agrupamento.

O mesmo anexo de rede é usado várias vezes por um único agrupamento:

A mesma associação de rede é usada várias vezes por um único agrupamento.

Resolver problemas

Se as interfaces de rede adicionais estiverem configuradas incorretamente, os pods aos quais estão atribuídas não são iniciados. Esta secção realça como encontrar informações para resolver problemas com a funcionalidade de várias NICs.

Verifique os eventos do Pod

O Multus comunica falhas através de eventos de pods do Kubernetes. Use o seguinte comando kubectl describe para ver eventos de um determinado Pod:

kubectl describe pod POD_NAME

Verifique os registos

Para cada nó, pode encontrar registos de Whereabouts e Multus nas seguintes localizações:

  • /var/log/whereabouts.log
  • /var/log/multus.log

Reveja as interfaces do Pod

Use o comando kubectl exec para verificar as interfaces do pod. Depois de aplicar os NetworkAttachmentDefinitions com êxito, as interfaces do pod têm o seguinte aspeto:

user@node1:~$ kubectl exec samplepod-5c6df74f66-5jgxs -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether 00:50:56:82:3e:f0 brd ff:ff:ff:ff:ff:ff
    inet 21.0.103.112/21 scope global net1
       valid_lft forever preferred_lft forever
38: eth0@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 36:23:79:a9:26:b3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.2.191/32 scope global eth0
       valid_lft forever preferred_lft forever

Obtenha o estado do agrupamento

Use o comando kubectl get para obter o estado da rede de um determinado pod:

kubectl get pods POD_NAME -oyaml

Segue-se um exemplo de saída que mostra o estado de um Pod com várias redes:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.v1.cni.cncf.io/network-status: |-
      [{
          "name": "",
          "interface": "eth0",
          "ips": [
              "192.168.1.88"
          ],
          "mac": "36:0e:29:e7:42:ad",
          "default": true,
          "dns": {}
      },{
          "name": "default/gke-network-1",
          "interface": "net1",
          "ips": [
              "21.0.111.1"
          ],
          "mac": "00:50:56:82:a7:ab",
          "dns": {}
      }]
    k8s.v1.cni.cncf.io/networks: gke-network-1