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

Container Service for Kubernetes:大規模クラスターの使用に関する推奨事項

最終更新日:Dec 26, 2025

ACK クラスターのパフォーマンスと可用性は、リソース数、リソースアクセス頻度、アクセスモードなどの要因に影響されます。これらの変数の組み合わせによって、API サーバーにかかる負荷のレベルが異なり、そのパフォーマンスに影響を与える可能性があります。通常 500 ノードまたは 10,000 Pod を超える大規模な ACK Pro マネージドクラスターでは、クラスター管理者はビジネス要件に基づいてクラスターを計画し、使用する必要があります。また、クラスターの安定性と可用性を確保するために、メトリクスを注意深くモニタリングする必要があります。

大規模クラスターを使用する際の考慮事項

単一の大規模クラスターを構築すると、複数のクラスターを使用する場合と比較して、クラスター管理と運用保守のオーバーヘッドを削減し、リソース使用率を向上させることができます。しかし、一部の複雑なビジネスシナリオでは、ビジネスロジックや要件に基づいてサービスを複数のクラスターに分割する必要がある場合があります。たとえば、非本番 (テスト) サービスを本番 (開発) サービスから分離したり、データベースサービスをフロントエンドアプリケーションから分離したりできます。

以下の考慮事項がある場合は、単一の大規模クラスターではなく、複数のクラスターを使用することを推奨します。

分類

説明

隔離

複数のクラスターを使用することで、本番クラスターとテストクラスターなど、異なる環境間の隔離が保証されます。この方法により、1 つのクラスターでの問題がすべてのビジネスサービスに影響を与えるのを防ぎ、障害の影響範囲を縮小します。

ロケーション

一部のサービスは、可用性と低レイテンシーの要件を満たすために、エンドユーザーに近い特定の地理的リージョンにデプロイする必要があります。このシナリオでは、異なるリージョンに複数のクラスターをデプロイすることを推奨します。

単一クラスターのサイズ制限

ACK マネージドコントロールプレーンは、弾性スケーリングとクラスターコンポーネントのパフォーマンス最適化を使用して、さまざまなサイズのクラスターに適応します。しかし、Kubernetes アーキテクチャ自体にはパフォーマンスボトルネックがあります。過度に大規模なクラスターは、その可用性とパフォーマンスに影響を与える可能性があります。大規模クラスターを計画する前に、Kubernetes コミュニティによって定義された容量制限SLO を理解してください。次に、Quota Center に移動して、Container Service for Kubernetes のクォータ制限の表示と引き上げを申請します。要件がコミュニティと ACK の制限を超える場合は、ビジネスを複数のクラスターに分割することを検討してください。

アプリケーションのデプロイ、トラフィック管理、ジョブの分散、グローバルモニタリングなどのタスクで複数のクラスターを管理するには、フリート管理を有効にすることができます。

本トピックの使い方

本トピックでは、大規模クラスターの計画と使用に関する一般的な推奨事項を説明します。これは、ACK Pro マネージドクラスターの開発者と管理者を対象としています。特定のクラスター環境とビジネスニーズに基づいて、推奨事項を調整できます。

説明

責任共有モデルによると、ACK は Kubernetes コントロールプレーンコンポーネントと etcd を含むクラスターコントロールプレーンコンポーネントのデフォルトのセキュリティ、および関連する Alibaba Cloud インフラストラクチャに責任を負います。クラウド上にデプロイされたビジネスアプリケーションのセキュリティ保護、およびクラウドリソースの安全な構成と更新については、お客様が責任を負います。詳細については、「責任共有モデル」をご参照ください。


最新のクラスターバージョンの使用

Kubernetes コミュニティは定期的に新しいバージョンをリリースし、新機能や最適化を導入しています。新しい Kubernetes バージョンは、安定性、パフォーマンス、スケーラビリティの向上を提供します。一般的な最適化には以下が含まれます:

  • バージョン 1.31 では、kube-apiserver はキャッシュからの List リクエストに対して一貫性のある読み取りを提供します。これにより、リクエストを etcd に渡す必要性が減り、List リクエストの効率が向上し、etcd の負荷が大幅に軽減されます。詳細については、「Consistent Reads from Cache」をご参照ください。

  • バージョン 1.33 では、kube-apiserver は StreamingCollectionEncodingToJSONStreamingCollectionEncodingToProtobuf を含むストリーミングエンコーディングメカニズムを使用します。この改善により、リソース取得リクエストをストリームとして処理することで、List 操作のパフォーマンスが最適化されます。多くのリソースを含む List リクエストの場合、これにより kube-apiserver のメモリ使用量が効果的に削減され、システムの安定性が向上します。詳細については、「Streaming List responses」をご参照ください。

ACK は、Kubernetes コミュニティと同期してサポートされている Kubernetes バージョンを定期的にリリースし、期限切れのバージョンに対する技術サポートを段階的に終了します。期限切れのバージョンについては、ACK は新機能のリリース、機能またはセキュリティバグの修正を停止し、限定的な技術サポートのみを提供します。

ヘルプドキュメント、コンソールメッセージ、および内部メッセージを通じてバージョンリリース情報を追跡できます。潜在的なセキュリティと安定性の問題を回避するために、クラスターを迅速にアップグレードする必要があります。

クラスターリソース制限のモニタリング

大規模クラスターの可用性、安定性、パフォーマンスを確保するために、以下の表に記載されている制限を監視し、推奨されるソリューションに従ってください。

制限

説明

推奨ソリューション

etcd データベースサイズ (DB サイズ)

過度に大きなデータベースは、データの読み書きレイテンシー、システムリソース使用量、選出遅延などのパフォーマンスに影響を与えます。また、サービスとデータの復元がより困難で時間のかかるものになります。

etcd の合計 DB サイズを 8 GB 未満に保ちます。

  • クラスターリソースの総数を制御し、未使用のリソースを迅速にクリーンアップします。

  • 頻繁に変更されるリソースについては、単一リソースのサイズを 100 KB 未満に保ちます。etcd では、キーと値のペアを更新するたびに新しい履歴バージョンが生成されます。大規模なデータオブジェクトが頻繁に更新されるシナリオでは、etcd はその履歴バージョンを保存するためにより多くのリソースを消費します。

etcd 内の各リソースタイプの合計データサイズ

リソースタイプのオブジェクトの総数が多すぎると、クライアントがそれらすべてをリスト表示するリクエストを行うと、大量のシステムリソースを消費する可能性があります。深刻な場合、これにより API サーバーまたはカスタムコントローラーが初期化できなくなる可能性があります。

各リソースタイプのオブジェクトの合計サイズを 800 MB 未満に保ちます。

  • 新しいタイプのカスタムリソース定義 (CRD) を定義する際は、各 CRD リソースの合計サイズが制御可能であることを確認するために、最終的に予想される CR の数を事前に計画します。

  • Helm を使用してチャートをデプロイする場合、Helm はデプロイメントのステータスを追跡するためにリリースを作成します。デフォルトでは、Helm は Secret を使用してリリース情報を保存します。大規模クラスターでは、大量のリリース情報を Secret に保存すると、Secret の合計サイズに関する Kubernetes の制限を超える可能性があります。代わりに、Helm の SQL ストレージバックエンドを使用できます。

API サーバー:CLB 接続と帯域幅

ACK クラスターの API サーバーは Classic Load Balancer (CLB) インスタンスを使用しており、これには接続と帯域幅の制限があります。最大帯域幅は 5120 Mbps です。最大接続数については、「CLB インスタンス」をご参照ください。

SLB の接続または帯域幅の制限を超えると、ノードが NotReady になる可能性があります。

1,000 ノード以上のクラスターでは、従量課金制の CLB インスタンスを選択することを推奨します。

大規模クラスターでは、デフォルトの名前空間で Kubernetes サービスにアクセスする際に、ネットワーク接続速度と帯域幅を向上させるために、ENI 直接接続モードを使用する必要があります。2023 年 2 月以降に作成されたバージョン 1.20 以降のクラスターでは、デフォルトで ENI 直接接続が使用されます。詳細については、「内部エンドポイントを使用して ACK クラスターの API サーバーにアクセスする」をご参照ください。

名前空間ごとのサービス数

kubelet は、クラスターで定義されたサービスに関する情報を環境変数として、そのノードで実行されている Pod に注入します。これにより、Pod は環境変数を通じてサービスを検出し、通信できます。

各名前空間のサービス数が多すぎると、Pod に注入される環境変数が多すぎることになり、Pod の起動が遅くなったり、失敗したりする可能性があります。

各名前空間のサービス数を 5,000 未満に保ちます。

podSpecenableServiceLinksfalse に設定することで、これらの環境変数を設定しないように選択できます。詳細については、「サービスへのアクセス」をご参照ください。

クラスター内のサービスの総数

サービス数が多すぎると、kube-proxy が処理する必要のあるネットワークルールの数が増加し、それが kube-proxy のパフォーマンスに影響を与えます。

LoadBalancer タイプのサービスの場合、サービス数が多すぎると、SLB への同期遅延が増加します。遅延は分単位に達する可能性があります。

すべてのサービスの総数を 10,000 未満に保ちます。

LoadBalancer タイプのサービスの場合、サービスの総数を 500 未満に保ちます。

サービスごとのエンドポイントの最大数

kube-proxy コンポーネントは各ノードで実行され、サービスに関連する更新を監視して、ノード上のネットワークルールを迅速に更新します。サービスに多くのエンドポイントがある場合、対応する Endpoints リソースも大きくなります。Endpoints オブジェクトが更新されるたびに、コントロールプレーンの kube-apiserver とノードの kube-proxy の間で大量のトラフィックが発生します。クラスターが大きくなるほど、更新する必要のあるデータが増え、ストーム効果がより顕著になります。

説明

この問題を解決するために、v1.19 以降のクラスターの kube-proxy は、パフォーマンスを向上させるためにデフォルトで EndpointSlices を使用します。

単一サービスのエンドポイントのバックエンド Pod 数を 3,000 未満に保ちます。

  • 大規模クラスターでは、Endpoints の代わりに EndpointSlices を使用してネットワークエンドポイントを分割および管理します。分割後、各リソース変更時に送信されるデータ量が効果的に削減されます。

  • ルーティング決定のために Endpoints リソースに依存するカスタムコントローラーがある場合は、引き続き Endpoints オブジェクトを使用できます。ただし、単一の Endpoints オブジェクトのバックエンド Pod 数が 1,000 を超えないようにしてください。超えた場合、サービスの Endpoints オブジェクトは自動的に切り捨てられます。詳細については、「容量超過のエンドポイント」をご参照ください。

すべてのサービスのエンドポイントの総数

クラスター内のエンドポイント数が多すぎると、API サーバーに過剰な負荷がかかり、ネットワークパフォーマンスが低下する可能性があります。

すべてのサービスに関連付けられているエンドポイントの総数を 64,000 未満に保ちます。

pending 状態の Pod の数

pending 状態の Pod の数が多すぎると、新しく送信された Pod が長時間待機状態のままで、適切なノードにスケジュールされない可能性があります。このプロセス中に、Pod がスケジュールできない場合、スケジューラは定期的にイベントを生成し、それがイベントストームにつながる可能性があります。

pending 状態の Pod の総数を 10,000 未満に保ちます。

KMS を使用した Secret の保存時の暗号化が有効になっているクラスター内の Secret の数

KMS v1 を使用してデータを暗号化する場合、暗号化ごとに新しいデータ暗号化キー (DEK) が生成されます。クラスターが起動すると、etcd に保存されている Secret にアクセスして復号化する必要があります。クラスターに保存されている Secret が多すぎると、起動時またはアップグレード時に大量のデータを復号化する必要があり、クラスターのパフォーマンスに影響を与えます。

KMS V1 暗号化が有効になっているクラスターに保存される Secret の数を 2,000 未満に保ちます。

コントロールプレーンコンポーネントのパラメーター設定

ACK Pro マネージドクラスターは、コントロールプレーンコンポーネントのパラメーターをカスタマイズする機能を提供します。この機能は、kube-apiserverkube-controller-managerkube-scheduler などのコアマネージドコンポーネントのパラメーター変更をサポートします。大規模クラスターでは、コントロールプレーンコンポーネントのスロットリング関連パラメーターを適切に調整する必要があります。

kube-apiserver

多数の同時リクエストがコントロールプレーンに過負荷をかけるのを防ぐために、kube-apiserver はいつでも処理できる同時リクエストの数を制限します。この制限を超えると、API サーバーはリクエストのスロットリングを開始し、クライアントに HTTP 429 レスポンスコード (Too Many Requests) を返し、後で再試行するように指示します。サーバー側にスロットリング措置がない場合、コントロールプレーンは容量を超えるリクエストの処理で過負荷になり、サービスまたはクラスター全体の安定性と可用性に深刻な影響を与える可能性があります。したがって、コントロールプレーンのクラッシュによる広範な問題を回避するために、サーバー側のスロットリングメカニズムを構成する必要があります。

スロットリングの分類

kube-apiserver のスロットリングは 2 種類に分けられます。

  • v1.18 より前のバージョン:kube-apiserver は最大同時実行スロットリングのみをサポートします。リクエストを読み取りまたは書き込みタイプとして区別し、起動パラメーター --max-requests-inflight--max-mutating-requests-inflight を通じて読み取りおよび書き込みリクエストの最大同時実行数を制限します。この方法では、リクエストの優先順位は区別されません。一部の低優先度の遅いリクエストが大量のリソースを消費し、API サーバーのリクエストがバックログになり、一部の高優先度またはより緊急のリクエストが迅速に処理されなくなる可能性があります。

    ACK Pro マネージドクラスターは、kube-apiserver の max-requests-inflight および max-mutating-requests-inflight パラメーターのカスタム構成をサポートします。詳細については、「ACK Pro クラスターのコントロールプレーンコンポーネントのパラメーターをカスタマイズする」をご参照ください。

  • v1.18 以降:より詳細なトラフィック管理のために API 優先度と公平性 (APF) メカニズムが導入されました。これは、事前設定されたルールと優先度に基づいてリクエストを分類および分離することをサポートします。これにより、より重要で緊急のリクエストが最初に処理されることが保証され、異なるタイプのリクエストが合理的な処理機会を得られるように、特定の公平性ポリシーに従います。この機能は v1.20 でベータ段階に入り、デフォルトで有効になっています。

    クリックして APF の説明を表示

    v1.20 以降の Kubernetes クラスターでは、kube-apiserver--max-requests-inflight--max-mutating-requests-inflight パラメーターの合計を通じて、同時に処理できるリクエストの総数を構成します。より詳細なトラフィック制御のために、FlowSchema と PriorityLevelConfiguration の 2 種類のカスタムリソース定義 (CRD) を使用して、異なるタイプのリクエスト間で割り当てられる同時実行数を制御します。

    • PriorityLevelConfiguration:特定の優先度レベルが割り当てられることができる合計同時実行数の割合を決定する優先度構成。

    • FlowSchema:リクエストがどの PriorityLevelConfiguration に属するかを決定します。

    PriorityLevelConfiguration と FlowSchema は kube-apiserver によって自動的に維持されます。現在のクラスターバージョンのデフォルト構成は、Kubernetes クラスターで自動的に生成されます。以下のコマンドを実行して表示できます。

    クリックして PriorityLevelConfiguration のクエリコマンドと期待される出力を表示

    kubectl get PriorityLevelConfiguration
    # 期待される出力
    NAME              TYPE      ASSUREDCONCURRENCYSHARES   QUEUES   HANDSIZE   QUEUELENGTHLIMIT   AGE
    catch-all         Limited   5                          <none>   <none>     <none>             4m20s
    exempt            Exempt    <none>                     <none>   <none>     <none>             4m20s
    global-default    Limited   20                         128      6          50                 4m20s
    leader-election   Limited   10                         16       4          50                 4m20s
    node-high         Limited   40                         64       6          50                 4m20s
    system            Limited   30                         64       6          50                 4m20s
    workload-high     Limited   40                         128      6          50                 4m20s
    workload-low      Limited   100                        128      6          50                 4m20s

    クリックして FlowSchema のクエリコマンドと期待される出力を表示

    説明

    ACK は、ACK コアコンポーネントに関連する分類 ack-system-leader-election と ack-default を FlowSchema に追加します。残りはコミュニティと一致しています。

    kubectl get flowschemas
    # 期待される出力
    NAME                           PRIORITYLEVEL     MATCHINGPRECEDENCE   DISTINGUISHERMETHOD   AGE     MISSINGPL
    exempt                         exempt            1                    <none>                4d18h   False
    probes                         exempt            2                    <none>                4d18h   False
    system-leader-election         leader-election   100                  ByUser                4d18h   False
    endpoint-controller            workload-high     150                  ByUser                4d18h   False
    workload-leader-election       leader-election   200                  ByUser                4d18h   False
    system-node-high               node-high         400                  ByUser                4d18h   False
    system-nodes                   system            500                  ByUser                4d18h   False
    ack-system-leader-election     leader-election   700                  ByNamespace           4d18h   False
    ack-default                    workload-high     800                  ByNamespace           4d18h   False
    kube-controller-manager        workload-high     800                  ByNamespace           4d18h   False
    kube-scheduler                 workload-high     800                  ByNamespace           4d18h   False
    kube-system-service-accounts   workload-high     900                  ByNamespace           4d18h   False
    service-accounts               workload-low      9000                 ByUser                4d18h   False
    global-default                 global-default    9900                 ByUser                4d18h   False
    catch-all                      catch-all         10000                ByUser                4d18h   False
スロットリングのモニタリングと推奨ソリューション

クライアントは、リターンステータスコード 429 を確認するか、apiserver_flowcontrol_rejected_requests_total メトリックを監視することで、サーバー側がスロットリングしているかどうかを判断できます。スロットリング動作が観察された場合、以下の方法で解決できます。

  • API サーバーのリソース使用量を監視します。リソース使用量が低い場合、max-requests-inflightmax-mutating-requests-inflight パラメーターの合計を調整して、合計スロットリング制限を増やすことができます。

    500 ノードを超えるクラスターでは、パラメーターの合計を 2,000 から 3,000 の間に設定することを推奨します。3,000 ノードを超えるクラスターでは、3,000 から 5,000 の間に設定することを推奨します。

  • PriorityLevelConfiguration を再構成します。

    • 高優先度リクエスト:スロットリングされたくないリクエストについては、新しい FlowSchema を作成し、workload-highexempt などの高優先度の PriorityLevelConfiguration と一致させることができます。ただし、exempt 優先度のリクエストは APF によってスロットリングされないため、注意して構成する必要があります。また、高優先度リクエスト用に新しい PriorityLevelConfiguration を構成して、より高い同時実行性を与えることもできます。

    • 低優先度リクエスト:特定の遅いクライアントリクエストが API サーバーの高いリソース使用量や遅い応答を引き起こす場合、このタイプのリクエスト用に新しい FlowSchema を追加し、低同時実行性の PriorityLevelConfiguration と一致させることができます。

重要
  • ACK Pro マネージドクラスターは、kube-apiserver コンポーネントを管理します。デフォルトでは、kube-apiserver は複数のゾーンにまたがって高可用性を確保し、少なくとも 2 つのレプリカを保証します。コントロールプレーンのリソース使用量が増加するにつれて、最大 6 つのレプリカに徐々に調整されます。合計実際の同時リクエスト数 = レプリカ数 × レプリカごとの合計リクエスト数

  • kube-apiserver のカスタムパラメーターを変更すると、API サーバーのローリングアップデートがトリガーされます。これにより、クライアントコントローラーが List-Watch 操作を再実行する可能性があります。大規模クラスターでは、これにより API サーバーの負荷が高くなりすぎ、一時的なサービス利用不可につながる可能性があります。

kube-controller-managerkube-scheduler

kube-controller-managerkube-scheduler は、それぞれ kubeAPIQPS/kubeAPIBurst および connectionQPS/connectionBurst パラメーターを通じて、API サーバーとの通信の QPS を制御します。詳細については、「ACK Pro クラスターのコントロールプレーンコンポーネントのパラメーターをカスタマイズする」および「スケジューラパラメーターのカスタマイズ」をご参照ください。

  • kube-controller-manager:1,000 ノードを超えるクラスターでは、kubeAPIQPS/kubeAPIBurst を 300/500 以上に調整することを推奨します。

  • kube-scheduler:通常、調整は不要です。Pod レートが 300/s を超える場合、connectionQPS/connectionBurst を 800/1000 に調整することを推奨します。

kubelet

kubelet コンポーネントの kube-api-burst/qps のデフォルト値は 5/10 であり、通常は調整する必要はありません。クラスターで Pod のステータス更新の遅延、スケジューリングの遅延、永続ボリュームのマウントの遅延などの重大なパフォーマンス問題が発生した場合は、パラメーター値を増やすことを推奨します。手順と説明については、「ノードプールの kubelet 構成をカスタマイズする」をご参照ください。

重要
  • この kubelet パラメーターを増やすと、kubelet と API サーバー間の通信 QPS が増加します。kubelet が送信するリクエストが多すぎると、API サーバーの負荷が増加する可能性があります。値を徐々に増やし、API サーバーのパフォーマンスとリソース使用量を監視して、コントロールプレーンの安定性を確保することを推奨します。

  • ノードの kubelet に変更を加える場合は、更新頻度を制御する必要があります。変更プロセス中のコントロールプレーンの安定性を確保するために、ACK は単一ノードプール内のバッチごとの最大並列更新数を 10 以下に制限します。

クラスターリソースのスケーリングレートの計画

大規模クラスターでは、安定した運用中はコントロールプレーンの負荷は通常低いです。しかし、クラスターが大規模な変更、たとえば多数のリソースを迅速に作成または削除したり、多数のノードをスケーリングしたりすると、負荷が過剰になり、クラスターのパフォーマンスと応答速度に影響を与える可能性があります。

たとえば、5,000 ノードのクラスターで多数の固定 Pod が安定して実行されている場合、コントロールプレーンへの負荷は通常それほど高くありません。しかし、1,000 ノードのクラスターで、1 分以内に 10,000 の短命ジョブを作成したり、2,000 ノードを同時にスケールアウトしたりすると、コントロールプレーンへの負荷は急増します。

したがって、大規模クラスターでリソース変更操作を実行する場合は、クラスターとコントロールプレーンの安定性を確保するために、クラスターの実行状態に基づいてスケーリング操作の変更率を慎重に計画する必要があります。

推奨される操作は次のとおりです。

重要

クラスターのコントロールプレーンに影響を与える要因は多いため、以下の数値は参考用です。実際の操作では、変更率を徐々に増やしてください。スケーリングレートをさらに上げる前に、コントロールプレーンが正常に応答することを確認してください。

  • ノードのスケールアウトとスケールイン:2,000 ノードを超えるクラスターで、ノードプールを介して手動でノードをスケーリングする場合、単一ノードプールの 1 回の操作でのノード数は 100 を超えないようにする必要があります。複数のノードプールにまたがる 1 回の操作での合計ノード数は 300 を超えないようにする必要があります。

  • アプリケーション Pod のスケールアウトとスケールイン:アプリケーションがサービスに関連付けられている場合、スケーリング中の Endpoint と EndpointSlice の更新はすべてのノードにプッシュされます。ノード数が多いシナリオでは、更新する必要のあるデータが多くなり、クラスターのストーム効果を引き起こす可能性があります。5,000 ノードを超えるクラスターでは、Endpoint に関連付けられていない Pod の更新 QPS は 300/s を超えないようにすることを推奨します。Endpoint に関連付けられている Pod の更新 QPS は 10/s を超えないようにすることを推奨します。たとえば、Deployment のローリングアップデート戦略を宣言する場合、Pod の更新レートを減らすために、最初に maxUnavailablemaxSurge に小さい値を設定することを推奨します。

クラスターへのクライアントアクセスパターンの最適化

Kubernetes クラスターでは、クライアントは API サーバーを通じてクラスターリソース情報を取得します。クラスター内のリソース数が増加するにつれて、クライアントからの頻繁なリクエストはクラスターコントロールプレーンの負担を増大させ、応答遅延や雪崩効果につながる可能性があります。リソースアクセスのサイズと頻度を理解し、計画する必要があります。推奨事項は次のとおりです。

ローカルキャッシュデータへのアクセスには informer を優先的に使用する

リソースを取得するには、client-go の informer を優先的に使用します。ローカルキャッシュからデータをクエリして、API サーバーに直接アクセスする List リクエストを回避し、API サーバーの負荷を軽減します。

API サーバーを介したリソース取得方法の最適化

アクセスされていないローカルキャッシュについては、引き続き API サーバーを介して直接リソースを取得する必要があります。ただし、以下の推奨事項に従うことができます。

  • List リクエストで resourceVersion=0 を設定します。

    resourceVersion はリソースの状態のバージョンを示します。0 に設定すると、リクエストは etcd に直接アクセスする代わりに API サーバーからキャッシュされたデータを取得します。これにより、API サーバーと etcd 間の内部相互作用の数が減り、クライアントの List リクエストへの応答が速くなります。以下は例です。

    k8sClient.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{ResourceVersion: "0"})
  • 過剰なデータ取得を防ぐために、すべてのリソースをリスト表示することを避けます。

    リクエストによって返されるデータ量を減らすために、ラベルセレクター (リソースタグに基づく) やフィールドセレクター (リソースフィールドに基づく) などのフィルター条件を使用して、List リクエストの範囲を制限できます。

    説明

    etcd はキー・バリュー (KV) ストレージシステムであり、ラベルやフィールドでデータをフィルタリングする機能はありません。リクエストに含まれるフィルター条件は、実際には API サーバーによって処理されます。したがって、フィルター機能を使用する場合は、List リクエストの resourceVersion を同時に 0 に設定することを推奨します。リクエストデータは API サーバーのキャッシュから取得され、etcd に直接アクセスしないため、etcd への負荷が軽減されます。

  • CRD 以外のリソースへのアクセスには、JSON ではなく Protobuf を使用します。

    API サーバーは、JSON や Protobuf など、さまざまなデータ形式でリソースオブジェクトをクライアントに返すことができます。デフォルトでは、クライアントが Kubernetes API をリクエストすると、Kubernetes は JSON としてシリアル化されたオブジェクトを返し、コンテンツタイプは application/json です。クライアントは、リクエストが Protobuf 形式を使用するように指定できます。Protobuf は、メモリ使用量とネットワーク転送トラフィックの点で JSON よりも優れています。

    ただし、すべての API リソースタイプが Protobuf をサポートしているわけではありません。リクエストを送信する際に、Accept リクエストヘッダーに複数のコンテンツタイプを指定できます (例:application/json および application/vnd.kubernetes.protobuf)。これにより、Protobuf が使用できない場合にデフォルトの JSON 形式にフォールバックすることがサポートされます。詳細については、「リソースの代替表現」をご参照ください。以下は例です。

    Accept: application/vnd.kubernetes.protobuf, application/json

集中管理型のコントローラーを使用する

クラスターの完全なデータを監視するために、各ノードに独立したコントローラーを作成することは避けるべきです。この場合、コントローラーが起動すると、現在のクラスター状態を同期するために、ほぼ同時に多数の List リクエストを API サーバーに送信します。これにより、コントロールプレーンに多大な負荷がかかり、サービスの不安定化やクラッシュにつながる可能性があります。

この問題を回避するために、集中管理型のコントローラー設計を採用することを推奨します。クラスター全体に対して、単一ノードまたは少数のノードで実行される、1 つまたは複数の集中管理されたコントローラーインスタンスを作成できます。集中管理型のコントローラーは、必要なクラスターデータの監視と処理を担当します。1 つ (または少数) の List リクエストのみを開始し、必要な数の Watch 接続のみを維持するため、API サーバーへの負荷が大幅に軽減されます。

大規模ワークロードの計画

デフォルト ServiceAccount の自動マウントを無効にする

Pod 内の Secret の同期更新を確実にするために、kubelet は Pod に構成された各 Secret に対して永続的な Watch 接続を確立します。Watch メカニズムにより、kubelet は Secret の更新に関するリアルタイムの通知を受け取ることができます。ただし、すべてのノードによって作成された Watch の総数が多すぎると、多数の Watch 接続がクラスターコントロールプレーンのパフォーマンスに影響を与える可能性があります。

  • Kubernetes バージョン 1.22 より前:Pod が作成されるとき、ServiceAccount が指定されていない場合、Kubernetes はデフォルトの ServiceAccount の Secret を自動的に Pod にマウントします。これにより、Pod 内のアプリケーションは API サーバーと安全に通信できます。

    バッチ処理システムや API サーバーにアクセスする必要のないアプリケーション Pod については、ServiceAccount トークンの自動マウントを明示的に禁止することを推奨します。これにより、関連する Secret と Watch の作成が回避されます (詳細については、「automountServiceAccountToken」をご参照ください)。大規模クラスターでは、この操作により、不要な Secret と API サーバーとの Watch 接続の作成が回避され、クラスターコントロールプレーンの負担が軽減されます。

  • Kubernetes 1.22 以降:TokenRequest API を使用して、短期間で自動的にローテーションされるトークンを取得し、このトークンを projected volume としてマウントできます。Secret のセキュリティを向上させながら、この操作は kubelet が各 ServiceAccount の Secret に対して確立する Watch 接続の数も減らし、クラスターのパフォーマンスオーバーヘッドを低減します。

    ServiceAccount トークン projected volume 機能を有効にする方法については、「ServiceAccount トークンボリュームプロジェクションの使用」をご参照ください。

Kubernetes オブジェクトの数とサイズを制御する

ConfigMap、Secret、PVC などの未使用の Kubernetes リソースを迅速にクリーンアップして、システムリソースの使用量を削減し、クラスターを健全で効率的に保つ必要があります。以下は使用に関する推奨事項です。

  • デプロイメント履歴の制限:revisionHistoryLimit は、デプロイメントのために保持する古い ReplicaSet の数を宣言します。値が高すぎると、Kubernetes は多くの履歴バージョンの ReplicaSet を保持し、kube-controller-manager の管理負担が増加します。大規模クラスターで、多くのデプロイメントがあり、頻繁に更新される場合は、デプロイメントの revisionHistoryLimit の値を下げて古い ReplicaSet をクリーンアップできます。デプロイメントの revisionHistoryLimit のデフォルト値は 10 です。

  • 未使用のジョブと関連する Pod のクリーンアップ:CronJob または他のメカニズムを通じてクラスター内に多くのジョブオブジェクトが作成される場合、ttlSecondsAfterFinished を使用して、完了したジョブとその関連する Pod を自動的にクリーンアップできます。これにより、ジョブとその関連する Pod が一定期間後に自動的に削除されるように指定されます。

Informer タイプのコンポーネントのリソースを適切に構成する

Informer タイプのコンポーネントは、主に Kubernetes クラスターのリソースステータスを監視および同期するために使用されます。Informer タイプのコンポーネントは、クラスターの API サーバーのリソースステータスへの Watch 接続を確立し、リソースオブジェクトのローカルキャッシュを維持して、リソースステータスの変更に迅速に応答します。

コントローラーコンポーネントや kube-scheduler などの Informer タイプのコンポーネントの場合、コンポーネントのメモリ使用量は、監視するリソースのサイズに関連しています。大規模クラスターでは、Out-of-Memory (OOM) エラーを防ぐために、これらのコンポーネントのメモリ消費に注意を払う必要があります。頻繁な OOM は、コンポーネントによる継続的なリソース監視に問題を引き起こす可能性があります。コンポーネントが頻繁に再起動すると、毎回実行される List-Watch 操作も、クラスターコントロールプレーン、特に API サーバーに追加の負荷をかけます。

コントロールプレーンメトリクスのモニタリング

コントロールプレーンコンポーネントのモニタリングダッシュボードを表示して、コアコントロールプレーンコンポーネントのメトリクスリスト、異常なメトリクスの問題の分析などを取得できます。大規模クラスターでは、以下のメトリクスに注目する必要があります。使用方法の説明とメトリクスの詳細な説明については、「コントロールプレーンコンポーネントのモニタリング」をご参照ください。

リソース使用量の制御

現在、すべてのコントロールプレーンコンポーネントのリソース使用量が閲覧可能です。関連するメトリクスと説明は以下の通りです:

メトリック名

Prometheus クエリ言語 (PromQL)

説明

kube-apiserver

メトリクスとその完全な説明の表示方法については、「kube-apiserver コンポーネントのモニタリングメトリクス」をご参照ください。

  • リソースオブジェクト数

    名前

    PromQL

    説明

      • ACK クラスターが Kubernetes 1.22 以降を実行している場合、メトリック名は apiserver_storage_objects です。

      • ACK クラスターが Kubernetes 1.22 以前を実行している場合、メトリック名は etcd_object_counts です。

      説明

      互換性の問題により、Kubernetes 1.22 には apiserver_storage_objects と etcd_object_counts の両方のメトリックが存在します。

    • リクエストレイテンシー

      名前

      PromQL

      説明

      次のディメンションに基づいて表示される LIST リクエストの応答時間:API サーバー Pod、LIST verb、リソース、およびスコープ。

      書き込みリクエスト遅延 P[0.9]

      histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb!~"GET|WATCH|LIST|CONNECT"}[$interval])) by (cluster, pod_name, verb, resource, scope, le))

      次のディメンションに基づいて表示される Mutating リクエストの応答時間:API サーバー Pod、GET、WATCH、LIST、CONNECT などの verb、リソース、およびスコープ。

    • リクエストスロットリング

      名前

      PromQL

      説明

      リクエスト制限レート

      sum(irate(apiserver_dropped_requests_total{request_kind="readOnly"}[$interval])) by (name)

      sum(irate(apiserver_dropped_requests_total{request_kind="mutating"}[$interval])) by (name)

      kube-apiserver のスロットリングレート。データなしまたは 0 は、リクエストスロットリングがトリガーされていないことを示します。

    kube-scheduler

    メトリクスとその完全な説明の表示方法については、「kube-scheduler コンポーネントのモニタリングメトリクス」をご参照ください。

    • pending 状態の Pod の数

      名前

      PromQL

      説明

      スケジューラ Pending Pods

      scheduler_pending_pods{job="ack-scheduler"}

      pending 状態の Pod の数。Pending Pod は次のタイプで構成されます:

      • unschedulable:スケジュール不可能な Pod。

      • backoff:バックオフキューの Pod。特定の理由でスケジュールに失敗した Pod です。

      • active:アクティブキューの Pod。スケジュール準備が整った Pod です。

    • リクエストレイテンシー

      名前

      PromQL

      説明

      Kube API リクエストレイテンシー

      histogram_quantile($quantile, sum(rate(rest_client_request_duration_seconds_bucket{job="ack-scheduler"}[$interval])) by (verb,url,le))

      kube-scheduler によって送信されたリクエストと kube-apiserver によって返された応答の間の時間間隔。レイテンシーは Verbs と URL に基づいて計算されます。

    kube-controller-manager

    メトリクスとその完全な説明の表示方法については、「kube-controller-manager コンポーネントのモニタリングメトリクス」をご参照ください。

    Workqueue

    名前

    PromQL

    説明

    Workqueue の深さ

    sum(rate(workqueue_depth{job="ack-kube-controller-manager"}[$interval])) by (name)

    指定された間隔での workqueue の長さの変化。

    Workqueue 処理遅延

    histogram_quantile($quantile, sum(rate(workqueue_queue_duration_seconds_bucket{job="ack-kube-controller-manager"}[5m])) by (name, le))

    workqueue 内のイベントの期間。

    etcd

    メトリクスとその完全な説明の表示方法については、「etcd コンポーネントのモニタリングメトリクス」をご参照ください。

    • 合計 KV 数

      名前

      PromQL

      説明

      合計 kv

      etcd_debugging_mvcc_keys_total

      etcd クラスター内のキーと値のペアの総数。

    • データベースサイズ (DB サイズ)

      名前

      PromQL

      説明

      ディスクサイズ

      etcd_mvcc_db_total_size_in_bytes

      etcd バックエンドデータベースのサイズ。

      etcd_mvcc_db_total_size_in_use_in_bytes

      etcd バックエンドデータベースの使用量。

    関連ドキュメント