AKS クラスターのメモリ飽和状態のトラブルシューティング
この記事では、メモリ飽和の問題をトラブルシューティングする方法について説明します。 メモリの飽和は、少なくとも 1 つのアプリケーションまたはプロセスでコンテナー ホストが提供できるメモリよりも多くのメモリが必要な場合、またはホストが使用可能なメモリを使い果たした場合に発生します。
前提条件
- Kubernetes kubectl コマンドライン ツール。 Azure CLI を使用して kubectl をインストールするには、az aks install-cli コマンドを実行します。
現象
次の表は、メモリの飽和の一般的な症状の概要を示しています。
現象 | 説明 |
---|---|
スケジュールできないポッド | ノードが設定されたメモリ制限に近い場合、追加のポッドをスケジュールすることはできません。 |
ポッドの削除 | ノードのメモリが不足している場合、kubelet はポッドを削除できます。 コントロール プレーンは、リソースを持つ他のノードで削除されたポッドのスケジュールを変更しようとしますが、他のノードがこれらのポッドを実行するのに十分なメモリを持っているという保証はありません。 |
ノードの準備ができていない | メモリの飽和により、 kubelet と containerd が応答しなくなり、最終的にノードの準備の問題が発生する可能性があります。 |
メモリ不足 (OOM) の強制終了 | ポッドの削除がノードの問題を防ぐことができない場合、OOM の問題が発生します。 |
トラブルシューティングのチェックリスト
メモリの飽和を減らすには、効果的な監視ツールを使用し、ベスト プラクティスを適用します。
手順 1: メモリ飽和状態のノードを特定する
メモリ飽和状態のノードを識別するには、次のいずれかの方法を使用します。
Web ブラウザーで、Azure portal で AKS の Container Insights 機能を使用します。
コンソールで、Kubernetes コマンド ライン ツール (kubectl) を使用します。
Container Insights は、コンテナー ワークロードのパフォーマンスを監視する AKS 内の機能です。 詳細については、「 Azure Kubernetes Service (AKS) クラスターのコンテナー分析情報を有効」を参照してください。
Azure ポータルでKubernetes サービス検索して選択。
Kubernetes サービスの一覧で、クラスターの名前を選択します。
クラスターのナビゲーション ウィンドウで、 Monitoring 見出しを見つけて、 Insights を選択します。
適切な Time Range 値を設定します。
Nodes タブを選択します。
Metric リストで、Memory ワーキング セット (Allocatable から計算) を選択。
パーセンタイル セレクターで、サンプルを Max に設定し、 Max % 列ラベルを 2 回選択します。 このアクションにより、使用されたメモリの最大割合 (最大値から最小値) でテーブル ノードが並べ替えられます。
最初のノードのメモリ使用量が最も多いため、そのノードを選択して、ノードで実行されているポッドのメモリ使用量を調査します。
Note
ポッドの CPU またはメモリ使用量の割合は、コンテナーに指定された CPU 要求に基づいています。 ノードの CPU またはメモリ使用量の割合は表しません。 そのため、ポッドの CPU またはメモリ使用量の割合ではなく、実際の CPU またはメモリ使用量を確認します。
高いメモリを使用しているポッドを特定したので、ポッドで実行されているアプリケーションを識別できます。
手順 2: メモリの飽和を回避するためのベスト プラクティスを確認する
メモリの飽和を回避するためのベスト プラクティスを実装する方法については、次の表を参照してください。
ベスト プラクティス | 説明 |
---|---|
メモリ 要求と制限を使用する | Kubernetes には、コンテナーの最小メモリ サイズ (request) と最大メモリ サイズ (limit) を指定するオプションが用意されています。 ポッドに制限を構成することで、ノードのメモリ不足を回避できます。 実行されているすべてのポッドの制限の集計が、ノードの使用可能なメモリを超えないようにしてください。 この状況は、 overcommitting と呼ばれます。 Kubernetes スケジューラは、 サービスの品質 (QoS) を通じて、設定された要求と制限に基づいてリソースを割り当てます。 適切な制限がない場合は、スケジューラが 1 つのノードで多数のポッドをスケジュールしすぎる可能性があります。 その場合、最終的にノードがダウンする可能性があります。 さらに、kubelet はポッドを削除する際、メモリ使用量が定義済みの要求を超えているポッドを優先的に削除します。 メモリ要求は、実際の使用量に近い値に設定することをお勧めします。 |
horizontal ポッド オートスケーラーを有効にする | クラスターをスケーリングすることで、多数のポッド間で要求のバランスを取り、メモリ飽和状態を防ぐことができます。 この手法により、特定のノードのメモリ占有領域を減らすことができます。 |
anti-affinity タグを使用する | メモリが設計上制限されていないシナリオでは、ノード セレクターとアフィニティ タグまたはアンチアフィニティ タグを使用できます。これにより、ワークロードを特定のノードに分離できます。 アンチアフィニティ タグを使用すると、他のワークロードがそれらのノードでポッドをスケジュールできないようにすることができます。 これにより、メモリ飽和状態の問題が軽減されます。 |
higher SKU VM を選択する | 高いメモリ使用量を処理するには、ランダム アクセス メモリ (RAM) が多い仮想マシン (VM) のほうが適しています。 このオプションを使用するには、新しいノード プールを作成し、ノードを遮断し (それらをスケジュール不可にし)、既存のノード プールをドレインする必要があります。 |
システムとユーザーのワークロードを分離する | アプリケーションはユーザー ノード プールで実行することをお勧めします。 この構成により、Kubernetes 固有のポッドをシステム ノード プールに分離し、クラスターのパフォーマンスを維持することができます。 |
詳細
サードパーティの情報に関する免責事項
この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。
サードパーティのお問い合わせ窓口に関する免責事項
サードパーティのお問い合わせ窓口に関する情報は、ユーザーの便宜のために提供されているものであり、 この連絡先情報は、予告なしに変更される可能性があります。 マイクロソフトは、掲載されている情報に対して、いかなる責任も負わないものとします。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。