汎用のサーバーレス コンテナー プラットフォームを提供する Azure サービス。
Hey @sho sakai 、
メモリが80%近くまで上がっているにもかかわらずログに OOMKilled が出ていないケースでも、実はメモリ不足で再起動している可能性があります。それぞれのご質問についてまとめると以下のようになります。
- OOMKilled が出なくてもメモリが原因で再起動するケース
- Kubernetes のノード側でメモリプレッシャーが発生すると、Kubelet の「Eviction(追い出し)」機能によりコンテナが強制終了されることがあります。この場合、アプリ側のプロセス自体は「OOMKilled」ではなく「Evicted」として扱われたり、システムログに別のメッセージ(
kubelet eviction manager関連)が出力されたりします。 - Azure Container Apps や App Service on Arc 環境でも、プラットフォーム側で割り当てメモリ以上の使用が疑われるとコンテナを再起動する仕組みが働くことがありますが、必ずしも
OOMKilledという文字列が残らない場合があります。
- Kubernetes のノード側でメモリプレッシャーが発生すると、Kubelet の「Eviction(追い出し)」機能によりコンテナが強制終了されることがあります。この場合、アプリ側のプロセス自体は「OOMKilled」ではなく「Evicted」として扱われたり、システムログに別のメッセージ(
- Azure 側で再起動の原因を特定するには
- 「診断とソルブ (Diagnose and solve problems)」ブレードの Web App Restarted(または App Service on Arc の Restarted ディテクタ)を使うと、再起動のタイムラインと原因候補(ユーザー操作/構成変更/スケーリング/プラットフォームメンテナンス など)が見られます。
- Log Analytics ワークスペースを使って、システムログ(Kubelet、Container Runtime)とアプリケーションログを横断的にクエリすると、Eviction やコンテナクラッシュの詳細メッセージを確認できます。
- Azure ポータルのアクティビティ ログで「Update web sites config」などの設定変更イベントを探すと、そのタイミングで自動再起動が走っていないかもチェックできます。
- 再起動を抑える構成案
- Kubernetes リソースの requests/limits を適切に設定し、ノード側のリソース過負荷を防ぐ
- Horizontal Pod Autoscaler/Cluster Autoscaler の導入により、負荷に応じたスケールアウト/ノード追加を自動化
- アプリの Liveness Probe や Readiness Probe をチューニングし、起動時間やメモリ消費がピークになるタイミングで誤検知による再起動を防止
- App Service on Arc であれば Health check 機能を有効化し、準備完了前のトラフィックを別インスタンスへ振り分け
- 複数インスタンス(レプリカ数)を持たせ、1つのレプリカが落ちてもサービス全体への影響を最小限にする
参考ドキュメント
- App Service on Arc:ログの取得と分析 https://docs.microsoft.com/azure/app-service/manage-create-arc-environment#install-the-app-service-extension
- Kubernetes クラスタ監視 (Container insights) https://docs.microsoft.com/azure/azure-monitor/containers/container-insights-analyze
これらをもとにログを再度あたってみて、Eviction イベントやプローブ失敗の痕跡がないか確認してみてください!
お役に立てば幸いです!
もしこの解決策が役に立った場合は、 をクリックし、「この回答は役に立ちましたか」に対して「はい」をクリックしてください。また、さらにご質問がある場合は、お知らせください。