Attachement de plusieurs cartes VNIC secondaires pour la mise en réseau de pods

Découvrez comment attacher et configurer plusieurs cartes d'interface réseau virtuelles secondaires sur des noeuds de processus actif pour la mise en réseau de pod à l'aide de Kubernetes Engine (OKE). Vous pouvez associer un pod à un seul profil de carte d'interface réseau virtuelle secondaire à l'aide d'une ressource d'application ou associer plusieurs interfaces de pod à l'aide de Multus et de NetworkAttachmentDefinitions (NAD).

L'attachement de plusieurs cartes d'interface réseau virtuelles secondaires à des noeuds de processus actif vous permet de segmenter la mise en réseau des pods sur différents sous-réseaux et contrôles de sécurité (par exemple, pods frontaux sur une carte d'interface réseau virtuelle/un sous-réseau/un groupe de sécurité réseau secondaire et pods back-end sur un autre). Chaque profil de carte d'interface réseau virtuelle secondaire est configuré avec son propre pool d'adresses IP de pod (contrôlées par ipCount) et des paramètres réseau (tels que le sous-réseau et les groupes de sécurité réseau). Vous pouvez éventuellement associer un profil de carte d'interface réseau virtuelle secondaire à un nom de ressource d'application afin que les charges globales puissent sélectionner ce profil de manière explicite.

Si vous définissez des ressources d'application sur des profils de carte d'interface réseau virtuelle secondaires, Kubernetes Engine affiche ces ressources d'application sur chaque noeud en tant que ressources étendues Kubernetes (par exemple, oke-application-resource.oci.oraclecloud.com/<resource-name>), avec une capacité de noeud reflétant le nombre d'adresses IP de pod disponibles sur le profil de carte d'interface réseau virtuelle secondaire correspondant.

Les pods peuvent utiliser les ressources d'application de la manière suivante :

  • Un pod peut demander une unique ressource d'application (via une demande/limite de ressource étendue) lorsque vous souhaitez que ce pod sélectionne un profil/interface de carte d'interface réseau virtuelle secondaire.

  • Les noeuds qui exposent les ressources d'application sont endommagés (avec la tache oci.oraclecloud.com/application-resource-only:NoSchedule) de sorte que les pods qui ne demandent pas explicitement une ressource d'application ne planifient pas sur ces noeuds. Les pods doivent inclure une tolérance correspondante.

  • La planification doit satisfaire la ressource d'application demandée (le noeud doit avoir une capacité suffisante pour la ressource étendue demandée).

  • Si vous n'avez pas besoin d'associer le planificateur à un profil VNIC secondaire spécifique, ne définissez pas de ressource d'application sur les profils VNIC. Les pods nécessitant des interfaces supplémentaires doivent utiliser Multus et NetworkAttachmentDefinitions (NAD) pour connecter ces interfaces.

L'utilisation de plusieurs cartes d'interface réseau virtuelles secondaires pour la mise en réseau de pod est prise en charge uniquement avec le module d'extension CNI de mise en réseau de pod natif OCI VCN. Les cartes d'interface réseau virtuelles secondaires multiples pour la mise en réseau de pod ne sont pas prises en charge lors de l'utilisation du module d'extension CNI flannel pour la mise en réseau de pod. Les limites de carte d'interface réseau virtuelle de forme de calcul, la disponibilité des sous-réseaux/adresses IP et les limites de règle de groupe de sécurité réseau s'appliquent toujours.

Lorsqu'un pod demande une ressource d'application, la programmation de pod se déroule comme suit :

  1. Vous créez un pod qui demande une seule ressource d'application (facultatif : uniquement si vous souhaitez que le pod soit épinglé à un profil de carte d'interface réseau virtuelle secondaire sélectionnable).

  2. La validation de l'admission vérifie la spécification du pod, notamment si la ressource d'application demandée et la quantité demandée sont valides.

  3. Le planificateur Kubernetes sélectionne un noeud ayant une capacité pour la ressource d'application demandée et les adresses IP disponibles sur le profil de carte d'interface réseau virtuelle secondaire correspondant.

  4. Le module d'extension CNI de mise en réseau de pod natif OCI VCN affecte une adresse IP au pod à partir du profil de carte d'interface réseau virtuelle secondaire sélectionné.

  5. Le pod utilise le profil/l'interface sélectionné comme chemin réseau principal dans ce modèle de planification.

Avant d'attacher plusieurs cartes d'interface réseau virtuelles secondaires pour la mise en réseau de pod, assurez-vous que :

  • Le cluster utilise le réseau de pod natif VCN.

  • Le VCN, les sous-réseaux et les groupes de sécurité réseau sont planifiés pour la segmentation souhaitée (car chaque profil de carte d'interface réseau virtuelle secondaire peut pointer vers un sous-réseau et une stratégie de sécurité différents).

  • La forme de calcul utilisée pour les noeuds de processus actif prend en charge le nombre requis d'attachements de carte d'interface réseau virtuelle et la densité de pod attendue.

  • Si vous avez besoin de pods multi-interface, vérifiez que Multus est déployé et que les modules d'extension CNI requis sont présents sur les noeuds de processus actifs, et confirmez la version de module d'extension CNI natif OCI VCN requise pour la prise en charge multi-interface dans votre environnement.

Remarque

Ne combinez pas les annotations réseau de pod Multus avec les demandes de ressource d'application de niveau pod dans la même spécification de pod, car cela peut créer des conflits de planification et de sélection d'interface. Si un pod multi-interface doit sélectionner des profils VNIC secondaires spécifiques, définissez cette sélection dans la configuration NAD au lieu d'utiliser une demande de ressource d'application de niveau pod. Par exemple, utilisez un champ deviceSelector tel que deviceSelector.appResource ou deviceSelector.interfaceName.

  • Vous pouvez attacher plusieurs cartes d'interface réseau virtuelles secondaires pour la mise en réseau de pod :

    • Lors de la création d'un pool de noeuds (soit lors de la création d'un cluster, soit lors du redimensionnement d'un cluster existant).
    • Lors de la mise à jour d'un pool de noeuds existant.

    Dans les deux cas, le type de réseau du cluster doit être réseau de pod natif VCN. La mise en réseau de pods multi-interface avec Multus nécessite également la version de module d'extension CNI natif OCI VCN prise en charge pour votre environnement.

    1. Suivez les instructions de création ou de mise à jour d'un pool de noeuds gérés (reportez-vous à Création d'un pool de noeuds gérés ou à Mise à jour d'un pool de noeuds gérés, le cas échéant).

    2. Lors de la spécification des détails du pool de noeuds :
      1. Vous pouvez éventuellement utiliser Type de lancement réseau pour sélectionner le type de lancement réseau pour la mise en réseau des noeuds de processus actif. Si vous ne sélectionnez aucune valeur, PARAVIRTUALIZED est utilisé par défaut.

        Dans la plupart des cas, sélectionnez PARAVIRTUALIZED. Sélectionnez VFIO uniquement lorsque la forme et l'image sélectionnées prennent en charge la mise en réseau SR-IOV assistée par le matériel et que votre charge globale l'exige. Sélectionnez E1000 uniquement lorsque la compatibilité avec une image ou une charge globale ne prend pas en charge la mise en réseau paravirtualisée est requise. La prise en charge de chaque type de lancement dépend de la forme et de l'image de calcul sélectionnées.

      2. Sélectionnez Configurer les cartes d'interface réseau virtuelles secondaires pour les noeuds et indiquez les détails du premier profil de carte d'interface réseau virtuelle secondaire comme suit :
        • Nom d'affichage de l'attachement de carte d'interface réseau virtuelle : facultatif. Indiquez un nom d'affichage pour l'attachement de carte d'interface réseau virtuelle. Le nom d'affichage vous aide à identifier cet attachement de carte d'interface réseau virtuelle dans la configuration du pool de noeuds.

        • Nom d'affichage de carte d'interface réseau virtuelle : facultatif. Spécifiez un nom d'affichage pour la carte d'interface réseau virtuelle. Le nom d'affichage vous aide à identifier la carte d'interface réseau virtuelle dans les ressources Networking et Compute.

        • Index de carte d'interface réseau : facultatif. Indiquez la carte d'interface réseau physique à utiliser pour cet attachement de carte d'interface réseau virtuelle. Cette option est généralement utilisée sur les formes Bare Metal lorsque vous souhaitez placer des cartes d'interface réseau virtuelles sur des cartes d'interface réseau physiques spécifiques, par exemple pour aligner le trafic de charge de travail sur la bande passante de carte d'interface réseau disponible. Si vous n'indiquez aucune valeur, Kubernetes Engine utilise le placement par défaut pour la forme et la configuration sélectionnées.

        • Compartiment de sous-réseau de carte d'interface réseau virtuelle : indiquez le compartiment qui contient le sous-réseau de cette carte d'interface réseau virtuelle.

        • Sous-réseau de carte d'interface réseau virtuelle : indiquez le sous-réseau de cette carte d'interface réseau virtuelle. Le sous-réseau détermine le réseau, la table de routage, les règles de sécurité et la famille d'adresses IP disponibles pour la carte d'interface réseau virtuelle. Pour les fonctions de réseau de pod, choisissez un sous-réseau disposant de suffisamment d'adresses IP disponibles pour le nombre d'adresses IP de pod à allouer.

        • Affecter une adresse IP publique à la carte d'interface réseau virtuelle : facultatif. Indiquez si une adresse IPv4 publique doit être affectée à cette carte d'interface réseau virtuelle. Ce paramètre s'applique uniquement à la carte d'interface réseau virtuelle. Les adresses IP publiques ne sont pas affectées aux pods, que la carte d'interface réseau virtuelle se trouve dans un sous-réseau public ou privé. Dans la plupart des conceptions de réseau de pod, laissez cette option désélectionnée. Sélectionnez-la uniquement si le sous-réseau est public et que vous avez une exigence spécifique pour que la VNIC elle-même dispose d'une adresse IP publique. Assurez-vous que les tables de routage et les règles de sécurité limitent l'accès de manière appropriée.

        • Affecter une adresse IPv6 à la carte d'interface réseau virtuelle : facultatif. Indiquez si une adresse IPv6 doit être affectée à cette carte d'interface réseau virtuelle. Cette option est applicable uniquement si le sous-réseau sélectionné prend en charge IPv6.

        • Ignorer la vérification d'origine/de destination : facultatif. Indiquez si les vérifications source/de destination doivent être ignorées pour cette carte d'interface réseau virtuelle. Activez cette option uniquement pour les cas d'utilisation de routage, de transfert ou NAT où la carte d'interface réseau virtuelle doit envoyer ou recevoir du trafic qui n'est pas adressé à l'une de ses propres adresses IP.

        • Nombre d'adresses IP : indiquez le nombre d'adresses IP de pod à allouer pour ce profil de carte d'interface réseau virtuelle secondaire (ipCount). La combinaison de ipCount sur tous les profils de carte d'interface réseau virtuelle secondaires configurés sur un noeud peut atteindre 256. Augmentez la taille de cette valeur avec suffisamment de marge pour la densité de pod attendue, et tenez compte de la capacité du sous-réseau et des limites de forme de calcul des cartes d'interface réseau virtuelles.

        • Ressources d'application : facultatif. Sélectionnez Ajouter une ressource d'application pour ajouter un nom de ressource d'application à ce profil de carte d'interface réseau virtuelle secondaire. Utilisez les ressources d'application lorsque vous souhaitez que les charges globales sélectionnent explicitement ce profil de carte d'interface réseau virtuelle. Kubernetes Engine expose les ressources d'application en tant que ressources étendues Kubernetes sur les noeuds, et un pod peut demander à une ressource d'application d'épingler le pod à un profil sélectionné. Chaque pod ne peut demander qu'une seule ressource d'application dans le modèle de programmation de niveau pod. Si vous n'avez pas besoin de pods pour sélectionner un profil spécifique, ne définissez pas de ressources d'application. Pour les pods multi-interface qui utilisent Multus et NetworkAttachmentDefinitions (NAD), définissez la sélection d'interface dans la configuration NAD au lieu d'utiliser des demandes de ressource d'application au niveau du pod.

        • Groupe de Sécurité réseau : facultatif. Sélectionnez Ajouter un groupe de sécurité réseau pour associer des groupes de sécurité réseau à cette carte d'interface réseau virtuelle. Utilisez des groupes de sécurité réseau pour contrôler le trafic vers et depuis la carte d'interface réseau virtuelle. Appliquez les règles de privilège minimal afin que seul le trafic requis par la charge globale soit autorisé.

        • Balises de carte d'interface réseau virtuelle : facultatif. Sélectionnez Ajouter une balise pour ajouter des balises à format libre ou des balises définies à la carte d'interface réseau virtuelle. Utilisez des balises pour organiser, suivre et gérer les ressources de carte d'interface réseau virtuelle en fonction de votre stratégie de balisage.

    3. Si vous souhaitez utiliser plusieurs profils de carte d'interface réseau virtuelle secondaires, sélectionnez Ajouter une carte d'interface réseau virtuelle et entrez les détails relatifs à des profils de carte d'interface réseau virtuelle secondaires supplémentaires.
  • Vous pouvez indiquer plusieurs cartes d'interface réseau virtuelles secondaires pour la mise en réseau de pod lors de la création ou de la mise à jour de pools de noeuds gérés. Par exemple, à l'aide de la commande oci ce node-pool create, comme suit (abrégé pour plus de lisibilité) :

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

    Pour obtenir des informations sur l'utilisation de l'interface de ligne de commande, reportez-vous à Interface de ligne de commande (CLI). Afin d'obtenir la liste complète des indicateurs et des options disponibles pour les commandes de l'interface de ligne de commande, reportez-vous à Référence de ligne de commande.

  • Vous pouvez indiquer plusieurs cartes d'interface réseau virtuelles secondaires pour la mise en réseau de pod lors de la création ou de la mise à jour de pools de noeuds gérés, à l'aide des opérations suivantes :

Déploiement de pods qui utilisent plusieurs cartes d'interface réseau virtuelles secondaires

Lorsque vous attachez plusieurs profils de carte d'interface réseau virtuelle secondaires à un pool de noeuds, vous pouvez déployer les charges globales de différentes manières selon que vous souhaitez qu'un pod utilise un chemin réseau épinglé unique ou plusieurs interfaces.

Option 1 : épinglage d'un pod sur un profil de carte d'interface réseau virtuelle secondaire unique à l'aide d'une ressource d'application

Utilisez cette option lorsqu'un noeud expose plusieurs profils VNIC secondaires sélectionnables et qu'une charge globale doit être associée à un seul d'entre eux.

Etape 1 : vérification des noms et de la capacité des ressources étendues sur un noeud

Une fois que le pool de noeuds comporte des noeuds de processus actif, vérifiez les noms et la capacité des ressources étendues sur un noeud.

  1. Consultez les ressources étendues annoncées du noeud :

    kubectl describe node <node-name>
  2. Dans la section Capacity de la sortie, identifiez les ressources étendues qui correspondent aux ressources d'application (par exemple, oke-application-resource.oci.oraclecloud.com/frontend) et confirmez qu'elles ont une capacité différente de zéro.
Étape 2 : Ajouter la tolérance requise à la spécification de pod

Les noeuds qui exposent les ressources d'application sont endommagés par oci.oraclecloud.com/application-resource-only:NoSchedule afin d'empêcher les pods qui n'ont pas de demandes de ressources d'application explicites de se poser dessus.

Ajoutez une tolérance correspondante à la spécification de pod (sur spec.tolerations pour un pod ou sur spec.template.spec.tolerations dans un déploiement) :

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

Sans cette tolérance, le planificateur rejettera le placement même s'il existe une capacité de ressource.

Etape 3 : demande d'une seule ressource étendue (une ressource d'application par pod)

Dans la spécification de pod, demandez la ressource étendue qui correspond au profil de carte d'interface réseau virtuelle secondaire que le pod doit utiliser (par exemple, dans un déploiement sur spec.template.spec.containers[].resources). Demandez et limitez exactement une unité afin que le planificateur réserve la capacité de manière cohérente.

Par exemple :

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

Etape 4 : (facultatif) ciblez les pools de noeuds corrects

Si votre organisation utilise une convention de libellé/sélecteur de noeud pour ces noeuds (par exemple, gva_vnic: "yes"), incluez-la afin que les pods n'atterrissent pas sur des pools de noeuds qui ne disposent pas des ressources requises :

nodeSelector:
  gva_vnic: "yes"

Un sélecteur de noeud est facultatif lorsque les demandes et les tolérances de ressource d'application limitent déjà la planification. N'utilisez un sélecteur de noeud que si vous avez étiqueté les noeuds cible (par exemple via des libellés Kubernetes de pool de noeuds).

Etape 5 : vérification de la planification

Après le déploiement :

  1. Entrez :
    kubectl get pods -o wide
  2. Pour un pod qui vous intéresse, entrez :
    kubectl describe pod <pod-name>
  3. Vérifiez que le pod est en cours d'exécution et qu'il n'y a aucune erreur de planification (par exemple, capacité insuffisante pour la ressource demandée).

Option 2 : utilisation de plusieurs interfaces dans un pod (Multus + NAD)

Utilisez cette option lorsqu'un pod doit se connecter à plusieurs interfaces réseau. Dans ce modèle, Multus attache des interfaces de pod supplémentaires et les NAD définissent l'interface hôte (et éventuellement le profil de carte d'interface réseau virtuelle secondaire) que chaque interface de pod doit utiliser.

Remarque

  • Ne combinez pas les annotations réseau de pod Multus avec les demandes de ressource d'application de niveau pod dans la même spécification de pod.
  • Si vous avez besoin d'une sélection par interface de profils de carte d'interface réseau virtuelle secondaires, définissez cette sélection dans le NAD (par exemple, en utilisant un deviceSelector).
Étape 1 : Installez et vérifiez Multus (si ce n'est déjà fait)

Installez Multus avant de créer des NAD ou de déployer des pods multi-interface. Pour plus d'informations sur l'installation de Multus, reportez-vous à la documentation Multus-CNI sur GitHub.

Suivez le processus standard de votre organisation pour le déploiement de Multus, puis vérifiez qu'il est sain :

kubectl get pod -l app=multus -n kube-system
Etape 2 : s'assurer que les modules d'extension CNI requis sont présents sur les noeuds de processus actif

Les exemples de cette section utilisent le module d'extension CNI ipvlan pour l'interface de pod supplémentaire. Assurez-vous que le binaire ipvlan est présent dans /opt/cni/bin/ipvlan sur chaque noeud de processus actif pouvant exécuter des pods multi-interface.

Oracle recommande d'installer le module d'extension ipvlan à l'aide d'un script cloud-init de pool de noeuds afin qu'il soit installé lors de la création, du remplacement ou de la mise à l'échelle des noeuds. Épinglez le module d'extension à une version validée pour l'environnement cible plutôt que de suivre un chemin de téléchargement flottant. L'exemple suivant utilise la version v1.9.0.

Par exemple :

#!/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

Si les noeuds de processus actif ne peuvent pas accéder à GitHub, préparez l'archive de modules d'extension CNI requise dans OCI Object Storage ou dans un autre emplacement interne approuvé, et mettez à jour l'URL de téléchargement dans le script cloud-init.

Etape 3 : Identifier les noms d'interface hôte sur un noeud de processus actif

Les NAD doivent cibler les noms d'interface hôte réels créés par les cartes d'interface réseau virtuelles attachées (par exemple, enp1s0, enp2s0). Vérifiez-les sur un noeud de processus actif à l'aide de la méthode d'accès standard de votre organisation.

Etape 4 : Créer des NAD qui sélectionnent des interfaces spécifiques

Créer :

  • un NAD pour le réseau de pod par défaut (pour contrôler l'interface hôte qui sauvegarde eth0)
  • un ou plusieurs NAD pour des interfaces supplémentaires (par exemple, net1).

Votre configuration NAD peut sélectionner un périphérique à l'aide d'une valeur deviceSelector (par exemple, par interfaceName ou par nom de ressource d'application à l'aide de la valeur appResource si elle est prise en charge dans votre environnement).

Les exemples de NAD suivants utilisent intentionnellement différents espaces de noms. oci-vcn-native-network est défini dans kube-system, tandis que ipvlan-network est défini dans default. Si la charge globale est exécutée dans un autre espace de noms, créez ipvlan-network dans cet espace de noms ou mettez à jour l'annotation de pod pour référencer le nom NAD qualifié complet.

NAD réseau par défaut épinglé sur 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
        }
      ]
    }

NAD du réseau secondaire épinglé à 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"
            }
          }
        }
      ]
    }

Le NAD par défaut utilise les modules d'extension oci-ipvlan et oci-ptp propres à OCI car cette interface participe au chemin de réseau par défaut natif OKE VCN. Le NAD supplémentaire utilise le module d'extension ipvlan standard car Multus attache une interface supplémentaire à une carte d'interface réseau hôte spécifique, tandis qu'OCI IPAM fournit toujours l'allocation d'adresses IP prenant en charge les sous-réseaux.

deviceSelector peut cibler des interfaces avec des champs tels que :

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

Le bloc deviceSelector permet à OCI IPAM de choisir l'interface cible ou la carte d'interface réseau virtuelle utilisée pour l'allocation d'adresses IP de pod. Il peut sélectionner un périphérique en utilisant un ou plusieurs des champs suivants :

  • appResource : sélectionne le profil de carte d'interface réseau virtuelle GVA par nom de ressource d'application.

  • interfaceName : sélectionne une interface hôte spécifique, telle que enp1s0.

  • interfaceNamePrefix : sélectionne une interface par préfixe, tel que enp.

  • macAddress : sélectionne une interface par adresse MAC.

Lorsque appResource est défini dans le sélecteur de périphérique NAD, le module d'extension IPAM OCI utilise cette ressource d'application pour décider quel profil de carte d'interface réseau virtuelle GVA doit fournir l'adresse IP du pod et agir en tant que périphérique parent pour cette interface. Ainsi, différents NAD du même pod peuvent être mis en correspondance avec différents profils VNIC, par exemple :

  • NAD1 -> Application Resource: vnic-a

  • NAD2 -> Application Resource: vnic-b

  • NAD3 -> Application Resource: vnic-c

Si un pod utilise les trois NAD, chaque interface peut être attachée via le profil VNIC correspondant.

Dans les exemples de nom d'interface présentés dans ce document :

  • Le NAD oci-vcn-native-network utilise interfaceName: enp1s0 afin qu'OCI IPAM alloue l'adresse IP de réseau par défaut du pod à partir de l'interface enp1s0 de l'hôte.

  • Le NAD ipvlan-network utilise interfaceName: enp2s0 afin qu'OCI IPAM alloue l'adresse IP d'interface supplémentaire à partir de l'interface enp2s0 de l'hôte.

C'est également la raison pour laquelle l'exemple de pod est défini :

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

L'annotation v1.multus-cni.io/default-network garantit que eth0 utilise le NAD oci-vcn-native-network. Sans sélectionner explicitement ce réseau par défaut, OCI IPAM peut effectuer une allocation à partir de n'importe quelle interface hôte éligible, ce qui rend l'interface de pod principal moins prévisible. La définition du NAD par défaut garantit que eth0 utilise l'interface prévue et la maintient isolée de l'attachement réseau supplémentaire.

Ne combinez pas ces annotations de pod Multus avec des demandes de ressource d'application de niveau pod dans la même spécification de pod. Si un pod multi-interface a besoin d'une sélection de carte d'interface réseau virtuelle GVA, définissez cette sélection dans la configuration NAD deviceSelector.appResource pour chaque interface au lieu d'utiliser une demande de ressource d'application au niveau du pod.

Appliquez les NAD :

kubectl apply -f oci-vcn-native-network-nad.yaml
kubectl apply -f ipvlan-network.yaml
Etape 5 : Déployer un pod multi-interface à l'aide d'annotations Multus

Annotez le pod pour sélectionner le NAD réseau par défaut et connectez des NAD réseau supplémentaires, par exemple :

metadata:
  annotations:
    v1.multus-cni.io/default-network: kube-system/oci-vcn-native-network
    k8s.v1.cni.cncf.io/networks: default/ipvlan-network
Etape 6 : vérification de plusieurs interfaces
  1. Décrivez le pod et vérifiez les annotations de statut réseau Multus (le cas échéant) :
    kubectl describe pod <pod-name>
  2. Si cela est autorisé dans votre environnement, exécutez-le dans le pod et examinez les interfaces (par exemple, ifconfig ou ip addr) pour vérifier que le pod dispose des interfaces attendues (eth0, net1, …) et des adresses IP.

Option 3 : utilisation de profils VNIC secondaires sans ressources d'application

Si vous attachez plusieurs profils de carte d'interface réseau virtuelle secondaires à un pool de noeuds et que vous ne définissez pas de ressources d'application, les pods ne sont pas épinglés à un seul profil de carte d'interface réseau virtuelle secondaire par des demandes de ressource imposées par le planificateur. Cette option ne nécessite pas de pods pour demander des ressources étendues. Les pods nécessitant des interfaces supplémentaires doivent utiliser Multus et NetworkAttachmentDefinitions (NAD) pour connecter ces interfaces.

Utilisez ce modèle lorsque l'objectif est de dimensionner la capacité IP globale du pod, plutôt que d'épingler différentes charges globales à différents profils à l'aide des ressources d'application. Pour les pods multi-interface, définissez la sélection d'interface dans la configuration NAD, par exemple en utilisant deviceSelector.interfaceName ou deviceSelector.appResource.

Configurer des pods max kubelet sur des noeuds de processus actif

Dans la plupart des cas, vous n'avez pas besoin de configurer manuellement le kubelet max-pods pour les pools de noeuds qui attachent plusieurs profils VNIC secondaires pour la mise en réseau de pods. Kubernetes Engine définit le nombre maximal de pods par noeud en fonction de la capacité IP de pod disponible sur le noeud.

Définissez une valeur max-pods personnalisée uniquement si vous avez une raison spécifique de limiter manuellement la densité de pod. Lorsque vous choisissez une valeur, assurez-vous qu'elle ne dépasse pas la capacité IP du pod disponible sur le noeud.

Pour vérifier la limite de pod effective dans le cluster, examinez la capacité/les valeurs allouables signalées par le noeud (par exemple, kubectl describe node <node-name>) et vérifiez que la densité de charge globale configurée ne dépasse pas la capacité IP de pod disponible.

Résoudre les problèmes

Pods bloqués au statut En attente

Les pods peuvent rester au statut En attente pour plusieurs raisons. Les causes et solutions courantes sont les suivantes :

  • Cause : capacité insuffisante.

    Se produit lorsqu'aucune adresse IP de pod n'est disponible pour le profil de carte d'interface réseau virtuelle secondaire sélectionné ou lorsque la capacité de la ressource d'application demandée est insuffisante (si le pod utilise une ressource d'application pour sélectionner un profil de carte d'interface réseau virtuelle secondaire spécifique).

    Solution : augmentez le pool de noeuds, réduisez le nombre de pods ou (pour les pods multi-interface) réduisez le nombre d'attachements réseau de pods supplémentaires.

  • Cause : tolérance manquante.

    Se produit lorsque le pod n'a pas la tolérance requise pour la tache oci.oraclecloud.com/application-resource-only:NoSchedule sur les noeuds qui exposent les ressources d'application.

    Solution : ajoutez la tolérance manquante.

  • Cause : nom de ressource incorrect.

    Se produit lorsque le pod demande une ressource d'application (ressource étendue) qui n'existe pas sur les noeuds cible.

    Solution : vérifiez que les noms de ressource d'application correspondent à la configuration du pool de noeuds (cas et orthographe). Vérifiez les noms de ressource disponibles sur un noeud en exécutant kubectl describe node <node-name> et en vérifiant la section Capacity.

  • Cause : la sélection de noeud empêche la planification.

    Se produit lorsque le pod inclut une contrainte de placement nodeSelector ou autre qui exclut tous les noeuds ayant la capacité requise.

    Solution : vérifiez que les libellés de noeud existent et correspondent exactement, ou supprimez/ajustez les contraintes de sélection de noeud.

Pod rejeté lors de la création

Si la création de pod est rejetée par la validation de l'admission, utilisez le message de rejet pour corriger la spécification de pod. Les problèmes courants incluent la demande de combinaisons ou de quantités de ressources étendues non prises en charge ou la spécification de demandes/limites qui ne correspondent pas au modèle requis pour la configuration du cluster.

Le pod multi-interface n'obtient pas les interfaces attendues

Un pod multi-interface peut être créé avec succès mais ne pas avoir les interfaces réseau, adresses IP ou mappage interface-sous-réseau attendus. Par exemple, le pod peut ne pas disposer d'une interface net1, l'interface eth0 peut ne pas utiliser le réseau par défaut prévu ou une interface supplémentaire peut recevoir une adresse IP d'un sous-réseau différent de celui attendu.

Les causes courantes sont les suivantes :

  • Multus n'est pas en cours d'exécution dans kube-system.

  • Le module d'extension CNI requis, tel que ipvlan, n'est pas présent sur les noeuds de processus actif.

  • Le NAD référence un nom d'interface hôte incorrect.

  • L'annotation de pod référence un nom ou un espace de noms NAD incorrect.

  • La sélection de l'interface est répartie entre les demandes de ressource d'application de niveau pod et la configuration NAD.

Pour résoudre le problème, vérifiez la configuration dans l'ordre dans lequel Kubernetes et Multus l'utilisent : configuration de pool de noeuds, composants CNI requis sur le noeud de processus actif, configuration NAD et annotations de pod.

Vérifiez que Multus est installé et en cours d'exécution, et que les modules d'extension CNI requis sont présents sur chaque noeud de processus actif pouvant exécuter la charge globale. Vérifiez que les noms et les espaces de noms NAD correspondent aux annotations du pod et que toutes les valeurs deviceSelector du NAD correspondent aux noms réels d'interface de noeud de processus actif ou de ressource d'application.

Ne combinez pas les demandes de ressource d'application de niveau pod avec les annotations de réseau de pod Multus dans la même spécification de pod. Si le pod doit sélectionner des profils VNIC secondaires spécifiques, définissez plutôt cette sélection dans la configuration NAD.

Après avoir corrigé la configuration, recréez le pod et examinez l'annotation de statut réseau Multus et les interfaces à l'intérieur du pod. Vérifiez que le pod dispose des interfaces attendues, telles que eth0 et net1, et que les adresses IP sont allouées à partir des sous-réseaux prévus.

Bonnes pratiques

Lorsque vous attachez plusieurs cartes d'interface réseau virtuelles secondaires pour la mise en réseau de pod, tenez compte des meilleures pratiques suivantes :

  • Déterminez si les charges de travail nécessitent un seul chemin réseau ou plusieurs interfaces de pod. Utilisez les ressources d'application pour épingler des pods à un profil de carte d'interface réseau virtuelle secondaire spécifique lorsque les charges globales doivent cibler un seul profil. Utilisez Multus et NetworkAttachmentDefinitions (NAD) lorsque les pods doivent connecter plusieurs interfaces.

  • Planifiez d'abord la segmentation du réseau (sous-réseaux/NSG/zones de sécurité). Si vous utilisez des ressources d'application, mettez en correspondance chaque ressource d'application avec le profil de carte d'interface réseau virtuelle secondaire, le sous-réseau et les groupes de sécurité réseau appropriés.

  • Réajustez les allocations ipCount et gardez la marge nécessaire pour réduire les échecs de planification. Passez en revue les limites de capacité et de forme de sous-réseau des cartes d'interface réseau virtuelles dans le cadre de la planification de la capacité.

  • Utilisez des noms cohérents pour les ressources d'application et les noms d'affichage de carte d'interface réseau virtuelle. Si vous utilisez Multus, utilisez également des noms cohérents pour les NAD et documentez le NAD qui sélectionne l'interface hôte ou le profil de carte d'interface réseau virtuelle.

  • Surveillez la capacité et l'état de la planification. Si vous utilisez des ressources d'application, surveillez l'utilisation des ressources d'application et signalez les pannes de planification et de faible capacité (par type de ressource). Si vous n'utilisez pas les ressources d'application, surveillez l'utilisation globale des adresses IP de pod et les échecs de programmation de pod pour le pool de noeuds.

  • Appliquer le principe du moindre privilège aux règles de groupe de sécurité réseau pour autoriser uniquement le trafic réseau minimal requis pour le fonctionnement de la charge globale et activer les journaux de flux VCN. Ne combinez pas les annotations réseau de pod Multus avec les demandes de ressource d'application de niveau pod dans la même spécification de pod ; si les pods multi-interface nécessitent une sélection de profil VNIC, définissez la sélection dans la configuration NAD.