Kubernetesとコンテナランタイムの互換性をトラブルシューティングする

Kubernetes とコンテナランタイムの互換性に固有のトラブルシューティングについて説明します。

Kubernetes では、クラスター内の各ノードにコンテナランタイムをインストールして、そこでポッドを実行できるようにする必要があります。Splunk Distribution of the Collector for Kubernetes は、containerd、CRI-O、Docker、Mirantis Kubernetes Engine(旧 Docker Enterprise/UCP)などのコンテナランタイムをサポートしています。

バージョンや構成に互換性のないコンテナランタイムを使用している Kubernetes クラスターでは、次のような問題が発生する可能性があります:

  • コンテナ、ポッド、またはノードの統計が存在しないか、不正な形式です。これらの統計情報を必要とする Collector は、対応する望ましいメトリクスを生成できません。

  • コンテナ、ポッド、ノードが正常に起動しない、またはきれいに停止しません。

  • ノード上のkubeletプロセスが停止状態にあります。

特定の Kubernetes のバージョンとコンテナランタイムの互換性レベルは異なる可能性があります。互換性があることが分かっている Kubernetes のバージョンとコンテナランタイムを使用してください。詳しくは「コンテナランタイムの互換性のトラブルシューティング」をご確認ください。

ランタイムについて、詳しくは「コンテナランタイム」を参照してください。

コンテナランタイムの互換性のトラブルシューティング

以下の手順に従って、Kubernets とコンテナランタイムの互換性に問題があるかどうかを確認してください。

  1. kubectl get nodes -o wide を実行して、使用されている Kubernetes とコンテナランタイムのバージョンを確認します。-o wide フラグを使用すると、追加情報を含むプレーンテキスト形式で出力が表示されます。ポッドの場合はノード名が含まれます。次の例では、node-1は Kubernetes 1.19.6 と containerd 1.4.1 を使用します。

    kubectl get nodes -o wide
    NAME         STATUS   VERSION   CONTAINER-RUNTIME
    node-1       Ready    v1.19.6   containerd://1.4.1
  2. Kubernetes バージョンと互換性のあるコンテナランタイムを使用していることを確認してください。コンテナランタイムの互換性については、次のベンダードキュメントを参照してください。

  3. コンテナ統計の完全性をチェックしてください。方法については、「コンテナ統計の完全性をチェックする」を参照してください。

  4. 正しい証明書があることを確認します。

  5. 本番環境以外では、コマンドagent.config.receivers.kubeletstats.insecure_skip_verify=trueで証明書の検証をスキップしてみてください。

コンテナ統計の完全性をチェックする

コンテナ、ポッド、およびノードの統計情報を確認するには、Kubelet Summary API を使用します。Kubelet は、/statsエンドポイントを通じて利用可能なノードごとの要約された統計情報を検出および取得するための Summary API を提供します。

以下の例では、Collector が Kubelet Stats Receiver メトリクスの生成に使用する CPU、メモリ、およびネットワークの統計情報が存在することを確認する方法を示します。これらの手法を拡張することで、利用可能な他の Kubernetes 統計情報を評価できます。

特に指定がない限り、これらの例に示されているすべての統計情報が表示されます。出力に統計値がない、または統計値が異なるフォーマットで表示される場合は、Kubernetes クラスターとコンテナランタイムの完全な互換性がない可能性があります。

ノードの統計情報を確認する

ノードの統計情報を確認するには以下の手順に従います。

  1. 以下のコマンドを実行してクラスター内のノード名を取得し、ノードの1つから生のリソース使用統計情報を取り出します:

    kubectl get nodes -o wide
  2. 評価するノードを選択し、その名前を環境変数に設定します。次の例では、ノード名は node-1 になります。

    NODE_NAME=node-1
  3. ノードが適切な統計情報を持っていることを確認します:

    kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '{"node": {"name": .node.nodeName, "cpu": .node.cpu, "memory": .node.memory, "network": .node.network}} | del(.node.network.interfaces)'
    {
      "node": {
        "name": "node-1",
        "cpu": {
          "time": "2022-05-20T18:12:08Z",
          "usageNanoCores": 149771849,
          "usageCoreNanoSeconds": 2962750554249399
        },
        "memory": {
          "time": "2022-05-20T18:12:08Z",
          "availableBytes": 2701385728,
          # Could be absent if node memory allocations were missing.
          "usageBytes": 3686178816,
          "workingSetBytes": 1421492224,
          "rssBytes": 634343424,
          "pageFaults": 18632526,
          "majorPageFaults": 726
        },
        "network": {
          "time": "2022-05-20T18:12:08Z",
          "name": "eth0",
          "rxBytes": 105517219156,
          "rxErrors": 0,
          "txBytes": 98151853779,
          "txErrors": 0
        }
      }
    }

参考のため、次の表にノード統計名とCollectorメトリクス名の対応を示します:

ノード統計名

Collector のメトリクス名

cpu.usageNanoCores

k8s.node.cpu.utilization

cpu.usageCoreNanoSeconds

k8s.node.cpu.time

memory.availableBytes

k8s.node.memory.available

memory.usageBytes

k8s.node.filesystem.usage

memory.workingSetBytes

k8s.node.memory.working_set

memory.rssBytes

k8s.node.memory.rss

memory.pageFaults

k8s.node.memory.page_faults

memory.majorPageFaults

k8s.node.memory.major_page_faults

network.rxBytes

k8s.node.network.io{direction="receive"}

network.rxErrors

k8s.node.network.errors{direction="receive"}

network.txBytes

k8s.node.network.io{direction="transmit"}

network.txErrors

k8s.node.network.error{direction="transmit"}

ポッドの統計情報を確認する

注: このセクションを完了する前に、「ノードの統計情報を確認する」の手順 1 と 2 を完了してください。

ポッドの統計情報を確認する

  1. 以下のコマンドを実行して、選択したノードのポッド名を取得し、ポッドの1つから生のリソース使用統計を取り出します:

    kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '.pods[].podRef.name'
  2. 評価するポッドを選択し、その名前を環境変数に設定します。次の例では、ポッド名は splunk-otel-collector-agent-6llkr になります。

    POD_NAME=splunk-otel-collector-agent-6llkr
  3. ポッドが適切な統計情報を持っていることを確認します:

    kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '.pods[] | select(.podRef.name=='\"$POD_NAME\"') | {"pod": {"name": .podRef.name, "cpu": .cpu, "memory": .memory, "network": .network}} | del(.pod.network.interfaces)'
    {
      "pod": {
        "name": "splunk-otel-collector-agent-6llkr",
        "cpu": {
          "time": "2022-05-20T18:38:47Z",
          "usageNanoCores": 10774467,
          "usageCoreNanoSeconds": 1709095026234
        },
        "memory": {
          "time": "2022-05-20T18:38:47Z",
          "availableBytes": 781959168,
          # Could be absent if pod memory limits were missing.
          "usageBytes": 267563008,
          "workingSetBytes": 266616832,
          "rssBytes": 257036288,
          "pageFaults": 0,
          "majorPageFaults": 0
        },
        "network": {
          "time": "2022-05-20T18:38:55Z",
          "name": "eth0",
          "rxBytes": 105523812442,
          "rxErrors": 0,
          "txBytes": 98159696431,
          "txErrors": 0
        }
      }
    }

参考のため、次の表にPod stat名とCollectorメトリクス名のマッピングを示します:

ポッド統計名

Collector のメトリクス名

pod.cpu.usageNanoCores

k8s.pod.cpu.utilization

pod.cpu.usageCoreNanoSeconds

k8s.pod.cpu.time

pod.memory.availableBytes

k8s.pod.memory.available

pod.memory.usageBytes

k8s.pod.filesystem.usage

pod.memory.workingSetBytes

k8s.pod.memory.working_set

pod.memory.rssBytes

k8s.pod.memory.rss

pod.memory.pageFaults

k8s.pod.memory.page_faults

pod.memory.majorPageFaults

k8s.pod.memory.major_page_faults

pod.network.rxBytes

k8s.pod.network.io{direction="receive"} または pod_network_receive_bytes_total

pod.network.rxErrors

k8s.pod.network.errors{direction="receive"} または pod_network_receive_errors_total

pod.network.txBytes

k8s.pod.network.io{direction="transmit"} または pod_network_transmit_bytes_total

pod.network.txErrors

k8s.pod.network.error{direction="transmit"} または pod_network_transmit_errors_total

コンテナの統計情報を確認する

注: このセクションを実行する前に「ノードの統計情報を確認する」と「ポッドの統計情報を確認する」の手順 1 と 2 を完了してください。

コンテナの統計情報を確認するには以下の手順に従います。

  1. 以下のコマンドを実行して、選択したポッド内のコンテナ名を取得し、コンテナの1つから生のリソース使用統計情報を取り出します:

    kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '.pods[] | select(.podRef.name=='\"$POD_NAME\"') | .containers[].name'
  2. 評価するコンテナを選択し、その名前を環境変数に設定します。次の例では、コンテナ名は otel-collector になります。

    CONTAINER_NAME=otel-collector
  3. コンテナが適切な統計情報を持っていることを確認します:

    kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '.pods[] | select(.podRef.name=='\"$POD_NAME\"') | .containers[] | select(.name=='\"$CONTAINER_NAME\"') | {"container": {"name": .name, "cpu": .cpu, "memory": .memory}}'
    {
      "container": {
        "name": "otel-collector",
        "cpu": {
          "time": "2022-05-20T18:42:15Z",
          "usageNanoCores": 6781417,
          "usageCoreNanoSeconds": 1087899649154
        },
        "memory": {
          "time": "2022-05-20T18:42:15Z",
          "availableBytes": 389480448,
          # Could be absent if container memory limits were missing.
          "usageBytes": 135753728,
          "workingSetBytes": 134807552,
          "rssBytes": 132923392,
          "pageFaults": 93390,
          "majorPageFaults": 0
        }
      }
    }

参考のため、以下の表に、コンテナ統計名とCollectorメトリクス名のマッピングを示します:

コンテナ統計名

Collector のメトリクス名

container.cpu.usageNanoCore

container.cpu.utilization

container.cpu.usageCoreNanoSeconds

container.cpu.time

container.memory.availableBytes

container.memory.available

container.memory.usageBytes

container.memory.usage

container.memory.workingSetBytes

container.memory.working_set

container.memory.rssBytes

container.memory.rss

container.memory.pageFaults

container.memory.page_faults

container.memory.majorPageFaults

container.memory.major_page_faults

報告された互換性のないKubernetesとコンテナランタイムの問題

注: マネージドKubernetesサービスは、変更されたコンテナランタイムを使用している可能性があり、サービスプロバイダは、変更されていないコンテナランタイムには存在しないカスタムパッチやバグ修正を適用している可能性があります。

このセクションでは、既知の非互換性とコンテナランタイムの問題について説明します。

Kubernetes 1.21.0~1.21.11とcontainerd

Kubernetes 1.21.0~1.21.11 と containerd を使用している場合、メモリおよびネットワークの統計情報やメトリクスが欠落することがあります。影響を受けるメトリクスのリストを以下に示します。

  • k8s.pod.network.io{direction="receive"} または pod_network_receive_bytes_total

  • k8s.pod.network.errors{direction="receive"} または pod_network_receive_errors_total

  • k8s.pod.network.io{direction="transmit"} または pod_network_transmit_bytes_total

  • k8s.pod.network.error{direction="transmit"} または pod_network_transmit_errors_total

  • container.memory.available

  • container.memory.usage

  • container.memory.rssBytes

  • container.memory.page_faults

  • container.memory.major_page_faults

この問題を解決するには、次のいずれかの回避策をお試しください:

  • Kubernetesをバージョン1.21.12以上にアップグレードします。

  • containerdをバージョン1.4.xまたは1.5.xにアップグレードします。

Kubernetes 1.22.0~1.22.8とcontainerd 1.4.0~1.4.12

Kubernetes 1.22.0〜1.22.8 と containerd 1.4.0〜1.4.12 を使用している場合、メモリおよびネットワークの統計情報やメトリクスが欠落することがあります。影響を受けるメトリクスのリストを以下に示します。

  • k8s.pod.network.io{direction="receive"} または pod_network_receive_bytes_total

  • k8s.pod.network.errors{direction="receive"} または pod_network_receive_errors_total

  • k8s.pod.network.io{direction="transmit"} または pod_network_transmit_bytes_total

  • k8s.pod.network.error{direction="transmit"} または pod_network_transmit_errors_total

  • k8s.pod.memory.available

  • container.memory.available

  • container.memory.usage

  • container.memory.rssBytes

  • container.memory.page_faults

  • container.memory.major_page_faults

この問題を解決するには、次のいずれかの回避策をお試しください:

  • Kubernetesを少なくともバージョン1.22.9にアップグレードして、コンテナのメモリとポッドのネットワークメトリクスの欠落を修正します。

  • containerdを少なくともバージョン1.4.13または1.5.0にアップグレードして、欠落しているポッドメモリメトリクスを修正します。

Kubernetes 1.23.0~1.23.6とcontainerd

Kubernetes 1.23.0〜1.23.6 と containerd を使用している場合、メモリの統計情報やメトリクスが欠落することがあります。影響を受けるメトリクスのリストを以下に示します。

  • k8s.pod.memory.available

現時点では、この問題の回避策はありません。