このトピックでは、ポッドの診断手順と、ポッドエラーのトラブルシューティング方法について説明します。 このトピックでは、ポッドに関するよくある質問に対する回答も提供します。
コンソールでポッドの問題をトラブルシューティングする方法については、「コンソールでのトラブルシューティング」をご参照ください。 コンソールでは、ポッドのステータス、基本情報、構成、イベント、ログを表示したり、ターミナルを使用してコンテナにアクセスしたり、ポッド診断を有効にしたりできます。
診断手順
ポッドが正常に実行されない場合は、ポッドのイベント、ログ、構成を確認することで原因を特定できます。 下図にプロセスを示します。
フェーズ1: スケジューリングの問題
ポッドのスケジュールに失敗しました
ポッドがPending状態のままである場合は、ポッドのスケジューリングに失敗したことを意味します。 考えられる原因を次の表に示します。
エラーメッセージ | 説明 | 推奨ソリューション |
| クラスターには、ポッドスケジューリングに使用できるノードがありません。 |
|
| クラスターには、ポッドのCPUまたはメモリ要求を実行できるノードがありません。 | [ノード] ページで、ポッド、CPU、およびメモリ使用率を表示し、クラスターリソース使用率を確認します。 説明 ノードのCPUとメモリの使用率が低いレベルに維持されている場合、ノードへの新しいポッドのスケジューリングはノードリソースを使い果たしません。 ただし、スケジューラは、ピーク時に新しいポッドでノードリソースが不足するかどうかを確認し、不適切なリソーススケジューリングを回避しようとします。 クラスタ内のCPUまたはメモリリソースが使い果たされた場合、次の方法を使用します。
|
| クラスターには、ポッドのノードアフィニティルール (nodeSelector) またはアフィニティとアンチアフィニティルール (podAffinityおよびpodAnitiAffinity) に一致するノードがありません。 |
|
| ディスクボリュームをゾーン間でマウントできないため、ポッドで使用されるボリュームでノードアフィニティの競合が発生します。 その結果、ポッドのスケジュールに失敗しました。 |
|
| ディスクタイプはElastic Compute Service (ECS) インスタンスでサポートされていません。 | 「インスタンスファミリーの概要」を参照し、ECSインスタンスでサポートされているディスクタイプを確認します。 ECSインスタンスでサポートされているディスクをポッドにマウントします。 |
| ノードにtaintがあるため、ポッドを目的のノードにスケジュールできませんでした。 | |
| ノードに十分な一時的なストレージスペースがありません。 |
|
| 永続ボリューム要求 (PVC) がポッドにバインドできませんでした。 | ポッドに指定されたPVCまたはPVが作成されているかどうかを確認します。 |
ポッドはすでにノードにスケジュールされています
ポッドがすでにノードにスケジュールされているが、Pending状態のままである場合は、次のソリューションを参照してください。
ポッドが
hostPort
で構成されているかどうかを確認します。ポッドがhostPort
で構成されている場合、各ノードでhostPort
を使用するポッドは1つだけ実行できます。 したがって、DeploymentまたはReplicationControllerのReplicas
の値は、クラスター内のノード数を超えてはなりません。 ノードのホストポートが他のアプリケーションによって使用されている場合、ポッドはノードにスケジュールされませんでした。hostPort
を設定すると、ポッドの管理とスケジューリングが複雑になります。 サービスを使用してポッドにアクセスすることを推奨します。 詳細については、「サービス」をご参照ください。ポッドに
hostPort
が設定されていない場合は、次の手順を実行します。kubectl describe pod <pod-name>
コマンドを実行して、ポッドのイベントを表示し、問題のトラブルシューティングを行います。 イベントには、イメージプルの失敗、リソースの不足、セキュリティポリシーによる制限、構成エラーなど、ポッドの起動失敗の原因が表示される場合があります。イベントの原因を特定できなかった場合は、ノードのkubeletのログを確認してください。
grep -i <pod name> /var/log/messages * | less
コマンドを実行して、システムログファイル (/var/log/messages *
) 内のポッド名を含むログエントリを確認できます。
フェーズ2: 画像のプルの問題
エラーメッセージ | 説明 | 推奨ソリューション |
|
| ポッドYAMLファイルの Container Registryを使用する場合は、aliyun-acr-credential-helperコンポーネントを使用して、パスワードなしで画像をプルできます。 詳細については、「aliyun-acr-credential-helperコンポーネントを使用して、シークレットを使用せずにイメージをプルする」をご参照ください。 |
| 指定されたイメージリポジトリからHTTP経由でイメージをプルするときに、イメージアドレスの解析に失敗しました。 |
|
| ノードに十分なディスク容量がありません。 | 「ECSインスタンスへの接続方法」を参照してポッドのノードにログインし、 |
| サードパーティのイメージリポジトリは、未知または信頼できない認証局によって署名および発行された証明書を使用します。 |
|
| イメージファイルが大きすぎるため、操作がキャンセルされます。 Kubernetesには、イメージプルのデフォルトのタイムアウト期間があります。 イメージプルの進行状況が特定の期間内に更新されなかった場合、Kubernetesはエラーが発生した、または応答が返されなかったと見なし、操作をキャンセルします。 |
|
| イメージリポジトリへの接続に失敗しました。 |
|
| DockerHubは、イメージプルリクエストにレート制限を設定します。 | イメージをContainer Registryにアップロードし、Container Registryからイメージを取得します。 |
| kubeletを使用することによる画像引き込みの上限に達することがある。 | 「ノードプールのkubeletパラメーターのカスタマイズ」を参照し、最大イメージリポジトリQPS (registryPullQPS) とイメージプルのバーストの最大サイズ (registryBurst) を変更します。 |
フェーズ3: スタートアップの問題
ポッドがInit状態
エラーメッセージ | 説明 | 推奨ソリューション |
ポッドは | ポッドにはM個のInitコンテナが含まれています。 N個のコンテナが開始されました。 M-N Initコンテナーが開始されていません。 |
initコンテナーの詳細については、「initコンテナーのデバッグ」をご参照ください。 |
ポッドは | ポッド内のInitコンテナーの起動に失敗しました。 | |
ポッドは | ポッド内のInitコンテナーの起動に失敗し、繰り返し再起動しました。 |
ポッドが作成中 (作成中)
エラーメッセージ | 説明 | 推奨ソリューション |
| このエラーは、Flannelネットワークプラグインの設計が原因で予想されます。 | フランネルをv0.15.1.11-7e95fe23-aliyun以降に更新します。 詳細については、「フランネル」をご参照ください。 |
クラスターが1.20より前のバージョンのKubernetesを実行し、ポッドが繰り返し再起動するか、CronJobによって作成されたポッドがタスクを完了し、短時間で終了すると、IPリークが発生する可能性があります。 | クラスターのKubernetesバージョンを1.20以降に更新します。 最新バージョンに更新することを推奨します。 詳細については、「手動でACKクラスターをアップグレード」をご参照ください。 | |
containerdとrunCには欠陥があります。 | 詳細については、「」をご参照ください。ポッドの起動に失敗し、「範囲内で使用可能なIPアドレスはありません」というエラーメッセージが表示された場合はどうすればよいですか? | |
| Terwayによって維持され、ポッドのノードでelastic network Interface (ENI) を追跡および管理するために使用される内部データベースのステータスが、実際のネットワークデバイス構成と一致していません。 その結果、ENIの割り当てに失敗した。 |
|
| TerwayはvSwitchからIPアドレスを要求できませんでした。 |
|
ポッドの起動に失敗しました (CrashLoopBackOff)
エラーメッセージ | 説明 | 推奨ソリューション |
ログに |
| |
イベント情報には、 | ヘルスチェックに失敗しました。 | ポッドのlivenessプローブポリシーを確認します。 livenessプローブの結果が、ポッドのコンテナーで実行されているアプリケーションの実際のステータスを示すことができることを確認します。 |
ポッドログには | ディスク容量が不足しています。 |
|
ポッドの起動に失敗し、イベントが生成されません | ポッドのリソース制限は、ポッドによって要求されたリソースよりも低くなっています。 その結果、ポッド内のコンテナは起動できませんでした。 | ポッドのリソース設定を確認します。 リソースプロファイリングを有効にして、推奨リソースリクエストとリソース制限を取得できます。 |
ポッドログに | ポッド内のコンテナがポート競合に遭遇します。 |
|
ポッドログには、 | ワークロードはシークレットでマウントされます。 Secretのキー値はBase64を使用してエンコードされません。 |
|
ビジネス上の問題が存在します。 | ポッドログに基づいて原因を特定します。 |
フェーズ4: ポッド操作の問題
OOM
クラスター内のコンテナのメモリ使用量が指定されたメモリ制限を超えると、コンテナが終了し、OOMイベントがトリガーされ、コンテナが終了します。 OOMイベントの詳細については、「コンテナーとポッドへのメモリリソースの割り当て」をご参照ください。
プロセスの終了によりコンテナがスタックした場合、コンテナは再起動することができる。
OOMエラーが発生した場合は、コンソールにログインしてポッドの詳細ページに移動します。 [イベント] タブでは、次のOOMイベントを表示できます。pod was OOM killed.
クラスターにコンテナーレプリカ例外のアラートルールが設定されている場合、OOMイベントが発生するとアラートが受信されます。 詳細については、「アラート管理」をご参照ください。
OOMレベル | 説明 | 推奨ソリューション |
OSレベル | ポッドをホストするノードのカーネルログ ( | 考えられる原因は、メモリ断片化中のシステムグローバルメモリ不足、ノードメモリ不足、またはバディシステムメモリ不足です。 メモリ不足の原因の詳細については、「考えられる原因」をご参照ください。 ソリューションの詳細については、「ソリューション」をご参照ください。 |
cgroupレベル | ポッドをホストするノードのカーネルログ ( | プロセスが通常どおりに実行される場合は、それに応じてポッドのメモリ制限を増やします。 ポッドの実際のメモリ使用量がメモリ制限の80% を超えないようにしてください。 詳細については、「ポッドのCPUおよびメモリリソースの上限と下限の変更」をご参照ください。 リソースプロファイリングを有効にして、コンテナーの推奨リソースリクエストとリソース制限を取得できます。 |
終了
考えられる原因 | 説明 | 推奨ソリューション |
ノードが異常で、NotReady状態です。 | NotReadyノードは、回復後に自動的に削除されます。 | |
ファイナライザーはポッド用に設定されています。 | ポッドにファイナライザーが設定されている場合、Kubernetesはポッドを削除する前にファイナライザーによって指定されたクリーンアップ操作を実行します。 クリーンアップ操作に対して応答が返されない場合、ポッドは終了状態のままです。 |
|
ポッドのpreStopフックが無効です。 | preStopフックがポッドに設定されている場合、Kubernetesはポッドを終了する前にpreStopフックで指定された操作を実行します。 ポッドはpreStop段階にあり、終了状態になります。 |
|
ポッドは、グレースフルシャットダウン期間で設定されています。 | ポッドにグレースフルシャットダウン期間 ( | コンテナーが正常に終了すると、Kubernetesはポッドを削除します。 |
コンテナは応答しません。 | ポッドを終了または削除するリクエストを開始すると、Kubernetesは |
|
立ち退きました
考えられる原因 | 説明 | 推奨ソリューション |
ノードにメモリやディスク領域のリソースなどの十分なリソースがありません。 その結果、kubeletはノード上の1つ以上のポッドを追い出し、リソースを再利用します。 | ノードに十分なメモリ、ディスク容量、またはPIDがない場合があります。
|
|
予期しない立ち退きが発生します。 | ポッドをホストするノードにNoExecute taintがあります。 その結果、予期しない追い出しが起こる。 |
|
ポッドは予想どおりに追い出されません。 |
| 50ノード以下の小さなクラスターでは、55% を超えるノードがダウンしている場合、ポッドの削除が停止されます。 詳細については、「立ち退きのレート制限」をご参照ください。 |
50を超えるノードを含む大規模なクラスターでは、異常なノードとノードの合計の比率が | ||
ポッドは、追い出された後も、元のノードに頻繁にスケジュールされます。 | ポッドは、ノードのリソース使用量に基づいてノードから追い出される。 ポッドスケジューリングルールは、ノードに割り当てられたリソースに依存します。 追い出されたポッドは、元のノードに再びスケジュールされ得る。 | ノードの割り当て可能なリソースに基づいて、ポッドのリソース要求が適切に構成されているかどうかを確認します。 詳細については、「ポッドのCPUおよびメモリリソースの上限と下限の変更」をご参照ください。 リソースプロファイリングを有効にして、コンテナーの推奨リソースリクエストとリソース制限を取得できます。 |
完了しました
ポッドが [完了] 状態になると、ポッド内のすべてのコンテナーが開始され、コンテナー内のすべてのプロセスが正常に終了します。 完了状態は通常、JobコンテナとInitコンテナに適しています。
その他のよくある質問
ポッドは実行中の状態のままですが、通常どおり実行されません
ポッドYAMLファイルにエラーが含まれている場合、ポッドは実行状態のままである可能性がありますが、通常どおり実行されません。 この問題に対処するには、次の手順を実行します。
ポッドの構成を検査し、ポッド内のコンテナが期待どおりに構成されているかどうかを確認します。
次の方法を使用して、環境変数のキーにスペルミスが含まれているかどうかを確認します。
環境変数のキーにスペルミスが含まれている場合 (たとえば、
command
のスペルがcommnd
となっている場合) 、クラスターはスペルミスを無視し、YAMLファイルに基づいてポッドを作成できます。 ただし、コンテナーはYAMLファイルで指定されたコマンドを実行できません。次の例では、
command
をcommnd
と綴った場合にスペルミスを識別する方法を説明します。kubectl apply -f
コマンドの前に-- validate
を追加し、kubectl apply -- validate -f XXX.yaml
コマンドを実行します。スペルエラーが存在する場合、
XXX] unknownフィールド: commnd XXX] これは誤ったアラームである可能性があります。https:// gXXXb.XXX/6842pods/test
メッセージが表示されます。次のコマンドを実行して、チェックしたpod.yamlファイルをポッドの作成に使用したYAMLファイルと比較します。
説明[$Pod]
を異常ポッドの名前に置き換えます。kubectl get pods
コマンドを実行して名前を取得します。kubectl get pods [$Pod] -o yaml > pod.yaml
pod.yamlファイルに、ポッドの作成に使用された元のYAMLファイルよりも多くの行が含まれている場合は、ポッドが期待どおりに作成されます。
ポッドを作成するためのYAMLコマンドラインがpod.yamlファイルにない場合、元のYAMLファイルにスペルミスが含まれていることを意味します。
ポッドのログを確認し、ログデータに基づいて問題をトラブルシューティングします。
ターミナルを使用してポッドのコンテナにログインし、コンテナ内のローカルファイルを確認できます。
ポッドがデータベースにアクセスすると、ネットワーク切断の問題が発生することがあります
ACKクラスターのポッドがデータベースにアクセスしたときにネットワーク切断の問題が発生する場合は、次の操作を実行して問題のトラブルシューティングを行うことができます。
1. ポッドの確認
ポッドのイベントを表示し、ネットワーク例外、再起動、リソース不足に関連するイベントなど、不安定な接続イベントを確認します。
ポッドのログを表示し、接続タイムアウト、認証失敗、再接続などのデータベース接続エラーを確認します。
ポッドのCPUおよびメモリ使用率を表示します。 リソース不足のため、アプリケーションまたはデータベースドライバーが例外的に終了しないようにしてください。
ポッドのリソース要求と制限を表示します。 ポッドに十分なCPUおよびメモリリソースがあることを確認してください。
2. ノードの確認
ノードのリソース使用量を確認し、メモリやディスクリソースなどのリソースが十分であることを確認します。 詳細については、「ノードの監視」をご参照ください。
ノードとデータベース間でネットワークの切断が時折発生するかどうかをテストします。
3. データベースの確認
データベースのステータスとパフォーマンスメトリックを確認して、再起動やパフォーマンスのボトルネックが存在しないことを確認します。
異常な接続の数を表示し、タイムアウト期間の設定を確認し、ビジネス要件に基づいて設定を変更します。
データベースからの切断に関連するデータベースログを分析します。
4。 クラスタコンポーネントのステータスを確認する
クラスターコンポーネントの例外は、クラスター内のポッドと他のコンポーネント間の通信に影響します。 次のコマンドを実行して、ACKクラスター内のコンポーネントのステータスを確認します。
kubectl get pod -n kube-system # View the component status.
ネットワークコンポーネントを確認します。
CoreDNS: コンポーネントのステータスとログを確認します。 ポッドがデータベースサービスのアドレスを解析できることを確認します。
フランネル: kube-Flannelのステータスとログを確認します。
Terway: terway-eniipのステータスとログを確認します。
5。 ネットワークトラフィックの分析
tcpdump
を使用してパケットをキャプチャし、ネットワークトラフィックを分析して原因を特定できます。
次のコマンドを実行して、データベースの切断の問題が発生したポッドとノードを特定します。
kubectl get pod -n [namespace] -o wide
ノードにログインします。 詳細については、「ECSインスタンスへの接続方法」をご参照ください。
次のコマンドを実行して、異なるKubernetesバージョンに基づいてコンテナーPIDを照会します。
containerd (1.22以降のKubernetesバージョン)
次のコマンドを実行して、
コンテナ
を表示します。crictl ps |grep <Pod name keyword>
期待される出力:
CONTAINER IMAGE CREATED STATE a1a214d2***** 35d28df4***** 2 days ago Running
CONTAINER ID
パラメーターを指定し、次のコマンドを実行してコンテナーPIDを表示します。crictl inspect a1a214d2***** |grep -i PID
期待される出力:
"pid": 2309838, # The PID of the container. "pid": 1 "type": "pid"
Docker (Kubernetes 1.22以前)
次のコマンドを実行して、
コンテナID
を表示します。docker ps | grep <Pod name or keyword>
期待される出力:
CONTAINER ID IMAGE COMMAND a1a214d2***** 35d28df4***** "/nginx
CONTAINER ID
パラメーターを指定し、次のコマンドを実行してコンテナーのPIDを表示します。docker inspect a1a214d2***** |grep -i PID
期待される出力:
"Pid": 2309838, # The PID of the container. "PidMode": "", "PidsLimit": null,
packet captureコマンドを実行します。
コンテナーPIDに基づいて次のコマンドを実行し、ポッドとデータベース間で送信されるパケットをキャプチャします。
nsenter -t <Container PID> tcpdump -i any -n -s 0 tcp and host <IP address of the database>
コンテナーPIDに基づいて次のコマンドを実行し、ポッドとホスト間で送信されるパケットをキャプチャします。
nsenter -t <Container PID> tcpdump -i any -n -s 0 tcp and host <IP address of the node>
次のコマンドを実行して、ホストとデータベース間で送信されるパケットをキャプチャします。
tcpdump -i any -n -s 0 tcp and host <IP address of the database>
6. アプリケーションの最適化
自動再接続メカニズムをサポートするようにアプリケーションを構成し、データベースの変更や移行時にアプリケーションが手動操作なしで接続を自動的に復元できるようにします。
データベースとの通信には、短期間の接続ではなく永続的な接続を使用します。 パーシステント接続は、パフォーマンス損失およびリソース消費を大幅に低減し、システム全体の効率を高めることができる。
コンソールでのトラブルシューティング
ACKコンソールにログインし、クラスターの詳細ページに移動して、異常なポッドのトラブルシューティングを行います。
API 操作 | レイアウトのコンソール |
ポッドのステータスを確認する |
|
ポッドの基本情報を確認する |
|
ポッドの構成を確認する |
|
ポッドのイベントを確認する |
|
ポッドのログを確認する |
説明 ACKクラスターはSimple Log Serviceとインターフェイスします。 クラスターでSimple Log Serviceを有効にして、コンテナログをすばやく収集できます。 詳細については、「DaemonSetモードでのKubernetesコンテナーからのテキストログの収集」をご参照ください。 |
ポッドのモニタリング情報を確認する |
説明 ACKクラスターは、PrometheusのManaged Serviceとインターフェイスします。 ACKクラスターのManaged Service for Prometheusを有効にして、クラスターとクラスター内のコンテナーをリアルタイムで監視できます。 Managed Service for Prometheusを有効にすると、Grafanaダッシュボードに表示されるメトリックを表示できます。 詳細については、「Prometheusのマネージドサービス」をご参照ください。 |
ターミナルを使用してポッドのコンテナにログオンし、コンテナ内のローカルファイルを表示する |
|
ポッド診断の有効化 |
説明 Container Intelligent Serviceはクラスター診断機能を提供し、ポッド、サービス、およびIngressをワンクリックで診断し、原因を特定するのに役立ちます。 詳細については、「クラスター診断の操作」をご参照ください。 |