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 とコンテナランタイムの互換性に問題があるかどうかを確認してください。
-
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 -
Kubernetes バージョンと互換性のあるコンテナランタイムを使用していることを確認してください。コンテナランタイムの互換性については、次のベンダードキュメントを参照してください。
-
コンテナ統計の完全性をチェックしてください。方法については、「コンテナ統計の完全性をチェックする」を参照してください。
-
正しい証明書があることを確認します。
-
本番環境以外では、コマンド
agent.config.receivers.kubeletstats.insecure_skip_verify=trueで証明書の検証をスキップしてみてください。
コンテナ統計の完全性をチェックする
コンテナ、ポッド、およびノードの統計情報を確認するには、Kubelet Summary API を使用します。Kubelet は、/statsエンドポイントを通じて利用可能なノードごとの要約された統計情報を検出および取得するための Summary API を提供します。
以下の例では、Collector が Kubelet Stats Receiver メトリクスの生成に使用する CPU、メモリ、およびネットワークの統計情報が存在することを確認する方法を示します。これらの手法を拡張することで、利用可能な他の Kubernetes 統計情報を評価できます。
特に指定がない限り、これらの例に示されているすべての統計情報が表示されます。出力に統計値がない、または統計値が異なるフォーマットで表示される場合は、Kubernetes クラスターとコンテナランタイムの完全な互換性がない可能性があります。
ノードの統計情報を確認する
ノードの統計情報を確認するには以下の手順に従います。
-
以下のコマンドを実行してクラスター内のノード名を取得し、ノードの1つから生のリソース使用統計情報を取り出します:
kubectl get nodes -o wide -
評価するノードを選択し、その名前を環境変数に設定します。次の例では、ノード名は
node-1になります。NODE_NAME=node-1 -
ノードが適切な統計情報を持っていることを確認します:
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 のメトリクス名 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ポッドの統計情報を確認する
ポッドの統計情報を確認する
-
以下のコマンドを実行して、選択したノードのポッド名を取得し、ポッドの1つから生のリソース使用統計を取り出します:
kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '.pods[].podRef.name' -
評価するポッドを選択し、その名前を環境変数に設定します。次の例では、ポッド名は
splunk-otel-collector-agent-6llkrになります。POD_NAME=splunk-otel-collector-agent-6llkr -
ポッドが適切な統計情報を持っていることを確認します:
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 のメトリクス名 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
コンテナの統計情報を確認する
コンテナの統計情報を確認するには以下の手順に従います。
-
以下のコマンドを実行して、選択したポッド内のコンテナ名を取得し、コンテナの1つから生のリソース使用統計情報を取り出します:
kubectl get --raw "/api/v1/nodes/"${NODE_NAME}"/proxy/stats/summary" | jq '.pods[] | select(.podRef.name=='\"$POD_NAME\"') | .containers[].name' -
評価するコンテナを選択し、その名前を環境変数に設定します。次の例では、コンテナ名は
otel-collectorになります。CONTAINER_NAME=otel-collector -
コンテナが適切な統計情報を持っていることを確認します:
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 のメトリクス名 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
報告された互換性のない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
現時点では、この問題の回避策はありません。