第19章 セカンダリーインターフェースメトリクスのネットワーク割り当てへの関連付け

19.1. セカンダリーインターフェースメトリクスのネットワーク割り当てへの関連付け

セカンダリーデバイス (インターフェース) は、各種の用途に合わせて使用されます。セカンダリーデバイスのメトリクスを同じ分類で集計するために、それらを分類する方法を確保する必要があります。

公開されるメトリクスにはインターフェースが含まれますが、インターフェースの出所は指定されません。これは、追加のインターフェースがない場合に役に立ちますが、セカンダリーインターフェースが追加されると、インターフェース名のみを識別子として使用してインターフェースを識別することは困難であるため、メトリクスを使用することは難しくなります。

セカンダリーインターフェースを追加する場合、その名前は追加された順序によって異なります。また、異なるセカンダリーインターフェースが異なるネットワークに属し、これらを異なる目的に使用できます。

pod_network_name_info を使用すると、現在のメトリクスをインターフェースタイプを識別する追加情報を使用して拡張できます。このようにして、メトリクスを集約し、特定のインターフェースタイプに特定のアラームを追加できます。

ネットワークタイプは、関連する NetworkAttachementDefinition の名前を使用して生成されます。この名前は、セカンダリーネットワークの異なるクラスを区別するために使用されます。たとえば、異なるネットワークに属するインターフェースや、異なる CNI を使用するインターフェースは、異なるネットワーク割り当て定義名を使用します。

19.1.1. Network Metrics Daemon

Network Metrics Daemon は、ネットワーク関連のメトリクスを収集し、公開するデーモンコンポーネントです。

kubelet はすでに確認できるネットワーク関連のメトリクスを公開しています。以下は、これらのメトリクスになります。

  • 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

これらのメトリクスのラベルには、とくに以下が含まれます。

  • Pod の名前
  • Pod の namespace
  • インターフェース名 (例: eth0)

これらのメトリクスは、Multus を使用して新規インターフェースが Pod に追加されるまで正常に機能します。インターフェース名が何を参照しているか明確ではないためです。

インターフェースのラベルはインターフェース名を参照しますが、そのインターフェースの用途は明確ではありません。多くの異なるインターフェースがある場合、監視しているメトリクスが参照するネットワークを把握することはできません。

これには、以降のセクションで説明する新規の pod_network_name_info を導入して対応できます。

19.1.2. ネットワーク名を持つメトリクス

この daemonset は、固定の値が 0pod_network_name_info 測定メトリクスを公開します。

pod_network_name_info{interface="net0",namespace="namespacename",network_name="nadnamespace/firstNAD",pod="podname"} 0

ネットワーク名ラベルは、Multus によって追加されるアノテーションを使用して生成されます。これは、ネットワークの割り当て定義が属する namespace の連結と、ネットワーク割り当て定義の名前です。

新しいメトリクスのみでは十分な値が提供されませんが、ネットワーク関連の container_network_* メトリクスと組み合わせて、セカンダリーネットワークの監視に対するサポートを強化します。

以下のような promql クエリーを使用すると、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)