すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:スケジューリングに関するよくある質問

最終更新日:Nov 09, 2025

このトピックでは、ACK クラスターのスケジューリングポリシーを使用する際の一般的な問題とその解決策について説明します。

カテゴリ

説明

リンク

一般

一般的なスケジューリングの問題

負荷認識スケジューリング

QoS

ack-koordinator コンポーネントに関連する問題

Descheduling

その他

一般的な FAQ

vSwitch の IP アドレス不足による Pod の起動失敗を防ぐにはどうすればよいですか?

原因

ネイティブの Kubernetes スケジューラは、ノードで利用可能な IP アドレスの数を検出できません。これにより、システムが IP リソースが不十分なノードに Pod をスケジューリングする可能性があります。その結果、Pod の起動に失敗し、短時間で多くの異常な Pod が作成されます。

解決策

この問題を解決するために、ACK Scheduler は k8s.aliyun.com/max-available-ip アノテーションを使用して、各ノードで利用可能な IP アドレスの最大数をマークします。このアノテーションと、Pod が独立した IP アドレスを必要とするかどうかに基づいて、スケジューラはそのノードにスケジューリングできる Pod の数を制限します。さらに、ノードの IP リソースが枯渇した場合、スケジューラはノードのステータスにある SufficientIP 条件を更新します。これにより、独立した IP アドレスを必要とする新しい Pod がそのノードにスケジューリングされるのを防ぎ、IP リソースの不足による大規模な Pod の障害を効果的に防止します。

この機能は、kube-scheduler コンポーネントによって自動的に有効になります。ただし、クラスターと kube-scheduler コンポーネントは、次の要件を満たす必要があります。

  • クラスターは ACK マネージドクラスター Pro 版であり、ネットワークプラグインは Terway で、Terway のバージョンは v1.5.7 以降です。詳細については、「ACK マネージドクラスターの作成」をご参照ください。

  • kube-scheduler のバージョンは、次の要件を満たす必要があります。

    クラスターバージョン

    kube-scheduler バージョン

    1.30 以降

    すべてのバージョンがサポートされています。

    1.28

    v1.28.3-aliyun-6.3 以降

    1.26

    v1.26.3-aliyun-6.3 以降

    1.24

    v1.24.6-aliyun-6.3 以降

    1.22

    v1.22.15-aliyun-6.3 以降

ack-deschedulerKoordinator Descheduler に移行するにはどうすればよいですか?

ack-descheduler コンポーネントはメンテナンスされなくなりました。詳細については、「コンポーネントのお知らせ: ack-descheduler コンポーネントの移行」をご参照ください。アクティブにメンテナンスされている Koordinator Descheduler コンポーネントへの移行を推奨します。移行プロセスは、Kubernetes Descheduler を Koordinator Descheduler に移行するのと同様です。詳細については、「Kubernetes Descheduler を Koordinator Descheduler に移行する」をご参照ください。

Container Service for Kubernetes (ACK) は、マーケットプレイスで ack-descheduler コンポーネントを提供しています。このコンポーネントは、オープンソースの Kubernetes Descheduler に基づいています。ack-descheduler のバージョン 0.20.0 と 0.27.1 が利用可能です。これらは、対応するオープンソースの Kubernetes Descheduler バージョンと同じ機能を提供し、同じ方法で使用されます。

ACK Scheduler のデフォルトのスケジューリングポリシーは何ですか?

ACK クラスターでは、ACK Scheduler のデフォルトのスケジューリングポリシーは、コミュニティの Kubernetes スケジューラと一致しています。Kubernetes スケジューラが Pod をノードにスケジューリングする方法を決定する際、プロセスには通常、フィルタースコアという 2 つの主要なステップが含まれます。

  • フィルター: Pod をスケジューリングできるノードをフィルタリングします。フィルタリングされたリストが空の場合、Pod はスケジューリングできません。

  • スコア: フィルタリング後、スケジューラはスケジューリング可能なノードをスコアリングしてランク付けし、Pod に最も適したノードを選択します。

ACK Scheduler の最新バージョンで有効になっているフィルターおよびスコアプラグインの詳細については、「フィルターおよびスコアプラグインの概要」をご参照ください。

Pod のスケジューリング中にリソース使用率の高いノードを回避するにはどうすればよいですか?

ネイティブの Kubernetes スケジューリングポリシーでは、スケジューラはノードの実際のリソース使用率ではなく、リソースリクエストに基づいて決定を下します。さらに、さまざまなフィルターおよびスコアプラグインがスケジューリング結果に影響します。ACK クラスターが提供する以下の機能を使用して、Pod がリソース使用率の高いノードにスケジューリングされるのを防ぐことができます。

  • 各 Pod に適切なリソースリクエストと制限を設定し、リソースの冗長性を計画します。リソースプロファイリング機能を使用して、過去のリソース使用量データに基づいて推奨されるコンテナー仕様を取得できます。詳細については、「リソースプロファイリング」をご参照ください。

  • 負荷認識 Pod スケジューリング機能を有効にします。ACK が提供する kube-scheduler コンポーネントの負荷認識 Pod スケジューリング機能は、Kubernetes スケジューリングフレームワークに基づいています。ネイティブの Kubernetes スケジューリングポリシーとは異なり、ACK Scheduler はノードの実際のリソース使用量を認識できます。ノードの負荷データを分析し、新しい Pod のリソース要件を推定し、負荷の低いノードに Pod を優先的にスケジューリングして負荷分散を実現します。詳細については、「負荷認識スケジューリング」をご参照ください。

  • 負荷認識ホットスポット Descheduling を有効にします。ノードの使用率は、クラスター環境、ワークロードのトラフィック、またはリクエストの変動により、時間とともに動的に変化します。これにより、クラスター内のノード間の負荷バランスが崩れる可能性があります。これに対処するため、ACK Scheduler は極端な負荷の不均衡を防ぐための Descheduling 機能を提供します。詳細については、「負荷認識ホットスポット Descheduling の使用」をご参照ください。

新しいノードがクラスターに追加されました。なぜ Pod はそこにスケジューリングされないのですか?

この問題はいくつかの理由で発生する可能性があります。次のように問題をトラブルシューティングできます。

  1. ノードのステータスが正常かどうかを確認します。ノードが `NotReady` 状態の場合、Pod を受け入れることはできません。

  2. Pod に `NodeSelector`、`NodeAffinity`、`PodAffinity` などのスケジューリングポリシーがあるか、または新しいノードへのスケジューリングを妨げる Taint があるかを確認します。

  3. 問題がネイティブの Kubernetes スケジューリングポリシーに関連しているかどうかを評価します。ネイティブの Kubernetes スケジューリングポリシーでは、スケジューラはノードの実際のリソース使用率ではなく、リソースリクエストに基づいて決定を下します。これにより、一部のノードは多くの Pod を実行しているのに対し、他のノードはほとんどまたはまったく Pod を実行していないという結果になる可能性があります。

    この問題の解決策の詳細については、「Pod のスケジューリング中にリソース使用率の高いノードを回避するにはどうすればよいですか?」をご参照ください。

クラスター全体の利用率が高くないのに、CPU またはメモリの不足によりスケジューリングが失敗するのはなぜですか?

ネイティブの Kubernetes スケジューリングポリシーでは、スケジューラはノードの実際のリソース使用率ではなく、リソースリクエストに基づいて決定を下します。したがって、クラスターの実際の CPU 使用率が高くなくても、CPU またはメモリの不足により Pod のスケジューリングが失敗する可能性があります。

この問題の解決策の詳細については、「Pod のスケジューリング中にリソース使用率の高いノードを回避するにはどうすればよいですか?」をご参照ください。

ACK で Descheduling 機能を使用する際に知っておくべきことは何ですか? Pod は再起動されますか?

ACK は Koordinator Descheduler を通じて Descheduling 機能を提供します。Descheduling 機能を使用する際は、次の点に注意してください。

  • Koordinator Descheduler は、実行中の Pod のエビクションのみを担当し、その再作成や後続のスケジューリングは行いません。エビクション後の Pod の再作成は、Deployment や StatefulSet などの対応するワークロードコントローラーによって処理されます。再作成された Pod のスケジューリングは、スケジューラによって処理されます。

  • Descheduling 中、新しい Pod が作成される前に古い Pod がエビクションされます。エビクション中にアプリケーションの可用性に影響を与えないように、アプリケーションに十分な数のレプリカ (replicas) があることを確認してください。

詳細については、「Descheduling」をご参照ください。

アプリケーションを特定のノードにスケジューリングするにはどうすればよいですか?

ノードにラベルを追加し、アプリケーションの YAML ファイルに対応する nodeSelector を追加することで、アプリケーションを特定のノードにスケジューリングできます。詳細については、「アプリケーションを特定のノードにスケジューリングする」をご参照ください。

Deployment で、特定の数の Pod を ECS に、特定の数の Pod を ECI にスケジューリングするにはどうすればよいですか?

ECS と ECI リソースを一緒に使用するシナリオでは、UnitedDeployment を使用してワークロード管理用のサブセットを定義できます。たとえば、UnitedDeployment の YAML ファイルで、subset-ecs の replicas10 に、subset-eci の replicas10 に設定できます。詳細については、「UnitedDeployment に基づいてワークロードをスケーリングする」をご参照ください。

スケジューリング中にワークロードの Pod の高可用性を確保するにはどうすればよいですか?

ポッドアフィニティを使用して、ワークロードの Pod を異なるゾーンまたはノードに分散させることができます。たとえば、Pod の YAML ファイルに次のフィールドを追加して、preferredDuringSchedulingIgnoredDuringExecution ルールを宣言できます。このルールは、security=S2 ラベルを持つ Pod を異なるゾーンにスケジューリングしようとします。この条件が満たせない場合、スケジューラは Pod を他のノードにスケジューリングしようとします。

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone

詳細については、Kubernetes ドキュメントの「podAffinity と podAntiAffinity」および「Pod トポロジースプレッド制約」をご参照ください。

負荷認識スケジューリングに関する FAQ

新しく作成された Pod のバッチについて、なぜそれらすべてが最も負荷の低いノードにスケジューリングされないのですか?

スケジューラが新しく作成された Pod のバッチを現在の負荷が最も低いノードにスケジューリングすると、新しい Pod が起動した後にノードの負荷が増加するため、そのノードがすぐにホットスポットになる可能性があります。

したがって、負荷認識スケジューリングプラグインがノードスコアを計算する際、まだ使用率が報告されていない新しい Pod があるノードのスコアを調整します。これにより、過剰なスケジューリングと新しいホットスポットの作成を防ぎます。

ノードの負荷レベル以外に、スケジューリング結果に影響を与える他の要因は何ですか?

Kubernetes スケジューラは複数のプラグインで構成されています。スケジューリング中、アフィニティプラグインやトポロジースプレッドプラグインなど、多くのプラグインがノードのスコアリングとランク付けに参加します。ノードの最終的なランク付けは、これらすべてのプラグインの影響を受けます。必要に応じて、各プラグインのスコアリングの重みを調整できます。

スケジューラが新しいバージョンにアップグレードされた後、古いプロトコルを使用する負荷認識スケジューリング機能はまだサポートされていますか?

古いバージョンの負荷認識スケジューリング機能を使用するには、Pod にアノテーション alibabacloud.com/loadAwareScheduleEnabled: "true" を追加する必要があります。

ACK Scheduler は古いプロトコルと互換性があり、新しいバージョンへのシームレスなアップグレードが可能です。アップグレード後、スケジューラにグローバルな負荷分散スケジューリングポリシーを有効にして、Pod 設定の変更を減らすことができます。詳細については、「ステップ 1: 負荷認識スケジューリングを有効にする」をご参照ください。

重要

ACK Scheduler バージョン 1.22 は古いプロトコルとの互換性を維持します。バージョン 1.24 については、互換性は 2023 年 8 月 30 日に終了しました。クラスターのバージョンをアップグレードし、負荷認識スケジューリング機能の新しい設定方法を使用する必要があります。クラスターのアップグレードの詳細については、「クラスターを手動でアップグレードする」をご参照ください。

以下の表は、プロトコルのサポートとコンポーネントのバージョン要件を示しています。

1.26 以降

ACK Scheduler バージョン

ack-koordinator (ack-slo-manager) バージョン要件

Pod アノテーションプロトコル

コンソールパラメーターの切り替え

すべての ACK Scheduler バージョン

1.1.1-ack.1 以降

サポート対象外

サポート対象

1.24

ACK Scheduler バージョン

ack-koordinator (ack-slo-manager) バージョン要件

Pod アノテーションプロトコル

コンソールパラメーターの切り替え

v1.24.6-ack-4.0 以降

1.1.1-ack.1 以降

サポート

サポート対象

v1.24.6-ack-3.1 以降、v1.24.6-ack-4.0 未満

0.8.0 以降

サポート対象

サポート対象外

1.22 以前

ACK Scheduler バージョン

ack-koordinator (ack-slo-manager) バージョン要件

Pod アノテーションプロトコル

コンソールパラメーターの切り替え

1.22.15-ack-4.0 以降

1.1.1-ack.1 以降

サポート

サポート対象

1.22.15-ack-2.0 以降、1.22.15-ack-4.0 未満

0.8.0 以降

サポート対象

サポート対象外

  • v1.20.4-ack-4.0 以降、v1.20.4-ack-8.0 以前

  • v1.18-ack-4.0

0.3.0 以降、0.8.0 未満

サポート対象

サポート対象外

QoS に関する FAQ

CPU Burst 設定を有効にした後、なぜ Pod はまだスロットリングされるのですか?

この問題はいくつかの理由で発生する可能性があります。以下の解決策を参照して調整を行ってください。

  • 設定形式が正しくないため、CPU Burst ポリシーが有効になっていません。詳細については、「高度なパラメーター設定」を参照して設定を修正し、確認してください。

  • CPU 使用率が cfsQuotaBurstPercent で指定された上限に達した場合、CPU リソースが不足しているため、CPU スロットリングが依然として発生します。

    アプリケーションの実際の要件に基づいて、リクエストとリミットの値を調整してください。

  • CPU Burst ポリシーは、Pod の 2 つの cgroup パラメーターを調整します: cpu.cfs_quota_uscpu.cfs_burst_us。詳細については、「高度なパラメーター設定」をご参照ください。cpu.cfs_quota_us パラメーターは、ack-koordinator が CPU スロットリングを検出した後にのみ設定されるため、わずかな遅延が発生します。対照的に、cpu.cfs_burst_us パラメーターは設定に基づいて直接設定され、より応答性が高くなります。

    より良いパフォーマンスを得るために、この機能を Alibaba Cloud Linux オペレーティングシステムと共に使用してください。

  • CPU Burst ポリシーには、cpu.cfs_quota_us を調整するための保護メカニズムが含まれており、sharePoolThresholdPercent パラメーターを使用してマシンの安全しきい値を定義します。マシン全体の利用率が高くなりすぎると、cpu.cfs_quota_us は初期値にリセットされ、単一の Pod が過度の干渉を引き起こすのを防ぎます。

    ノードの高い利用率がアプリケーションのパフォーマンスに影響を与えないように、アプリケーションの要件に基づいてノードの安全しきい値を設定する必要があります。

CPU Burst ポリシーを有効にするには Alibaba Cloud Linux が必要ですか?

ack-koordinator の CPU Burst ポリシーは、すべての Alibaba Cloud Linux および CentOS オープンソースカーネルと互換性があります。ただし、Alibaba Cloud Linux の使用を推奨します。Alibaba Cloud Linux カーネルの機能を活用することで、ack-koordinator はより詳細な CPU 弾力性管理メカニズムを提供できます。詳細については、「cgroup v1 インターフェイスで CPU Burst 機能を有効にする」をご参照ください。

アプリケーションが Batch リソースを使用した後、なぜそのメモリ使用量が急に増加するのですか?

Batch メモリ制限 (kubernetes.io/batch-memory) で設定されたアプリケーションの場合、ack-koordinator はコンテナーが作成された後にコンテナーの cgroup メモリ制限を設定します。一部のアプリケーションは、起動時に cgroup 制限に基づいてメモリを要求します。アプリケーションが ack-koordinator が cgroup 制限を設定する前に起動した場合、その実際のメモリ使用量は意図した Batch メモリ制限を超える可能性があります。オペレーティングシステムはプロセスのメモリ使用量をすぐには削減しません。その結果、実際の使用量が Batch メモリ制限を下回るまで cgroup メモリ制限を適用できません。

この場合、アプリケーションの設定パラメーターを調整して、そのメモリ使用量を Batch 制限以下に制御できます。または、アプリケーションの起動スクリプトでメモリ制限パラメーターを確認し、アプリケーションが起動する前に設定されていることを確認します。これにより、アプリケーションのメモリ使用量が合理的に制限され、メモリ不足 (OOM) エラーなどの問題を防ぐことができます。

コンテナーで次のコマンドを実行して、メモリリソース制限パラメーターを表示できます。

# 単位はバイトです。
cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
# 期待される出力。
1048576000

CPU コア数を増やした後、なぜパフォーマンスが低下し、Pod で CPU スロットリングの問題が発生するのですか?

症状

アプリケーションが ACK クラスターにデプロイされました。8 コアの CPU 割り当てで、ストレステストでは 33 クエリ/秒 (QPS) と平均応答時間 29 ms を示しました。Pod の CPU リソースを 12 コアに増やすと、QPS は 9.6 に低下し、平均応答時間は 104 ms に増加し、大幅なパフォーマンス低下を示しました。モニタリングでは、12 コア Pod の CPU スロットリングはほぼ 100% であったのに対し、8 コア Pod のスロットリングはわずか 0.15% でした。ack-koordinator を使用して CPU トポロジー認識スケジューリングやコアバインディングなどの最適化を適用した後でも、12 コア Pod は 8 コア Pod よりもパフォーマンスが悪く、CPU スロットリングが持続しました。しかし、アプリケーションを ECS インスタンスに直接デプロイした場合は期待どおりに動作しました。

原因

  • Linux カーネルの Completely Fair Scheduler (CFS) には、cgroup スケジューリングに関する歴史的なバグが存在します。CentOS 7 の 3.10 カーネルなど、4.19 より前のカーネルバージョンでは、各 CPU コアはスケジューリング期間ごとに 1 ms のクォータを予約します。このクォータが期間内に使用されない場合、迅速に回収されません。Pod に割り当てられる CPU コアが多いほど、CPU クォータの累積損失が大きくなります。これにより、全体的に利用可能な CPU リソースが減少し、CPU スロットリングが発生してサービスパフォーマンスに影響を与える可能性があります。

  • メカニズム: コア数の多い Pod の場合、100 ms のスケジューリング期間ごとに (n-1) ms の CPU 時間がサービスで使用できなくなります。ここで n は割り当てられた CPU コアの数です。これにより、実際のサービスパフォーマンスが低下する一方で CPU 使用率が増加します。

  • 実際の動作: Pod の CPU 使用率が上限に達していなくても、CPU スロットリングが発生し、レイテンシの増加とパフォーマンスの低下につながる可能性があります。モニタリングデータでは、CFS スケジューリング下での総時間に対するスロットリング時間の比率を表す container_cpu_cfs_throttled_periods_totalcontainer_cpu_cfs_periods_total の比率が異常に増加します。

解決策

方法 1 (推奨): オペレーティングシステムのカーネルをアップグレードする
方法 2: コンテナーの CPU Burst 機能を使用して最適化する
  • ack-koordinatorCPU Burst 機能を使用して、アイドル状態のコンテナーの CPU リソースを予約し、バースト時に使用して CPU スロットリングのパフォーマンスへの影響を軽減します。

  • これは最適化策です。根本的な解決策はカーネルをアップグレードすることです。

方法 3: コンテナーの CPU スケジューリングポリシーを最適化する
  • ack-koordinatorCPU トポロジー認識スケジューリング機能を使用して CPU ピニングを実行し、スケジューリングの安定性を向上させ、CPU スロットリングによって引き起こされる問題を軽減します。

  • Pod に割り当てられる CPU コアの数を減らして、期間ごとのクォータ損失を減少させます。

  • これは最適化策です。根本的な解決策はカーネルをアップグレードすることです。

レガシーな ack-slo-manager プロトコルの動的リソースオーバーコミット機能は、ack-koordinator コンポーネントへのアップグレード後もサポートされますか?

古いバージョンの動的リソースオーバーコミットプロトコルには、2 つの部分が含まれます:

  • Pod の alibabacloud.com/qosClass アノテーション。

  • Pod のリクエストとリミット内の alibabacloud.com/reclaimed リソース。

ack-koordinator は、前述の古いプロトコルと互換性があり、ACK Pro マネージドクラスターのスケジューラで新旧両方のプロトコルのリソースリクエストと利用可能なリソースを統一的に計算します。コンポーネントを ack-koordinator にシームレスにアップグレードできます。

説明

ack-koordinator での以前のプロトコルバージョンのサポートは、2023 年 7 月 30 日に終了します。以前のプロトコルバージョンで使用されていたリソースパラメーターを、最新バージョンのものに置き換えることを強く推奨します。

ACK Pro マネージドクラスターのスケジューラと ack-koordinator は、次のように異なるプロトコルバージョンをサポートしています。

スケジューラバージョン

ack-koordinator バージョン (ack-slo-manager)

alibabacloud.com プロトコル

koordinator.sh プロトコル

1.18 以降、1.22.15-ack-2.0 未満

0.3.0 以降

サポート対象

サポート対象外

1.22.15-ack-2.0 以降

0.8.0 以降

サポート対象

サポート対象

ack-slo-manager の古いプロトコルで CPU Burst 機能を使用している場合、ack-koordinator へのアップグレード後もサポートされますか?

以前のバージョンの Pod プロトコルでは、Annotation に alibabacloud.com/cpuBurst を指定する必要があります。ack-koordinator はこの以前のバージョンと完全に互換性があり、コンポーネントを新しいバージョンにシームレスにアップグレードできます。

説明

ack-koordinator での以前のプロトコルバージョンのサポートは、2023 年 7 月 30 日に終了します。以前のプロトコルバージョンで使用されていたリソースパラメーターを、最新バージョンのものに置き換えることを強く推奨します。

ack-koordinator と異なるプロトコルバージョンとの互換性は次のとおりです。

ack-koordinator バージョン

alibabacloud.com プロトコル

koordinator.sh プロトコル

0.2.0 以降

サポート対象

サポート対象外

0.8.0 以降

サポート対象

サポート対象

ack-slo-manager の古いプロトコルで CPU QoS 機能を使用しています。この機能は ack-koordinator にアップグレードした後もサポートされますか?

古い Pod プロトコル (バージョン 0.8.0 以前) では、Pod に alibabacloud.com/qosClass アノテーションを追加することで CPU QoS が有効になります。

ack-koordinator は古いプロトコルとの互換性を維持しています。コンポーネントを ack-koordinator にシームレスにアップグレードし、Pod を徐々に koordinator.sh プロトコルに切り替えることができます。ack-koordinator は、2023 年 7 月 30 日までこれらの古いプロトコルとの互換性を維持します。元のプロトコルのリソースフィールドを速やかに新しいバージョンにアップグレードすることをお勧めします。

ack-koordinator の異なるバージョンでの CPU QoS 機能のサポートは次のとおりです。

コンポーネントバージョン

alibabacloud.com プロトコル

koordinator.sh プロトコル

0.5.2 以降、0.8.0 未満

サポート対象

サポート対象外

0.8.0 以降

サポート対象

サポート対象

ack-slo-manager のレガシープロトコルから ack-koordinator にアップグレードした後も、コンテナーメモリ QoS 機能はサポートされますか?

古い Pod プロトコル (バージョン 0.8.0 以前) には以下が含まれます:

  • Pod の alibabacloud.com/qosClass アノテーション。

  • Pod の alibabacloud.com/memoryQOS アノテーション。

ack-koordinator は以前のプロトコルバージョンと互換性があり、コンポーネントを ack-koordinator にシームレスにアップグレードできます。下位互換性は 2023 年 7 月 30 日までサポートされます。元のプロトコルのリソースフィールドを速やかに新しいバージョンにアップグレードすることをお勧めします。

ack-koordinator は、異なるバージョンでメモリ QoS 機能を次のようにサポートしています。

コンポーネントバージョン

alibabacloud.com プロトコル

koordinator.sh プロトコル

0.3.0 以降、0.8.0 未満

サポート対象

サポート対象外

0.8.0 以降

サポート対象

サポート対象

Descheduling に関する FAQ

ノードの使用率がしきい値に達しましたが、ノード上の Pod がエビクションされません。どうすればよいですか?

この問題はいくつかの理由で発生する可能性があります。以下の解決策を参照して調整を行ってください。

原因のカテゴリ

原因の説明

解決策

コンポーネント設定が有効でない

スコープが指定されていない

Descheduler の設定には、Pod とノードのスコープ設定が含まれます。対応する名前空間とノードで Descheduling が有効になっているか確認してください。

設定変更後に Descheduler が再起動されていない

Descheduler の設定を変更した後、変更を有効にするには Descheduler を再起動する必要があります。Descheduler の再起動方法の詳細については、「ステップ 2: Descheduling プラグインを有効にして、リソース使用率の高いノードに Pod を分散させる」をご参照ください。

ノードの状態が条件を満たしていない

ノードの平均使用率が長期間しきい値を下回っている

Descheduler は一定期間にわたってリソース使用率を継続的に監視し、平均値を計算します。Descheduling は、平均値が特定の期間しきい値を超え続けた場合にのみトリガーされます。デフォルトの期間は 10 分です。しかし、kubectl top node が返す使用率は直近 1 分間のものです。より長い期間にわたってリソース使用率を監視し、必要に応じてホットスポット検出の頻度と検出間隔を調整することをお勧めします。

クラスターの残存容量が不足している

Pod をエビクションする前に、Descheduler はクラスター内の他のノードをチェックして、移行に十分な容量があることを確認します。たとえば、8 コアと 16 GB のメモリを必要とする Pod がエビクション対象として選択されたが、その容量を持つ他のノードがない場合、Descheduler は安全上の理由から Pod を移行しません。この問題は、ノードを追加してクラスターの容量を確保することで解決できます。

ワークロードのプロパティ制約

ワークロードが単一レプリカである

単一レプリカアプリケーションの高可用性を確保するため、その Pod はデフォルトでは Descheduling されません。これらのアプリケーションが Descheduling 可能であると判断した場合、Pod または Deployment や StatefulSet などのワークロードの `TemplateSpec` に descheduler.alpha.kubernetes.io/evict: "true" アノテーションを追加できます。

説明

このアノテーションは、バージョン v1.3.0-ack1.6、v1.3.0-ack1.7、または v1.3.0-ack1.8 ではサポートされていません。コンポーネントを最新バージョンにアップグレードしてください。詳細については、「コンポーネントのインストールと管理」をご参照ください。

Pod が HostPath または EmptyDir を指定している

安全上の理由から、`HostPath` または `EmptyDir` を指定する Pod はデフォルトでは Descheduling されません。それらを移行できるようにするには、`evictLocalStoragePods` 設定を使用できます。詳細については、「エビクションと移行の制御設定」をご参照ください。

利用不可または移行中のレプリカが多すぎる

Deployment や StatefulSet などのワークロードで、利用不可または移行中のレプリカの数が設定された制限 (maxUnavailablePerWorkload または `maxMigratingPerWorkload`) を超える場合、Descheduler はエビクションを開始しません。たとえば、maxUnavailablePerWorkloadmaxMigratingPerWorkload の両方が 20% に設定され、Deployment の希望レプリカ数が 10 で、2 つの Pod がすでにエビクションまたはデプロイ中である場合、Descheduler は別の Pod をエビクションしません。現在の Pod のエビクションまたはデプロイが完了するのを待つか、これら 2 つの設定の値を増やすことができます。

レプリカ数の制約設定が正しくない

ワークロードの総レプリカ数が maxMigratingPerWorkload または maxUnavailablePerWorkload の値以下の場合、Descheduler は安全上の理由から再スケジューリングしません。これら 2 つの設定の値を減らすか、パーセンテージに変更することができます。

Descheduler が頻繁に再起動するのはなぜですか?

これは、Descheduler の ConfigMap の形式が正しくないか、ConfigMap が存在しない場合に発生する可能性があります。ConfigMap ファイルの内容と形式を確認し、必要な修正を行ってください。詳細については、「高度な設定パラメーター」をご参照ください。ConfigMap を変更した後、Descheduler を再起動する必要があります。Descheduler の再起動方法の詳細については、「ステップ 2: Descheduling プラグインを有効にして、リソース使用率の高いノードに Pod を分散させる」をご参照ください。

負荷認識スケジューリングとホットスポットの Descheduling を一緒に使用するにはどうすればよいですか?

リソース使用率の高いノードに対して Descheduling を有効にすると、それらのノード上の Pod がエビクションされます。その後、スケジューラは、Deployment などの親コントローラーによって作成された新しい Pod を、その設定に基づいて適切なノードにスケジューリングします。より良い負荷分散を実現するためには、スケジューラに対して負荷認識スケジューリングも有効にする必要があります。詳細については、「負荷認識スケジューリングの使用」をご参照ください。

これらの機能を設定する際、負荷認識スケジューリングのノードフィルタリング機能の loadAwareThreshold パラメーターを、Descheduler の highThresholds パラメーターと同じ値に設定します。詳細については、「ポリシーの説明」をご参照ください。ノードの負荷が highThresholds を超えると、Descheduler はそのノードから Pod をエビクションします。その後、スケジューラは loadAwareThreshold を使用して、新しい Pod がそのノードに再びスケジューリングされるのを防ぎます。そうしないと、特に Pod が指定されたノードスケジューリングスコープを持ち、ノード数が少なく、使用率レベルが似ている場合、エビクションされた Pod が元のノードに再スケジューリングされる可能性があります。

Descheduling に使用される使用率アルゴリズムは何ですか?

Descheduler は一定期間にわたってリソース使用率を継続的に監視し、平均値を計算します。Descheduling は、平均値が特定の期間しきい値を超え続けた場合にのみトリガーされます。デフォルトの期間は約 10 分です。メモリリソースについては、Descheduler のメモリ使用量計算はページキャッシュを除外します。なぜなら、このメモリはオペレーティングシステムによって回収可能だからです。しかし、kubectl top node が返す使用率の値にはページキャッシュが含まれます。Alibaba Cloud Prometheus によるモニタリングを使用して、実際のメモリ使用量を確認できます。

その他

wrk を使用したストレステスト中に、結果に "Socket errors: connect 54," と表示されます。どうすればよいですか?

問題の説明

wrk を使用したストレステスト中に、結果に Socket errors: connect 54, と表示されます。wrk クライアントが Nginx サーバーとの接続を確立できず、テスト結果が無効になります。

原因

このエラーは通常、クライアントで利用可能な接続数が制限されているために発生し、接続試行が失敗します。

解決策

このエラーを解決するには、ストレステストマシンの TCP 接続設定を確認し、TCP 接続の再利用を有効にします。

  1. ストレステストマシンにログインし、次のコマンドを実行して TCP 接続の再利用が有効になっているか確認します。

    sudo sysctl -n net.ipv4.tcp_tw_reuse

    0 または 2 の出力は、システムが TCP 接続の再利用を完全に有効にしていないことを示します。

  2. 次のコマンドを実行して TCP 接続の再利用を有効にします。

    sudo sysctl -w net.ipv4.tcp_tw_reuse=1
  3. wrk ツールを使用して再度ストレステストリクエストを送信します。

    テスト結果に Socket errors: connect 54, ... エラーメッセージが含まれなくなり、結果が有効であることを確認します。

説明

このプロシージャのコマンドは、ストレステストマシンでのみ実行されます。テスト対象のマシンでは設定は不要です。テスト完了後、sysctl -w net.ipv4.tcp_tw_reuse コマンドを実行して元の設定に戻し、不要な副作用を避けてください。

[k8s-reclaimed-resource] タブのクラスターコロケーションのメリットセクションにデータが表示されないのはなぜですか?

  1. ack-koordinator コンポーネントがインストールされているか確認します。

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. クラスター ページで、対象のクラスターを見つけてその名前をクリックします。左側のペインで、[アプリケーション] > [Helm] を選択します。

    3. [Helm] ページで、ack-koordinator コンポーネントが存在するか確認します。

      • 存在しない場合は、「コンポーネントのインストールと管理」をご参照ください。ack-koordinator コンポーネントをインストールし、以下の手順に従ってください。

      • 存在する場合は、次のステップに進みます。

  2. 複数タイプのワークロードのコロケーションダッシュボードに関連データが表示されるか確認します。

    表示されない場合は、次の手順を実行します:

    1. ARMS コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[Managed Service For Prometheus] > [インスタンス] を選択します。

    3. ページの左上隅でターゲットリージョンを選択し、Prometheus インスタンスの名前をクリックし、左側のナビゲーションウィンドウで [メトリクス管理] をクリックします。

    4. 青い [メトリクス] ボタンをクリックし、プロンプトに従って [kube_node_labels] を検索して選択し、メトリクスのデータ詳細を表示します。

Arm ベースのスポットインスタンスを使用できますか?

はい、Arm ベースのスポットインスタンスは利用可能です。使用方法の詳細については、「スポットインスタンスの使用」をご参照ください。

ACK クラスターで Arm ベースのノードを使用する場合の制限事項は何ですか?

現在、Arm アーキテクチャについては、コンポーネントセンターは以下のコンポーネントカテゴリのみをサポートしています:

  • コアコンポーネント

  • ロギングとモニタリング

  • ストレージ

  • ネットワーク

マーケットプレイスのコンポーネントは Arm アーキテクチャをサポートしていません。