Anexando Várias VNICs Secundárias para Rede de Pods

Descubra como anexar e configurar várias VNICs secundárias em nós de trabalho para rede de pods usando o Kubernetes Engine (OKE). Você pode fixar um pod em um único perfil de VNIC secundário usando um Recurso de Aplicativo ou anexar várias interfaces de pod usando Multus e NetworkAttachmentDefinitions (NADs).

Anexar várias VNICs secundárias a nós de trabalho permite segmentar a rede de pods em diferentes sub-redes e controles de segurança (por exemplo, pods front-end em uma VNIC/sub-rede/NSG secundária e pods back-end em outra). Cada perfil de VNIC secundário é configurado com seu próprio pool de endereços IP de pod (controlado por ipCount) e definições de rede (como sub-rede e NSGs). Opcionalmente, você pode associar um perfil de VNIC secundário a um nome de Recurso do Aplicativo para que as cargas de trabalho possam selecionar esse perfil explicitamente.

Se você definir Recursos do Aplicativo em perfis de VNIC secundários, o Kubernetes Engine exporá esses Recursos do Aplicativo em cada nó como Recursos Estendidos do Kubernetes (por exemplo, oke-application-resource.oci.oraclecloud.com/<resource-name>), com a capacidade do nó refletindo quantos IPs de pod estão disponíveis no perfil de VNIC secundário correspondente.

Os pods podem usar os Recursos do Aplicativo da seguinte maneira:

  • Um pod pode solicitar um único Recurso do Aplicativo (por meio de uma solicitação/limite de Recurso Estendido) quando você quiser que esse pod selecione um perfil/interface de VNIC secundária.

  • Os nós que expõem os Recursos do Aplicativo são contaminados (com a mancha oci.oraclecloud.com/application-resource-only:NoSchedule) para que os pods que não solicitam explicitamente um Recurso do Aplicativo não sejam programados nesses nós. Os pods devem incluir uma tolerância correspondente.

  • O agendamento deve atender ao Recurso de Aplicativo solicitado (o nó deve ter capacidade suficiente para o Recurso Estendido solicitado).

  • Se você não precisar de fixação imposta pelo scheduler para um perfil de VNIC secundário específico, não defina um Recurso de Aplicativo nos perfis de VNIC. Os pods que exigem interfaces adicionais devem usar Multus e NetworkAttachmentDefinitions (NADs) para anexar essas interfaces.

Só há suporte para o uso de várias VNICs secundárias para rede de pods com o plug-in CNI de Rede de Pod Nativa da VCN do OCI. Não há suporte para várias VNICs secundárias para rede de pods ao usar o plug-in CNI flannel para rede de pods. Limites de VNIC de forma de computação, disponibilidade de sub-rede/IP e limites de regra de NSG ainda se aplicam.

Quando um pod solicita um Recurso do Aplicativo, a programação do pod prossegue da seguinte forma:

  1. Você cria um pod que solicita um único Recurso do Aplicativo (opcional: somente se quiser que o pod seja fixado em um perfil de VNIC secundário selecionável).

  2. A validação de admissão verifica a especificação do pod, incluindo se o Recurso do Aplicativo solicitado e a quantidade solicitada são válidos.

  3. O scheduler do Kubernetes seleciona um nó que tem capacidade para o Recurso do Aplicativo solicitado e IPs disponíveis no perfil de VNIC secundário correspondente.

  4. O plug-in CNI de Rede de Pods Nativos da VCN do OCI designa um endereço IP ao pod do perfil de VNIC secundário selecionado.

  5. O pod usa aquele perfil/interface selecionado como seu caminho de rede principal neste modelo de agendamento.

Antes de anexar várias VNICs secundárias para rede de pods, certifique-se de:

  • O cluster usa a rede de pods nativa da VCN.

  • A VCN, as sub-redes e os NSGs são planejados para a segmentação desejada (porque cada perfil de VNIC secundário pode apontar para outra sub-rede e política de segurança).

  • A forma de computação usada para nós de trabalho suporta o número necessário de anexos de VNIC e a densidade de pod esperada.

  • Se você precisar de pods com várias interfaces, confirme se o Multus está implantado e se os plug-ins CNI necessários estão presentes nos nós de trabalho e confirme a versão do plug-in CNI nativo da VCN do OCI necessária para suporte com várias interfaces em seu ambiente.

Observação

Não combine anotações de rede de pods Multus com solicitações de Recurso de Aplicativo no nível de pod na mesma especificação de pod, pois isso pode criar conflitos de programação e seleção de interface. Se um pod com várias interfaces precisar selecionar perfis de VNIC secundários específicos, defina essa seleção na configuração do NAD em vez de usar uma solicitação de Recurso de Aplicativo no nível do pod. Por exemplo, use um campo deviceSelector, como deviceSelector.appResource ou deviceSelector.interfaceName.

  • Você pode anexar várias VNICs secundárias para rede de pods:

    • Ao criar um novo pool de nós (ao criar um novo cluster ou ao expandir um cluster existente).
    • Ao atualizar um pool de nós existente.

    Em ambos os casos, o Tipo de rede do cluster deve ser Rede de pod nativo da VCN. A rede de pods com várias interfaces com o Multus também requer a versão suportada do plug-in CNI nativo da VCN do OCI para seu ambiente.

    1. Siga as instruções para criar ou atualizar um pool de nós gerenciados (consulte Criando um Pool de Nós Gerenciados ou Atualizando um Pool de Nós Gerenciados conforme apropriado).

    2. Ao especificar detalhes para o pool de nós:
      1. Opcionalmente, use Tipo de Ativação de Rede para selecionar o tipo de ativação de rede para rede de nó de trabalho. Se você não selecionar um valor, PARAVIRTUALIZED será usado como o padrão.

        Na maioria dos casos, selecione PARAVIRTUALIZED. Selecione VFIO somente quando a forma e a imagem selecionadas suportarem a rede SR-IOV assistida por hardware e sua carga de trabalho exigir isso. Selecione E1000 somente quando necessário para compatibilidade com uma imagem ou carga de trabalho que não suporte rede paravirtualizada. O suporte para cada tipo de inicialização depende da forma e da imagem de computação selecionadas.

      2. Selecione Configurar VNICs Secundárias para nós e especifique detalhes para o primeiro perfil de VNIC secundária da seguinte forma:
        • Nome para Exibição do Anexo de VNIC: Opcional. Especifique um nome para exibição do anexo de VNIC. O nome para exibição ajuda a identificar esse anexo de VNIC na configuração do pool de nós.

        • Nome para Exibição da VNIC: Opcional. Especifique um nome de exibição para a VNIC. O nome para exibição ajuda a identificar a VNIC nos recursos de Rede e Computação.

        • Índice de NIC: Opcional. Especifique a NIC física a ser usada para este anexo de VNIC. Essa opção geralmente é usada em formas bare metal quando você deseja colocar VNICs em NICs físicas específicas, por exemplo, para alinhar o tráfego da carga de trabalho com a largura de banda NIC disponível. Se você não especificar um valor, o Kubernetes Engine usará o posicionamento padrão para a forma e a configuração selecionadas.

        • Compartimento da Sub-rede da VNIC: Especifique o compartimento que contém a sub-rede dessa VNIC.

        • Sub-rede de VNIC: Especifique a sub-rede para essa VNIC. A sub-rede determina a rede, a tabela de roteamento, as regras de segurança e a família de endereços IP disponíveis para a VNIC. Para a rede de pods, escolha uma sub-rede que tenha endereços IP disponíveis suficientes para o número de IPs de pods que você deseja alocar.

        • Designar IP público à VNIC: Campo opcional. Especifique se um endereço IPv4 público deve ser designado a essa VNIC. Essa definição só se aplica à VNIC. Os endereços IP públicos não são designados aos pods, independentemente da VNIC estar em uma sub-rede pública ou privada. Na maioria dos designs de rede de pods, deixe esta opção desmarcada. Selecione-a somente se a sub-rede for pública e você tiver um requisito específico para que a própria VNIC tenha um endereço IP público. Certifique-se de que as tabelas de roteamento e as regras de segurança restrinjam o acesso adequadamente.

        • Designar endereço IPv6 à VNIC: Opcional. Especifique se um endereço IPv6 deve ser designado a esta VNIC. Essa opção só será aplicável se a sub-rede selecionada suportar IPv6.

        • Ignorar verificação de origem/destino: Opcional. Especifique se as verificações de origem/destino desta VNIC devem ser ignoradas. Ative essa opção apenas para casos de uso de roteamento, encaminhamento ou NAT em que a VNIC deva enviar ou receber tráfego que não seja endereçado a um de seus próprios endereços IP.

        • Nº de endereços IP: Especifique o número de endereços IP de pod a serem alocados para este perfil de VNIC secundário (ipCount). A combinação de ipCount em todos os perfis de VNIC secundária configurados em um nó pode ser de até 256. Dimensione esse valor com espaço livre suficiente para a densidade esperada de pods e considere a capacidade da sub-rede e os limites da VNIC de forma de computação.

        • Recursos do Aplicativo: Opcional. Selecione Adicionar recurso de aplicativo para adicionar um nome de Recurso de Aplicativo a este perfil de VNIC secundário. Use Recursos do Aplicativo quando quiser que as cargas de trabalho selecionem esse perfil de VNIC explicitamente. O Kubernetes Engine expõe os Recursos do Aplicativo como Recursos Estendidos do Kubernetes nos nós, e um pod pode solicitar um Recurso do Aplicativo para fixar o pod em um perfil selecionado. Cada pod pode solicitar apenas um Recurso de Aplicativo no modelo de agendamento no nível do pod. Se você não precisar de pods para selecionar um perfil específico, não defina Recursos do Aplicativo. Para pods de várias interfaces que usam Multus e NetworkAttachmentDefinitions (NADs), defina a seleção de interface na configuração NAD em vez de usar solicitações de Recurso de Aplicativo no nível do pod.

        • Grupo de Segurança da Rede: Opcional. Selecione Adicionar grupo de segurança de rede para associar um ou mais NSGs a esta VNIC. Use NSGs para controlar o tráfego de/para a VNIC. Aplique regras de menor privilégio para que somente o tráfego exigido pela carga de trabalho seja permitido.

        • Tags de VNIC: Opcional. Selecione Adicionar tag para adicionar uma ou mais tags de formato livre ou definidas à VNIC. Use tags para organizar, rastrear e gerenciar recursos de VNIC de acordo com sua estratégia de tag.

    3. Se quiser usar vários perfis de VNIC secundária, selecione Adicionar VNIC e informe detalhes para um ou mais perfis de VNIC secundária adicionais.
  • Você pode especificar várias VNICs secundárias para rede de pods ao criar ou atualizar pools de nós gerenciados. Por exemplo, usando o comando oci ce node-pool create, da seguinte forma (abreviado para facilitar a leitura):

    oci ce node-pool create \
      ... \
      --secondary-vnics '[
        {
          "createVnicDetails": {
            "ipCount": 16,
            "applicationResources": ["ResourceC"],
            "subnetId": "...",
            "assignPublicIp": false
          }
        },
        {
          "createVnicDetails": {
            "ipCount": 16,
            "applicationResources": ["ResourceD"],
            "subnetId": "...",
            "assignPublicIp": false
          }
        }
      ]'

    Para obter informações sobre como usar a CLI, consulte Interface de Linha de Comando (CLI). Para obter uma lista completa de flags e opções disponíveis para comandos da CLI, consulte a Referência da Linha de Comando.

  • Você pode especificar várias VNICs secundárias para rede de pods ao criar ou atualizar pools de nós gerenciados, usando as seguintes operações:

Implantando pods que usam várias VNICs secundárias

Ao anexar vários perfis de VNIC secundária a um pool de nós, você pode implantar cargas de trabalho de diferentes maneiras, dependendo de se deseja que um pod use um caminho de rede fixa único ou use várias interfaces.

Opção 1: Fixar um pod em um único perfil de VNIC secundário usando um Recurso do Aplicativo

Use essa opção quando um nó expor vários perfis de VNIC secundária selecionáveis e uma carga de trabalho precisar ser fixada exatamente em um deles.

Etapa 1: Verificar os nomes e a capacidade do Recurso Estendido em um nó

Depois que o pool de nós tiver nós de trabalho, verifique os nomes e a capacidade do Recurso Estendido em um nó.

  1. Revise os Recursos Estendidos anunciados do nó:

    kubectl describe node <node-name>
  2. Na seção Capacity da saída, identifique os Recursos Estendidos que correspondem aos Recursos do Aplicativo (por exemplo, oke-application-resource.oci.oraclecloud.com/frontend) e confirme que eles têm capacidade diferente de zero.
Etapa 2: Adicione a tolerância necessária à especificação do pod

Os nós que expõem os Recursos do Aplicativo são contaminados com oci.oraclecloud.com/application-resource-only:NoSchedule para evitar que pods sem solicitações explícitas do Recurso do Aplicativo sejam acessados por eles.

Adicione uma tolerância correspondente à especificação do pod (em spec.tolerations para um Pod ou em spec.template.spec.tolerations em uma Implantação):

tolerations:
  - key: "oci.oraclecloud.com/application-resource-only"
    operator: "Exists"
    effect: "NoSchedule"

Sem essa tolerância, o scheduler rejeitará o posicionamento mesmo que exista capacidade de recurso.

Etapa 3: Solicitar exatamente um Recurso Estendido (um Recurso de Aplicativo por pod)

Na especificação do pod, solicite o Recurso Estendido que corresponda ao perfil de VNIC secundário que o pod deve usar (por exemplo, em uma Implantação em spec.template.spec.containers[].resources). Solicite e limite exatamente uma unidade para que o scheduler reserve a capacidade de forma consistente.

Por exemplo:

containers:
  - name: myapp
    image: <image>
    resources:
      requests:
        oke-application-resource.oci.oraclecloud.com/frontend: "1"
      limits:
        oke-application-resource.oci.oraclecloud.com/frontend: "1"

Etapa 4: (Opcional) Direcionar os pools de nós corretos

Se sua organização usar uma convenção de rótulo/seletor de nó para esses nós (por exemplo, gva_vnic: "yes"), inclua-a para que os pods não sejam colocados em pools de nós que não tenham os recursos necessários:

nodeSelector:
  gva_vnic: "yes"

Um nodeSelector é opcional quando as solicitações e tolerâncias do Recurso de Aplicativo já restringem a programação. Só use um nodeSelector se você tiver rotulado os nós de destino (por exemplo, por meio de labels do Kubernetes do pool de nós).

Etapa 5: Verificar programação

Após a implantação:

  1. Informar:
    kubectl get pods -o wide
  2. Para um pod de interesse, informe:
    kubectl describe pod <pod-name>
  3. Confirme se o pod está em Execução e se não há erros de programação (por exemplo, capacidade insuficiente para o recurso solicitado).

Opção 2: Usar várias interfaces em um pod (Multus + NADs)

Use essa opção quando um pod precisar ser anexado a várias interfaces de rede. Neste modelo, o Multus anexa interfaces de pod adicionais e os NADs definem qual interface de host (e opcionalmente qual perfil de VNIC secundário) cada interface de pod deve usar.

Observação

  • Não combine anotações de rede de pods Multus com solicitações de Recurso de Aplicativo no nível do pod na mesma especificação de pod.
  • Se você precisar de seleção por interface de perfis de VNIC secundários, defina essa seleção no NAD (por exemplo, usando um deviceSelector).
Passo 1: Instalar e verificar Multus (se ainda não instalado)

Instale o Multus antes de criar NADs ou implantar pods de várias interfaces. Para obter informações sobre como instalar o Multus, consulte a documentação do Multus-CNI no GitHub.

Siga o processo padrão da sua organização para implantar o Multus e verifique se ele está íntegro:

kubectl get pod -l app=multus -n kube-system
Etapa 2: Verifique se os plug-ins CNI necessários estão presentes nos nós de trabalho

Os exemplos nesta seção usam o plug-in CNI ipvlan para a interface de pod adicional. Certifique-se de que o binário ipvlan esteja presente em /opt/cni/bin/ipvlan em cada nó de trabalho que possa executar pods com várias interfaces.

A Oracle recomenda instalar o plug-in ipvlan usando um script cloud-init do pool de nós para que o plug-in seja instalado quando os nós forem criados, substituídos ou expandidos. Fixe o plug-in a uma release validada para o ambiente de destino, em vez de seguir um caminho de download flutuante. O exemplo a seguir usa a versão v1.9.0.

Por exemplo:

#!/bin/bash

CNI_VERSION="v1.9.0"
CNI_ARCH="amd64"
CNI_TARBALL="cni-plugins-linux-${CNI_ARCH}-${CNI_VERSION}.tgz"
CNI_URL="https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/${CNI_TARBALL}"
CNI_BIN_DIR="/opt/cni/bin"

wget --fail -O "/tmp/${CNI_TARBALL}" "${CNI_URL}" && \
  tar xvzf "/tmp/${CNI_TARBALL}" -C "${CNI_BIN_DIR}" && \
  rm -f "/tmp/${CNI_TARBALL}"

curl --fail -H "Authorization: Bearer Oracle" -L0 \
  http://169.254.169.254/opc/v2/instance/metadata/oke_init_script \
  | base64 --decode > /var/run/oke-init.sh

bash /var/run/oke-init.sh

Se os nós de trabalho não puderem acessar o GitHub, prepare o arquivo compactado de plug-ins CNI necessários no OCI Object Storage ou em outro local interno aprovado e atualize o URL de download no script cloud-init.

Etapa 3: Identificar nomes de interface do host em um nó de trabalho

Os NADs devem direcionar os nomes reais da interface do host criados pelas VNICs anexadas (por exemplo, enp1s0, enp2s0). Verifique-os em um nó de trabalho usando o método de acesso padrão da sua organização.

Etapa 4: Criar NADs que selecionam interfaces específicas

Criar:

  • um NAD para a rede de pods padrão (para controlar qual interface de host faz backup de eth0)
  • um ou mais NADs para interfaces adicionais (por exemplo, net1).

Sua configuração NAD pode selecionar um dispositivo usando um deviceSelector (por exemplo, por interfaceName ou pelo nome do Recurso do Aplicativo usando appResource, se suportado em seu ambiente).

Os exemplos de NAD a seguir usam intencionalmente diferentes namespaces. oci-vcn-native-network é definido em kube-system, enquanto ipvlan-network é definido em default. Se a carga de trabalho for executada em outro namespace, crie ipvlan-network nesse namespace ou atualize a anotação de pod para fazer referência ao nome NAD totalmente qualificado.

NAD de rede padrão fixado em enp1s0:

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: oci-vcn-native-network
  namespace: kube-system
spec:
  config: |
    {
      "name": "oci",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "cniVersion": "0.3.1",
          "type": "oci-ipvlan",
          "mode": "l2",
          "ipam": {
            "type": "oci-ipam",
            "deviceSelector": {
              "interfaceName": "enp1s0"
            }
          }
        },
        {
          "cniVersion": "0.3.1",
          "type": "oci-ptp",
          "containerInterface": "ptp-veth0",
          "mtu": 9000
        }
      ]
    }

Rede secundária NAD fixada em enp2s0:

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: ipvlan-network
  namespace: default
spec:
  config: |
    {
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "ipvlan",
          "mode": "l2",
          "master": "enp2s0",
          "ipam": {
            "type": "oci-ipam",
            "deviceSelector": {
              "interfaceName": "enp2s0"
            }
          }
        }
      ]
    }

O NAD padrão usa os plug-ins oci-ipvlan e oci-ptp específicos do OCI porque essa interface participa do caminho de rede padrão nativo da VCN do OKE. O NAD adicional usa o plug-in ipvlan padrão porque o Multus está anexando uma interface extra em uma NIC de host específica, enquanto o OCI IPAM ainda fornece a alocação de IP com reconhecimento de sub-rede.

deviceSelector pode direcionar interfaces com campos como:

{
  "appResource": "blue",
  "interfaceName": "enp2s0",
  "interfaceNamePrefix": "enp",
  "macAddress": "02:00:17:08:E3:07"
}

O bloco deviceSelector permite que o OCI IPAM escolha a interface de destino ou a VNIC usada para alocação de IP de pod. Ele pode selecionar um dispositivo usando um ou mais destes campos:

  • appResource: Seleciona o perfil da VNIC GVA por nome do Recurso da Aplicação.

  • interfaceName: Seleciona uma interface de host específica, como enp1s0.

  • interfaceNamePrefix: Seleciona uma interface por prefixo, como enp.

  • macAddress: Seleciona uma interface por endereço MAC.

Quando appResource é definido no seletor de dispositivos NAD, o plug-in do OCI IPAM usa esse Recurso de Aplicativo para decidir qual perfil de VNIC GVA deve fornecer o endereço IP do pod e atuar como o dispositivo pai dessa interface. Isso permite que diferentes NADs no mesmo pod sejam mapeados para diferentes perfis de VNIC, por exemplo:

  • NAD1 -> Application Resource: vnic-a

  • NAD2 -> Application Resource: vnic-b

  • NAD3 -> Application Resource: vnic-c

Se um pod usar todos os três NADs, cada interface poderá ser anexada por meio do perfil de VNIC correspondente.

Nos exemplos de nome de interface mostrados neste documento:

  • O NAD oci-vcn-native-network usa interfaceName: enp1s0 para que o OCI IPAM aloque o IP de rede padrão do pod da interface enp1s0 do host.

  • O NAD ipvlan-network usa interfaceName: enp2s0 para que o OCI IPAM aloque o IP de interface adicional da interface enp2s0 do host.

É também por isso que os exemplos de pods são definidos:

annotations:
  v1.multus-cni.io/default-network: kube-system/oci-vcn-native-network
  k8s.v1.cni.cncf.io/networks: default/ipvlan-network

A anotação v1.multus-cni.io/default-network garante que eth0 use o NAD oci-vcn-native-network. Sem selecionar explicitamente essa rede padrão, o OCI IPAM pode alocar de qualquer interface de host elegível, o que torna a interface de pod principal menos previsível. A definição do NAD padrão garante que eth0 use a interface pretendida e a mantenha isolada do anexo de rede adicional.

Não combine essas anotações de pod Multus com solicitações de Recurso de Aplicativo no nível de pod na mesma especificação de pod. Se um pod com várias interfaces precisar da seleção de VNIC GVA, defina essa seleção dentro da configuração NAD deviceSelector.appResource para cada interface, em vez de usar uma solicitação de Recurso de Aplicativo no nível do pod.

Aplique os NADs:

kubectl apply -f oci-vcn-native-network-nad.yaml
kubectl apply -f ipvlan-network.yaml
Etapa 5: Implantar um pod com várias interfaces usando anotações do Multus

Anote o pod para selecionar o NAD de rede padrão e anexe NADs de rede adicionais, por exemplo:

metadata:
  annotations:
    v1.multus-cni.io/default-network: kube-system/oci-vcn-native-network
    k8s.v1.cni.cncf.io/networks: default/ipvlan-network
Etapa 6: Verificar várias interfaces
  1. Descreva o pod e verifique as anotações de status da rede Multus (se houver):
    kubectl describe pod <pod-name>
  2. Se permitido em seu ambiente, execute o pod e inspecione as interfaces (por exemplo, ifconfig ou ip addr) para confirmar se o pod tem as interfaces esperadas (eth0, net1, …) e endereços IP.

Opção 3: Usar perfis de VNIC secundária sem Recursos do Aplicativo

Se você anexar vários perfis de VNIC secundários a um pool de nós e não definir Recursos do Aplicativo, os pods não serão fixados em um único perfil de VNIC secundário por solicitações de recursos impostas pelo scheduler. Esta opção não requer pods para solicitar Recursos Estendidos. Os pods que exigem interfaces adicionais devem usar Multus e NetworkAttachmentDefinitions (NADs) para anexar essas interfaces.

Use esse modelo quando o objetivo for dimensionar a capacidade geral de IP do pod, em vez de fixar diferentes cargas de trabalho em diferentes perfis usando Recursos do Aplicativo. Para pods com várias interfaces, defina a seleção da interface na configuração NAD, por exemplo, usando deviceSelector.interfaceName ou deviceSelector.appResource.

Configurando kubelet max-pods em nós de trabalho

Na maioria dos casos, não é necessário configurar o kubelet max-pods manualmente para pools de nós que anexam vários perfis de VNIC secundária para rede de pods. O Kubernetes Engine define o número máximo de pods por nó com base na capacidade de IP do pod disponível no nó.

Só defina um valor max-pods personalizado se você tiver um motivo específico para limitar a densidade de pod manualmente. Ao escolher um valor, certifique-se de que ele não exceda a capacidade de IP do pod disponível no nó.

Para verificar o limite efetivo de pod no cluster, inspecione os valores reportados de capacidade/alocáveis do nó (por exemplo, kubectl describe node <node-name>) e confirme se a densidade da carga de trabalho configurada não excede a capacidade disponível de IP do pod.

Diagnóstico e Solução de Problemas

Pods presos no status Pendente

Os pods podem permanecer em um status Pendente por vários motivos. As causas e soluções comuns incluem:

  • Causa: Capacidade insuficiente.

    Ocorre quando não há IPs de pod disponíveis para o perfil de VNIC secundário selecionado ou quando há capacidade insuficiente para o Recurso de Aplicativo solicitado (se o pod estiver usando um Recurso de Aplicativo para selecionar um perfil de VNIC secundário específico).

    Solução: Amplie o pool de nós, reduza o número de pods ou (para pods com várias interfaces) reduza o número de anexos adicionais da rede de pods.

  • Causa: Tolerância ausente.

    Ocorre quando o pod não tem a tolerância necessária para a mancha oci.oraclecloud.com/application-resource-only:NoSchedule nos nós que expõem os Recursos do Aplicativo.

    Solução: Adicione a tolerância ausente.

  • Causa: nome do recurso incorreto.

    Ocorre quando o pod solicita um Recurso de Aplicativo (Recurso Estendido) que não existe nos nós de destino.

    Solução: Verifique se os nomes dos Recursos do Aplicativo correspondem à configuração do pool de nós (letra e grafia). Confirme os nomes de recursos disponíveis em um nó executando kubectl describe node <node-name> e verificando a seção Capacity.

  • Causa: A seleção do nó impede a programação.

    Ocorre quando o pod inclui uma nodeSelector ou outras restrições de posicionamento que excluem todos os nós que têm a capacidade necessária.

    Solução: Verifique se os labels de nó existem e correspondem exatamente ou remova/ajuste as restrições de seleção de nó.

Pod rejeitado no momento da criação

Se a criação do pod for rejeitada pela validação de admissão, use a mensagem de rejeição para corrigir a especificação do pod. Problemas comuns incluem a solicitação de combinações ou quantidades não suportadas de Recursos Estendidos ou a especificação de solicitações/limites que não correspondem ao padrão necessário para a configuração do cluster.

O pod de várias interfaces não obtém as interfaces esperadas

Um pod com várias interfaces pode ser criado com sucesso, mas não tem as interfaces de rede, os endereços IP ou o mapeamento de interface para sub-rede esperados. Por exemplo, o pod pode não ter uma interface net1, a interface eth0 pode não usar a rede padrão pretendida ou uma interface adicional pode receber um endereço IP de uma sub-rede diferente da esperada.

As causas comuns incluem:

  • O Multus não está em execução em kube-system.

  • O plug-in CNI necessário, como ipvlan, não está presente nos nós de trabalho.

  • O NAD faz referência a um nome de interface de host incorreto.

  • A anotação do pod faz referência ao nome ou namespace NAD incorreto.

  • A seleção da interface é dividida entre as solicitações de Recurso de Aplicativo no nível do pod e a configuração NAD.

Para resolver o problema, verifique a configuração na ordem em que o Kubernetes e o Multus a usam: configuração do pool de nós, componentes CNI necessários no nó de trabalho, configuração NAD e anotações de pod.

Confirme se o Multus está instalado e em execução e se os plug-ins CNI necessários estão presentes em cada nó de trabalho que pode executar a carga de trabalho. Verifique se os nomes e namespaces NAD correspondem às anotações do pod e se quaisquer valores deviceSelector no NAD correspondem aos nomes reais da interface do nó de trabalho ou aos nomes do Recurso do Aplicativo.

Não combine solicitações de Recursos de Aplicativos no nível do pod com anotações de rede de pods Multus na mesma especificação de pod. Se o pod precisar selecionar perfis de VNIC secundários específicos, defina essa seleção na configuração do NAD.

Após corrigir a configuração, recrie o pod e inspecione a anotação de status da rede Multus e as interfaces dentro do pod. Confirme se o pod tem as interfaces esperadas, como eth0 e net1, e se os endereços IP são alocados das sub-redes pretendidas.

Melhores práticas

Ao anexar várias VNICs secundárias para rede de pods, considere as seguintes práticas recomendadas:

  • Decida se as cargas de trabalho exigem um único caminho de rede ou várias interfaces de pod. Use Recursos do Aplicativo para fixar pods em um perfil de VNIC secundário específico quando as cargas de trabalho tiverem como destino exatamente um perfil. Use Multus e NetworkAttachmentDefinitions (NADs) quando os pods precisarem anexar várias interfaces.

  • Planeje a segmentação de rede primeiro (sub-redes/NSGs/zonas de segurança). Se você usar Recursos do Aplicativo, mapeie cada Recurso do Aplicativo para o perfil, a sub-rede e os NSGs secundários apropriados da VNIC.

  • Alocações ipCount do tamanho certo e mantenha a margem para reduzir falhas de programação. Revise a capacidade da sub-rede e molde os limites da VNIC como parte do planejamento de capacidade.

  • Use nomenclatura consistente para Recursos do Aplicativo e nomes para exibição de VNIC. Se você usar o Multus, use também a nomeação consistente para NADs e documente qual NAD seleciona qual interface de host ou perfil de VNIC.

  • Monitore a capacidade e a integridade do agendamento. Se você usar Recursos do Aplicativo, monitore a utilização de Recursos do Aplicativo e alerte sobre falhas de baixa capacidade e programação (por tipo de recurso). Se você não usar Recursos do Aplicativo, monitore o consumo geral de IP de pod e as falhas de programação de pod para o pool de nós.

  • Aplique o princípio do privilégio mínimo às regras do NSG para permitir apenas o tráfego de rede mínimo necessário para que a carga de trabalho funcione e ative Logs de Fluxo da VCN. Não combine anotações de rede de pods Multus com solicitações de Recurso de Aplicativo no nível do pod na mesma especificação de pod; se os pods de várias interfaces exigirem seleção de perfil de VNIC, defina a seleção na configuração NAD.