Chapitre 33. Associer des métriques d'interfaces secondaires à des pièces jointes du réseau
33.1. Extension des mesures secondaires du réseau pour la surveillance
Les dispositifs secondaires, ou interfaces, sont utilisés à des fins différentes. Il est important d'avoir un moyen de les classer afin de pouvoir agréger les mesures pour les dispositifs secondaires ayant la même classification.
Les métriques exposées contiennent l'interface mais ne précisent pas son origine. Cela est possible lorsqu'il n'y a pas d'interfaces supplémentaires. Cependant, si des interfaces secondaires sont ajoutées, il peut être difficile d'utiliser les métriques car il est difficile d'identifier les interfaces en utilisant uniquement les noms d'interface.
Lors de l'ajout d'interfaces secondaires, leurs noms dépendent de l'ordre dans lequel elles sont ajoutées, et différentes interfaces secondaires peuvent appartenir à différents réseaux et être utilisées à des fins différentes.
Avec pod_network_name_info
, il est possible d'étendre les mesures actuelles avec des informations supplémentaires qui identifient le type d'interface. De cette manière, il est possible d'agréger les mesures et d'ajouter des alarmes spécifiques à des types d'interface spécifiques.
Le type de réseau est généré à l'aide du nom du site NetworkAttachmentDefinition
, qui est à son tour utilisé pour différencier différentes classes de réseaux secondaires. Par exemple, des interfaces appartenant à des réseaux différents ou utilisant des CNI différents utilisent des noms de définition d'attachement au réseau différents.
33.1.1. Démon de mesure du réseau
Le Network Metrics Daemon est un composant démon qui collecte et publie des mesures relatives au réseau.
Le kubelet publie déjà des métriques relatives au réseau que vous pouvez observer. Ces métriques sont les suivantes :
-
container_network_receive_bytes_total
-
container_network_receive_errors_total
-
container_network_receive_packets_total
-
container_network_receive_packets_dropped_total
-
container_network_transmit_bytes_total
-
container_network_transmit_errors_total
-
container_network_transmit_packets_total
-
container_network_transmit_packets_dropped_total
Les étiquettes de ces métriques contiennent, entre autres, les éléments suivants
- Nom du pod
- Espace de noms Pod
-
Nom de l'interface (tel que
eth0
)
Ces mesures fonctionnent bien jusqu'à ce que de nouvelles interfaces soient ajoutées au pod, par exemple via Multus, car il n'est pas clair à quoi les noms d'interface font référence.
L'étiquette de l'interface fait référence au nom de l'interface, mais on ne sait pas exactement à quoi cette interface est destinée. S'il existe de nombreuses interfaces différentes, il est impossible de comprendre à quel réseau se réfèrent les mesures que vous surveillez.
Ce problème est résolu par l'introduction du nouveau site pod_network_name_info
décrit dans la section suivante.
33.1.2. Mesures avec nom de réseau
Ce daemonset publie une mesure de la jauge pod_network_name_info
, avec une valeur fixe de 0
:
pod_network_name_info{interface="net0",namespace="namespacename",network_name="nadnamespace/firstNAD",pod="podname"} 0
L'étiquette du nom du réseau est produite à l'aide de l'annotation ajoutée par Multus. Il s'agit de la concaténation de l'espace de noms auquel appartient la définition de l'attachement au réseau et du nom de la définition de l'attachement au réseau.
Cette nouvelle mesure n'est pas très utile en soi, mais combinée aux mesures du réseau container_network_*
, elle offre un meilleur soutien pour la surveillance des réseaux secondaires.
En utilisant une requête promql
comme les suivantes, il est possible d'obtenir une nouvelle métrique contenant la valeur et le nom du réseau récupéré dans l'annotation k8s.v1.cni.cncf.io/networks-status
:
(container_network_receive_bytes_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_receive_errors_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_receive_packets_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_receive_packets_dropped_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_transmit_bytes_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_transmit_errors_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_transmit_packets_total) + on(namespace,pod,interface) group_left(network_name) ( pod_network_name_info ) (container_network_transmit_packets_dropped_total) + on(namespace,pod,interface) group_left(network_name)