Ceci est une transcription d'un discours prononcé à Yandex NextHop 2020 - vidéo en fin de page
Salutations. Je m'appelle Alexander Zubkov, je veux vous parler de Linux Switchdev - de quoi il s'agit et comment nous vivons avec lui dans Qrator Labs.
Nous utilisons Switchdev sur les commutateurs Mellanox depuis environ 2-3 ans maintenant. Les commutateurs Mellanox Spectrum sont classés dans la catégorie «boîte blanche», ce qui signifie que vous pouvez placer différents systèmes d'exploitation sur ces commutateurs. Habituellement, le fournisseur fournit un SDK pour cela et les systèmes d'exploitation utilisent ce SDK afin d'interagir avec le commutateur. Et dans le cas des commutateurs Mellanox, il y a un système d'exploitation de Mellanox lui-même, il y a Cumulus. SAI (Switch Abstraction Interface) est également pris en charge - il s'agit d'une tentative de création d'un SDK standard pour différents commutateurs, qui est déjà utilisé, à son tour, par le système d'exploitation SONiC. Et bien sûr, Switchdev est pris en charge par les commutateurs Mellanox.
Switchdev est une telle infrastructure dans le noyau Linux qui vous permet de créer un mappage des paramètres réseau habituels du noyau lui-même vers le datapane, vers le matériel de votre commutateur - cela s'appelle le déchargement. L'image montre que le rose est le pilote du commutateur et le bleu l'API et les utilitaires de configuration de l'espace utilisateur. Switchdev joue ici le rôle d'intermédiaire: pour l'espace utilisateur, il représente le modèle de commutateur, pour le pilote il fournit l'infrastructure pour organiser cet affichage.
Nous utilisons un ensemble de fonctions assez standard sur les commutateurs Mellanox: routage, ECMP, en général, rien d'inhabituel. Tout cela est pris en charge avec la possibilité de se décharger sur la ligne de données. La seule chose qui manque est le routage basé sur des règles - il n'y a pas de support dans le pilote Mellanox.
Le pilote Mellanox réside dans un noyau Linux vanille avec prise en charge de Switchdev - aucun correctif ou pilote binaire supplémentaire n'est nécessaire. Vous pouvez pratiquement prendre le noyau de votre distribution préférée ou compiler vous-même le noyau vanilla et l'utiliser. Le micrologiciel du commutateur est mis à jour par le pilote lui-même - il vous suffit d'insérer le fichier correspondant, qui est généralement contenu dans le package du micrologiciel linux ou quelque chose de similaire.
Pour configurer le commutateur lui-même, bien sûr, les utilitaires Linux standard sont utilisés en grande quantité. Un ensemble de iproute2, ethtool, LLDP-daemon pour QoS est également utilisé. Et sysctl pour certaines options.
Pour vrf sous Linux, il existe deux espaces de noms réseau. Mais il existe aussi un soi-disant sous-système vrf - il diffère des espaces de noms réseau. Dans ce cas, toutes vos interfaces sont dans le même espace de noms - lorsque vous travaillez avec vrf. Et afin de contrôler le routage, il existe une règle spéciale dans la règle ip, qui détermine à quelle vrf le paquet appartient et, conformément à cela, le dirige vers une table de routage spécifique. Pour configurer ceci - vrf sous Linux - une interface spéciale de type vrf est créée et cette table lui est liée lors de la création. Et de plus, si vous souhaitez ajouter une interface à votre vrf, en utilisant la commande ip link, vous définissez ce périphérique spécial comme interface principale pour votre interface.Et comme toutes ces interfaces sont dans le même espace de noms, vous pouvez spécifier explicitement une interface d'une autre vrf vers la route et ainsi faire des routes entre les interfaces.
Par exemple, nous avons une tâche dans laquelle le routage basé sur des politiques aiderait - nous recevons le trafic de la liaison montante et voulons le diriger entièrement et sans condition vers certains nœuds de filtrage. Dans Cisco ou Arista, nous ferions des cartes d'itinéraire de politique ou une politique de service, sous Linux et ip rule, vous pouvez le faire - mais sous Linux, tout cela, malheureusement, ne sera pas déchargé.
Et nous devons faire demi-tour. Par exemple, nous avons créé une telle fonctionnalité - nous avons divisé le vrf en deux parties, c'est-à-dire en une partie - dans la partie externe, il y a une interface avec notre liaison montante, et dans la partie interne, il y a des interfaces avec nos nœuds de filtrage.
Et voici à quoi ressemble le routage. Dans le vrf interne, nous avons un ensemble de routes plus ou moins standard, c'est-à-dire que nous avons des routes internes et une route par défaut via notre liaison montante. Et déjà dans l'interface externe, nous n'avons qu'une route par défaut, mais elle passe par nos nœuds de filtrage. Ainsi, nous avons un pseudo routage basé sur des politiques pour les interfaces. Tout le trafic qui passe par l'interface de liaison montante est acheminé le long d'une route différente.
Et en général, lorsque vous configurez un commutateur sur Switchdev, vous devez généralement configurer d'abord les ports, puis la liaison, puis vous connecter au pont, puis aux vlans, aux vrfs et à la fin de l'adresse et des routes. Ceci est principalement dicté par la structure même des interfaces sous Linux - comment vous devez tout configurer, eh bien, il y a d'autres restrictions qui ne vous permettent pas de modifier arbitrairement les paramètres. C'est-à-dire que c'est un travail plutôt morne, qui dans notre entreprise a été initialement effectué par un grand script d'initialisation qui a configuré tout cela. Mais, bien sûr, nous devons parfois apporter des modifications à l'exécution, en production.
C'est parfois pénible, car il faut trier cette structure presque à la main - démonter certaines interfaces, les remonter, et tout cela est bien sûr semé d'erreurs. Lorsque vous travaillez chez Cisco, vous modifiez les paramètres et le shell s'occupe de tout, puis une sorte de travail de bas niveau est en cours.
Eh bien, merci pour le fait que nous ayons Perl - nous avons écrit un script mlxrtr qui prend une telle configuration et génère des jeux de commandes pour configurer le réseau et tout le reste. Et il prend également en charge les modifications - si vous apportez des modifications et qu'il lira votre configuration actuelle sous Linux et verra ce qui doit être fait pour l'amener à l'état souhaité.
Au départ, si vous exécutez cette configuration, cela générera un tel ensemble de commandes pour vous, et j'ai également jeté les mêmes.
Il y a pas mal de commandes, mais en général, si vous l'avez dans votre init-script, alors il peut être plus ou moins supporté.
Par exemple, si vous devez basculer d'un port à une autre liaison, vous devez déconnecter ce port de l'ancienne liaison, déconnecter la nouvelle liaison du pont, puis connecter le port à cette liaison, puis renvoyer la liaison au pont, reconfigurer les vlans dessus - en en général, un travail assez morne et il est désagréable de le faire avec vos mains, bien sûr. Le script fait tout cela par lui-même.
Plus loin. ACL est configurable ... vous pouvez utiliser iptables, mais il ne sera pas déchargé - vous ne pouvez l'utiliser que pour filtrer le trafic du plan de contrôle. Et si vous souhaitez filtrer dans la ligne de données, vous devez utiliser le filtre tc dans le cas de Switchdev. Et ici, il convient de garder à l'esprit que le filtre tc filtrera déjà non seulement le trafic acheminé, mais également celui qui est commuté. Et aussi le filtre tc ne peut être accroché que sur des ports physiques, donc si vous travaillez avec des vlans, vous devez faire des constructions plus complexes ici. Mais il y a des fonctionnalités intéressantes là-bas, par exemple, vous pouvez accrocher un tel bloc sur plusieurs interfaces et elles vont tâtonner (dans le sens de partager) un filtre commun. Il y a aussi un opérateur goto dans les règles tc, qui est également assez cool et vous permet de faire des acl non linéaires, contrairement à Cisco ou Arista.
Ici, nous avons également un utilitaire pour configurer acl - mlxacl. Nous travaillons principalement avec des vlans au troisième niveau et l'utilitaire fonctionne de telle manière que pour chaque vlan, il crée une chaîne séparée et dans la chaîne principale, il correspond simplement aux vlans et va à la chaîne correspondante pour ce vlan.
Ici aussi, il y a un exemple d'une telle configuration - de telles commandes en sont le résultat. Il y en a moins que dans le cas de la configuration du commutateur lui-même, car une règle est mappée à environ une commande - pas si difficile.
Mais si des changements doivent être apportés - dans ce cas, j'ai supprimé une règle et l'utilitaire fait tout de telle manière qu'il réécrit toutes les chaînes qui ont changé, après quoi il renumérote dans la chaîne principale zéro afin qu'elles se réfèrent à de nouvelles chaînes. Et il est clair que dans ce cas, il serait possible, avec un travail manuel, de le résoudre en une seule commande.
Mais pour cela, nous devons d'abord regarder l'état actuel et voici à quoi ressemble la sortie du filtre tc - il est assez difficile de travailler avec.
Lorsque vous travaillez avec tout cela, les gens qui passent vous regardent comme ça. Par conséquent, nous avons écrit cet utilitaire - mlxacl - d'abord, car il était beaucoup plus pénible de travailler avec, puis mot par mot et pour le reste des paramètres, nous avons également écrit l'utilitaire.
Ces utilitaires, dont je vous ai parlé, nous les avons publiés en public sur Gitlab - vous pouvez les utiliser. Ils sont sous licence MIT, et donc disponibles gratuitement.
Naturellement, sans aucune garantie. Ceci est un couple de scripts Perl (anticipant vos questions - parce que je connais Perl et cela fonctionne juste), relativement petit, presque sans dépendances - il utilise quelques modules Perl qui sont dans la distribution Perl standard et les utilitaires Linux, bien sûr.
Enfin, si vous avez un peu travaillé avec une console série, avec des ports COM, je veux donner quelques conseils. Par exemple, si quelqu'un pensait que c'était un moyen de quitter Vim, vous l'avez presque deviné.
Pour certains bios, c'est l'équivalent de Ctrl + Alt + Suppr, car ils le perçoivent via le port série. Autrement dit, si votre chargeur de démarrage se bloque, par exemple, et que vous devez en quelque sorte redémarrer le commutateur, vous pouvez utiliser.
De plus, quand il s'agit du noyau, il intercepte naturellement le travail avec le clavier, donc ici, vous feriez mieux d'accepter les commandes de votre noyau SysRq - sinon il sera difficile de redémarrer le commutateur. Et dans le cas de SysRq, lorsque vous travaillez avec le clavier et un terminal normal, PrintScreen y est utilisé, et dans le cas d'une console série, avec un port COM, vous devez envoyer un signal de rupture spécial - en minicom, c'est Ctrl + F, à l'écran ' e Ctrl + A, Ctrl + B, puis créez une touche SysRq spéciale.
Et pour entrer dans le bios au moment du démarrage - dans le bios du commutateur, bien sûr, car en fait, comme dans un ordinateur ordinaire, il existe un bios à travers lequel il démarre généralement - vous pouvez appuyer sur Ctrl + B.
C'est tout ce que je voulais vous dire brièvement. Si vous avez des questions, je serai ravi d'y répondre.
→ Version anglaise de la publication.