Share via


AKS クラスターでのメモリ飽和のトラブルシューティング

この記事では、メモリ飽和の問題のトラブルシューティング方法について説明します。 メモリ飽和は、少なくとも 1 つのアプリケーションまたはプロセスでコンテナー ホストが提供できるメモリを超えるメモリが必要な場合、またはホストが使用可能なメモリを使い果たす場合に発生します。

前提条件

現象

次の表は、メモリ飽和の一般的な症状の概要を示しています。

現象 説明
スケジュールできないポッド ノードが設定されたメモリ制限に近い場合、追加のポッドをスケジュールすることはできません。
ポッドの削除 ノードがメモリ不足の場合、kubelet はポッドを削除できます。 コントロール プレーンは、リソースを持つ他のノードで削除されたポッドを再スケジュールしようとしますが、他のノードがこれらのポッドを実行するのに十分なメモリを持っている保証はありません。
ノードの準備ができていない メモリの飽和により kubelet 、 と containerd が応答しなくなる可能性があり、最終的にはノードの準備の問題が発生します。
メモリ不足 (OOM) の強制終了 ポッドの削除がノードの問題を防ぐことができない場合、OOM の問題が発生します。

トラブルシューティング チェックリスト

メモリの飽和を減らすには、効果的な監視ツールを使用し、ベスト プラクティスを適用します。

手順 1: メモリ飽和状態のノードを特定する

メモリ飽和状態のノードを識別するには、次のいずれかの方法を使用します。

  • Web ブラウザーで、Azure portalで AKS の Container Insights 機能を使用します。

  • コンソールで、Kubernetes コマンド ライン ツール (kubectl) を使用します。

Container Insights は、コンテナー ワークロードのパフォーマンスを監視する AKS 内の機能です。 詳細については、「Azure Kubernetes Service (AKS) クラスターのコンテナー分析情報を有効にする」を参照してください。

  1. Azure portalで、Kubernetes サービスを検索して選択します。

  2. Kubernetes サービスの一覧で、クラスターの名前を選択します。

  3. クラスターのナビゲーション ウィンドウで、[ 監視 ] 見出しを見つけて、[ 分析情報] を選択します。

  4. 適切な [時間範囲] の値を設定します。

  5. [ ノード ] タブを選択します。

  6. [ メトリック ] の一覧で、[ メモリ ワーキング セット] (割り当て可能から計算) を選択します。

  7. パーセンタイル セレクターで、サンプルを Max に設定し、 最大 % 列ラベルを 2 回選択します。 このアクションにより、テーブル ノードが、使用されるメモリの最大割合 (最大値から最小) で並べ替えられます。

    Azure portal Azure Kubernetes Service (AKS) クラスター内の Container Insights の [ノード] ビューのスクリーンショット。

  8. 最初のノードのメモリ使用量が最も多いため、そのノードを選択して、ノードで実行されているポッドのメモリ使用量を調査します。

    Azure portal Azure Kubernetes Service (AKS) クラスター内の Container Insights の [ノード] ビューのノードのコンテナーのスクリーンショット。

    注:

    ポッドの CPU またはメモリ使用量の割合は、コンテナーに対して指定された CPU 要求に基づいています。 これは、ノードの CPU またはメモリ使用量の割合を表しません。 そのため、ポッドの CPU またはメモリ使用量の割合ではなく、実際の CPU またはメモリ使用量を確認します。

高いメモリを使用しているポッドを特定したので、ポッドで実行されているアプリケーションを特定できます。

手順 2: メモリの飽和を回避するためのベスト プラクティスを確認する

メモリ飽和を回避するためのベスト プラクティスを実装する方法については、次の表を参照してください。

ベスト プラクティス 説明
メモリ 要求と制限を使用する Kubernetes には、コンテナーの最小メモリ サイズ (要求) と最大メモリ サイズ (制限) を指定するオプションが用意されています。 ポッドの制限を構成することで、ノードのメモリ負荷を回避できます。 実行中のすべてのポッドの集計制限が、ノードの使用可能なメモリを超えていないことを確認します。 この状況を オーバーコミットと呼びます。 Kubernetes スケジューラは、 サービス品質 (QoS) を通じて、設定された要求と制限に基づいてリソースを割り当てます。 適切な制限がないと、スケジューラは、1 つのノード上のポッドの数が多すぎる可能性があります。 これにより、最終的にノードがダウンする可能性があります。 さらに、kubelet はポッドを削除していますが、メモリ使用量が定義された要求を超えるポッドに優先順位を付けます。 メモリ要求は、実際の使用量に近い値に設定することをお勧めします。
ポッドの水平オートスケーラーを有効にする クラスターをスケーリングすることで、多くのポッド間で要求のバランスを取り、メモリの飽和を防ぐことができます。 この手法により、特定のノードのメモリ 占有領域を減らすことができます。
アンチアフィニティ タグを使用する メモリが設計上無制限のシナリオでは、ノード セレクターとアフィニティタグまたはアンチアフィニティ タグを使用できます。これにより、ワークロードを特定のノードに分離できます。 アンチアフィニティ タグを使用すると、他のワークロードがこれらのノードでポッドをスケジュールできないようにすることができます。 これにより、メモリ飽和の問題が軽減されます。
より高い SKU VM を選択する ランダム アクセス メモリ (RAM) が多い仮想マシン (VM) は、メモリ使用率の高い処理に適しています。 このオプションを使用するには、新しいノード プールを作成し、ノードを切断して (スケジュールを解除して)、既存のノード プールをドレインする必要があります。
システムとユーザーのワークロードを分離する ユーザー ノード プールでアプリケーションを実行することをお勧めします。 この構成により、Kubernetes 固有のポッドをシステム ノード プールに分離し、クラスターのパフォーマンスを維持できます。

詳細

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。

サードパーティのお問い合わせ窓口に関する免責事項

Microsoft では、このトピックに関する追加情報を見つけるのに役立つサード パーティの連絡先情報を提供しています。 将来予告なしに変更されることがあります。 Microsoft は、第三者の連絡先情報の正確性を保証しません。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。