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

Container Service for Kubernetes:大規模クラスターの使用に関する提案

最終更新日:Oct 31, 2024

Container Service for Kubernetes (ACK) クラスターのパフォーマンスと可用性は、クラスターリソースの量、リソースアクセス頻度、およびアクセスモードによって異なります。 APIサーバの負荷および性能もまた、異なるバリエーションに基づいて変化し得る。 大規模なACK Proクラスターには通常、500を超えるノードまたは10,000を超えるポッドが含まれます。 クラスタ管理者は、実際のビジネスシナリオに基づいて大規模なACKクラスタを計画して使用し、クラスタの安定性と可用性を確保するためにモニタリングメトリックに細心の注意を払う必要があります。

大きなACKクラスターの使用に関する注意事項

複数のクラスターを使用する場合と比較して、1つの大きなクラスターを使用すると、クラスターのO&Mが効率的に簡素化され、リソース使用率が向上します。 複雑なビジネスシナリオでは、ビジネスロジックまたはサービス需要によってサービスを複数のクラスターに分割することを推奨します。 たとえば、サービスを非運用 (テスト) サービスと運用 (開発) サービスに分割したり、フロントエンドアプリケーションからデータベースサービスを分離したりできます。

次の要件がある場合は、大規模なクラスターを作成するのではなく、複数のクラスターを使用することを推奨します。

要件

説明

分離

複数のクラスターを使用して、ビジネスがデプロイされているクラスターがダウンしたときにすべてのビジネスが中断された場合に備えて、テスト環境を本番環境から分離できます。 これは、単一の故障点の影響を低減する。

位置

一部のサービスは、サービスの可用性を向上させ、応答遅延を減らすために、エンドユーザーに近い場所にデプロイする必要があります。 このシナリオでは、複数のクラスターをリージョン間でデプロイすることを推奨します。

クラスターサイズ

ACKマネージド制御プレーンは、自動スケーリングとクラスタコンポーネントの最適化により、クラスタサイズに自動的に適応します。 ただし、Kubernetesアーキテクチャにはパフォーマンスのボトルネックがあります。 超大規模クラスターの可用性とパフォーマンスは保証されません。 大規模なクラスターを使用する前に、Kubernetesコミュニティで定義されているKubernetesスケーラビリティのしきい値KubernetesスケーラビリティとパフォーマンスSLI /SLOを読み、Quota Centerコンソールにログインして、Container Service for Kubernetesに関連するクォータを表示および増加します。 ビジネスがKubernetesとACKの制限を超える場合は、ビジネスを複数のクラスターに分割します。

アプリケーションのデプロイ、トラフィック管理、ジョブの配布、グローバル監視などのマルチクラスター管理が必要な場合は、マルチクラスターフリートを有効にすることを推奨します。

このトピックについて

このトピックは、ACK Proクラスターの開発者および管理者を対象としています。 このトピックでは、大規模なACKクラスターの計画と使用に関する提案を示します。 実際のクラスター環境とビジネス要件が優先されます。

説明

共有責任モデルは、ACKクラスターが、制御プレーンコンポーネント (Kubernetes制御プレーンコンポーネントおよびetcdを含む) のデフォルトのセキュリティと、クラスターサービスに関連するAlibaba Cloudインフラストラクチャを担当することを定義しています。 お客様は、クラウドにデプロイされたアプリケーションのセキュリティ、およびクラウドリソースのセキュリティ設定と更新を担当します。 詳細については、「共有責任モデル」をご参照ください。


新しいバージョンのクラスターを使用する

新しいKubernetesバージョンがリリースされると、ACKでサポートされているKubernetesバージョンのリストも変更されます。 新しいKubernetesバージョンがリストに追加され、古いKubernetesバージョンは廃止されます。 ACKは、古いKubernetesバージョンの新機能、機能パッチ、またはセキュリティパッチのリリースを停止します。 ACKは、これらのバージョンの限定的な技術サポートのみを提供します。

クラスターを更新する前に、ドキュメント、コンソール情報、内部メッセージから新しい更新に関する情報を確認し、目的のKubernetesバージョンの更新ノートを読むことができます。 これにより、セキュリティリスクを軽減し、安定性の問題を解決するために、できるだけ早い機会にクラスターを更新できます。 クラスターの更新の詳細については、「ACKクラスターの手動アップグレード」および「クラスターの自動アップグレード」をご参照ください。 ACKでサポートされているKubernetesバージョンの詳細については、「Kubernetesバージョンのサポート」をご参照ください。

クラスターリソースの制限に注意してください

次の表に、大規模なACKクラスターの可用性、安定性、パフォーマンスを保証するための制限と、対応するソリューションを示します。

制限事項

説明

推奨ソリューション

最大etcdサイズ (DBサイズ)

etcdの最大サイズは8 GBです。 etcdが大きすぎると、読み取りおよび書き込みレイテンシ、システムリソースの使用量、選択レイテンシなどのパフォーマンスが低下します。 その結果、サービスおよびデータの復元が困難になり、時間がかかる。

etcdサイズが8 GBより小さいことを確認してください。

  • クラスターリソースの総量を制御し、アイドルリソースを解放します。

  • 頻繁に更新されるリソースについては、各リソースのサイズを100 KB未満に制限することを推奨します。 etcdでは、キーと値のペアを更新するたびに履歴バージョンが生成されます。 頻繁な更新を伴うビッグデータコンピューティングシナリオでは、etcdに格納された履歴バージョンは通常、より多くのリソースを占有します。

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

多数のリソースオブジェクトが存在する場合、クライアントがすべてのリソースオブジェクトにアクセスすると、過剰な量のシステムリソースが消費されます。 これにより、APIサーバーまたはカスタムコントローラーの初期化が失敗する可能性があります。

各リソースタイプの合計サイズを800 MB未満に制限します。

  • 新しいタイプのCustomResourceDefinition (CRD) を定義するときは、各CRDのサイズが制御可能であるように、CustomResources (CR) の予想数を事前に決定します。

  • Helmグラフをデプロイすると、Helmは自動的にリリースを作成してデプロイの進行状況を追跡します。 デフォルトでは、HelmはSecretsを使用してバージョン情報を保存します。 大容量のACKクラスターでは、バージョン情報の量がKubernetesで定義されている最大シークレットサイズを超える場合があります。 このシナリオでは、代わりにHelm SQLストレージバックエンドを使用します。

APIサーバーによって使用されるCLBインスタンスの接続と帯域幅

ACKクラスターのAPIサーバーでサポートされるのは、Classic Load Balancer (CLB) インスタンスのみです。 CLBインスタンスでサポートされる最大接続数と帯域幅には制限があります。 CLBインスタンスでサポートされている最大接続数の詳細については、「CLBインスタンスの概要」をご参照ください。 CLBインスタンスの最大帯域幅は5,120 Mbit/sです。

CLBインスタンスの接続または帯域幅の制限を超えると、ノードはNot Ready状態になります。

クラスターに1,000を超えるノードが含まれている場合は、従量課金CLBインスタンスを使用することを推奨します。

説明

接続の確立を高速化して帯域幅を増やすには、Elastic Network Interface (ENI) を使用して、大規模なクラスターのデフォルトの名前空間でサービスを公開します。 デフォルトでは、ENIは2月2023日以降に作成されたACKクラスターでサービスを公開し、1.20以降のバージョンのKubernetesを実行するために使用されます。 他のクラスターの場合、ENIを使用してサービスを公開するには、チケットを起票してください。詳細は、「Kube API Server」をご参照ください。

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

kubeletは、サービス情報を環境変数に格納し、ノードで実行されるポッドに挿入します。 これにより、ポッドはサービスを検出して通信できます。

名前空間に過剰な数のサービスが含まれている場合、ポッドに注入される環境変数の数は大きくなります。 その結果、ポッドは、発射に長い時間を必要とするか、または発射に失敗することさえある。

名前空間ごとのサービスの数を5,000未満に制限することを推奨します。

これらの環境変数を指定せず、podSpecセクションのenableServiceLinksfalseに設定できます。 詳細については、「サービスへのアクセス」をご参照ください。

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

過剰な数のサービスを作成する場合、kube-proxyは多数のネットワークルールを処理する必要があります。 これにより、kube-proxyのパフォーマンスが低下します。

LoadBalancerサービスの数が増加すると、LoadBalancerサービスとServer Load Balancer (SLB) インスタンス間の同期レイテンシも増加します。 待ち時間は、1分を超えることさえあり得る。

サービスの総数を10,000未満に制限することを推奨します。

LoadBalancerサービスの数を500未満に制限することを推奨します。

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

kube-proxyコンポーネントは各ノードで実行され、サービス関連の更新を監視し、ノードのネットワークルールをできるだけ早く更新できます。 サービスのエンドポイント数が多すぎると、多数のエンドポイントオブジェクトが存在します。 各Endpointsオブジェクトの更新には、kube-apiserverkube-proxy間の大量データ転送が含まれます。 クラスターのサイズが大きくなると、より多くのデータを更新する必要があり、影響が大きくなります。

説明

この問題を解決するために、kube-proxyEndpointSlicesを使用して、1.19以降のバージョンのKubernetesを実行するACKクラスターでデフォルトでパフォーマンスを向上させます。

Endpointsオブジェクトに関連付けられているバックエンドポッドの数を3,000未満に制限することを推奨します。

  • 大規模なクラスターでは、エンドポイントの代わりにEndpointSlicesを使用して、ネットワークエンドポイントを分割および管理します。 分割により、更新ごとのデータ転送量を効率的に削減することができる。

  • カスタムコントローラーがEndpointsオブジェクトに依存してルーティングを決定する場合は、Endpointsオブジェクトを保持できます。 Endpointsオブジェクトに関連付けられているバックエンドポッドの数が1,000未満であることを確認します。 上限を超えると、Endpointsオブジェクトのデータは自動的に切り捨てられます。 詳細については、「容量超過エンドポイント」をご参照ください。

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

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

サービスエンドポイントの総数を64,000未満に制限することを推奨します。

保留中のポッド数

過剰な数の保留中のポッドが存在する場合、新たに送信されたポッドは、スケジュールされる前に長時間待機することがある。 待機時間中、スケジューラは定期的にイベントを生成し、イベントストームを作成します。

保留中のポッドの総数を10,000未満に制限することを推奨します。

KMSを使用してKubernetes Secretsを暗号化するクラスター内のSecretsの数

Key Management Service (KMS) v1を使用してデータを暗号化すると、各暗号化でデータ暗号化キー (DEK) が生成されます。 Kubernetesクラスターが起動すると、クラスターはetcdに保存されているSecretsにアクセスして復号化する必要があります。 クラスターに過剰な数のシークレットがある場合、クラスターは起動中または更新中に大量のデータを復号化する必要があります。 これは、クラスタの性能を低下させる。

KMS v1を使用して秘密を暗号化するクラスター内の秘密の数を2,000未満に制限することを推奨します。

制御プレーンコンポーネントパラメータを適切に設定

ACK Proクラスターを使用すると、制御プレーンコンポーネントのパラメーターをカスタマイズできます。 kube-apiserverkube-controller-managerkube-schedulerなどの主要管理コンポーネントのパラメーターをカスタマイズできます。 大規模なクラスターでは、制御プレーンコンポーネントのスロットリングパラメーターを適切に設定する必要があります。

kube-apiserver

多数の要求が制御プレーンをオーバーロードするのを防ぐために、kube-apiserverは一定期間内に処理できる同時要求の数を制限します。 上限を超えると、APIサーバーはリクエストスロットリングをトリガーし、HTTPステータスコード429をクライアントに返します。 ステータスコードは、過剰な数の要求が受信され、クライアントが後で再試行しなければならないことを示す。 サーバーにスロットリングが設定されていない場合、制御プレーンはリクエストによってオーバーロードされる可能性があります。 その結果、サービスクラスタ全体の安定性と可用性が影響を受けます。 そのため、コントロールプレーンを保護するために、サーバーでリクエストスロットリングを構成することをお勧めします。

リクエストスロットリング方法

kube-apiserverは、次のリクエストスロットリングメソッドをサポートしています。

  • v1.18より前のバージョン: kube-apiserverは最大同時実行性のみを制限できます。 要求は、読み出し要求と書き込み要求とに分類される。 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 Priority and Fairness (APF) 機能が導入され、よりきめ細かい方法でリクエストを管理します。 この機能により、事前定義されたルールと優先度に基づいてリクエストを分類および分離し、重要かつ緊急のリクエストが優先されるようにします。 この機能では、公平なキューイングアルゴリズムを使用して、さまざまなタイプの要求が公平に処理されるようにします。 この機能はKubernetes 1.20のベータ段階に達し、デフォルトで有効になっています。

    APF紹介を見る

    Kubernetes 1.20以降を実行するACKクラスターでは、kube-apiserverによって処理される同時リクエストの最大数は、-- max-requests-inflightパラメーターと -- max-mutating-requests-inflightパラメーターの合計に基づいています。 kube-apiserverは、FlowSchemaとPriorityLevelConfiguration CustomResourceDefinitions (CRD) を使用して、各タイプのリクエストの同時実行を制御し、きめ細かい方法でリクエストのスロットリングを実行します。

    • PriorityLevelConfiguration: 優先度レベルを定義します。 これにより、各優先レベルが処理できる使用可能な同時実行予算の割合が決まります。

    • FlowSchema: リクエストを単一のPriorityLevelConfigurationに照合します。

    PriorityLevelConfigurationsとFlowSchemasは、kube-apiserverによって管理されます。 Kubernetesクラスターは、現在のKubernetesバージョンに基づいて、デフォルトのPriorityLevelConfigurationsとFlowSchemasを自動的に生成します。 次のコマンドを実行して、PriorityLevelConfigurationsとFlowSchemasを照会できます。

    PriorityLevelConfigurationsのクエリに使用されるコマンドと出力の表示

    kubectl get PriorityLevelConfiguration
    # Expected output:
    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

    FlowSchemasおよび出力のクエリに使用されるコマンドの表示

    説明

    ACKでは、ackキーコンポーネントに関連するack-system-leader-electionとACK-default FlowSchemasが追加されます。 その他のFlowSchemasはKubernetesと同じです。

    kubectl get flowschemas
    # Expected output:
    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-inflightパラメーターとmax-mutating-requests-inflightパラメーターの合計を変更して、合計同時実行制限を増やします。

    500を超えるノードを含むクラスターの場合、合計を2000〜3000の値に設定することを推奨します。 3,000を超えるノードを含むクラスターの場合、合計を3000〜5000の値に設定することを推奨します。

  • PriorityLevelConfigurationsの再設定:

    • 優先度の高いリクエスト: 優先度の高いPriorityLevelConfigurationにスロットルしないリクエストを一致させるFlowSchemaを作成します。 例: workload-highまたはexempt免除優先度レベルのリクエストはAPFから免除されることに注意してください。 作業は慎重に行ってください。 新しいPriorityLevelConfigurationを設定して、優先度の高いリクエストに同時実行予算の大部分を割り当てることができます。

    • 優先度の低いリクエスト: APIサーバーのリソース使用率が高い場合、またはリクエストが遅いためにAPIサーバーの応答が遅い場合は、これらのリクエストを優先度の低いPriorityLevelConfigurationに一致させるFlowSchemaを作成できます。

重要
  • kube-apiserverコンポーネントは、ACK Proクラスター内の管理対象コンポーネントです。 デフォルトでは、kube-apiserverはゾーン間でデプロイされた少なくとも2つのレプリカを使用して高可用性を確保します。 制御プレーンのリソース使用量が増加すると、レプリカの数は最大で6にスケーリングされる。 kube-apiserverの同時実行制限=レプリカの数 × 各レプリカの同時実行制限。

  • kube-apiserverのカスタムパラメーターを変更すると、APIサーバーのローリング更新がトリガーされます。 これにより、クライアントコントローラは、リストウォッチ動作を再実行することができる。 大きなクラスターでは、APIサーバーが過負荷になる可能性があります。 この問題が発生すると、サービスは一時的に利用できなくなります。

kube-controller-managerおよびkube-scheduler

kube-controller-managerはkubeAPIQPSおよびkubeAPIBurstパラメーターを使用し、kube-schedulerはconnectionQPSおよびconnectionBurstパラメーターを使用してAPIサーバーとの通信のQPSを制御します。 詳細については、「ACK Proクラスターの制御プレーンコンポーネントのパラメーターのカスタマイズ」および「kube-schedulerのカスタムパラメーター」をご参照ください。

  • kube-controller-manager: 1,000を超えるノードを含むクラスターの場合、kubeAPIQPSを300を超える値に設定し、kubeAPIBurstを500を超える値に設定することを推奨します。

  • kube-scheduler: ほとんどの場合、変更は必要ありません。 ポッドのQPSが300 /秒を超える場合は、connectionQPSを800に、connectionBurstを1000に設定することを推奨します。

kubelet

kubeletのkube-api-burstおよびkube-api-qpsパラメーターのデフォルト値は5と10です。 ほとんどの場合、修正は必要ありません。 クラスター内のポッドのステータスがゆっくり更新された場合、ポッドがレイテンシーでスケジュールされた場合、またはボリュームがゆっくりマウントされた場合は、パラメーターの値を増やすことをお勧めします。 詳細については、「ノードプールのkubeletパラメーターのカスタマイズ」をご参照ください。

重要
  • kubeletパラメーターの値を増やすと、APIサーバーと通信するためのkubeletのQPSも増加します。 kubeletが大量のリクエストを送信すると、APIサーバーの負荷が増加することがあります。 コントロールプレーンの安定性を確保するために、値を段階的に増やし、APIサーバーのパフォーマンスとリソース使用量に注意することをお勧めします。

  • kubelet更新の頻度を制御する必要があります。 kubeletの更新中に制御プレーンの安定性を確保するために、ノードプール内のノードのkubeletを更新するとき、ACKは各バッチの最大同時実行性を10に制限します。

クラスターリソースのスケーリング頻度の計画

典型的には、大きなクラスタが安定して動作するとき、クラスタ内の制御プレーンはストレスを有さない。 大量のリソースを作成または削除したり、多数のノードをスケールアウトまたはスケールインしたりするなど、クラスタが大規模な操作を開始すると、制御プレーンが過負荷になる可能性があります。 その結果、クラスターのパフォーマンスが低下し、応答遅延が増加し、サービスが中断される可能性があります。

例えば、クラスタは5,000ノードを含む。 長期ビジネスのために多数のポッドがクラスタ内で安定して動作する場合、制御プレーンの負荷は増加しない。 ただし、クラスターに1,000ノードが含まれていて、10,000の一時ジョブを作成するか、1分以内に2,000ノードを追加する場合、制御プレーンの負荷が急上昇します。

したがって、大規模なクラスターでリソースの更新操作を実行する場合は、クラスターと制御プレーンの安定性を確保するために、クラスターのステータスに基づいて更新頻度を制限する必要があります。

次の方法で更新操作を実行することを推奨します。

重要

以下の提案の数字は、制御プレーンなどの要因による参照のためだけのものです。 更新頻度を徐々に増やします。 コントロールプレーンが通常どおりに応答できることを確認し、更新頻度を次のレベルに上げます。

  • ノードスケーリング: 2,000を超えるノードを含むクラスターの場合、ノードプールを手動でスケールする場合は各バッチのノード数を100以下に制限し、複数のノードプールを手動でスケールする場合は各バッチのノード数を300以下に制限することを推奨します。

  • アプリケーションポッドのスケーリング: アプリケーションがサービスに関連付けられている場合、EndpointおよびEndpointSliceの更新は、スケーリングアクティビティ中にすべてのノードにプッシュされます。 更新されるデータは、クラスター内のノード数とともに増加します。 クラスターに多数のノードが含まれている場合、クラスターストームが発生します。 5,000を超えるノードを含むクラスターの場合、エンドポイントに関連付けられていないポッドの更新QPSを300 /秒以下に制限し、エンドポイントに関連付けられているポッドの更新QPSを10 /秒以下に制限することを推奨します。 たとえば、デプロイでポッドローリングアップデートポリシーを要求する場合、ポッドの更新頻度を減らすために、maxUnavailablemaxSurgeを小さな値に設定することを推奨します。

クライアントがクラスターにアクセスするモードを最適化する

Kubernetesクラスターでは、アプリケーションやkubectlクライアントなどのクライアントは、APIサーバー。 クラスタ内のリソースの量が増加しても、クライアントが依然として同じ頻度で要求を送信する場合、要求は制御プレーンを過負荷にする可能性がある。 その結果、制御プレーンはゆっくりと応答するか、あるいはクラッシュする。 したがって、Kubernetesクラスターにデプロイされたリソースにアクセスする前に、アクセスするリソースのサイズとアクセス頻度を計画する必要があります。 大規模なクラスター内のリソースにアクセスする場合は、次の提案を読むことをお勧めします。

できれば、情報提供者を使用してローカルキャッシュにアクセス

リソースを取得するには、クライアント情報提供者を使用することが望ましい。 LISTリクエストをAPIサーバーに送信する代わりに、ローカルキャッシュからデータを取得します。 これにより、APIサーバーの負荷が軽減されます。

からリソースを取得するために使用されるメソッドを最適化します。APIサーバー

ローカルキャッシュにヒットしないリクエストは、リソースを取得するためにAPIサーバーに送信されます。 このシナリオでは、次の提案をお読みください。

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

    resourceVersionは、リソースのバージョンを示します。 値が0の場合、キャッシュデータはetcdではなくAPIサーバーから取得されます。 これにより、APIサーバーとetcd間の通信頻度が減少します。 LISTリクエストは、はるかに高速に処理できます。 例:

    k8sClient.CoreV1().Pods("").List(metav1.ListOptions{ResourceVersion: "0"})
  • すべてのリソースをリストしないでください。

    返されるデータの量を減らすには、フィルターを使用してLISTリクエストの範囲を制限します。 たとえば、LISTリクエストをフィルタリングするには、lable-selector (リソースラベルに基づくフィルタ) またはfield-selector (リソースフィールドに基づくフィルタ) を使用します。

    説明

    etcdはkey-valueストレージシステムです。 etcdは、ラベルまたはフィールドでデータをフィルタできません。 APIサーバーは、指定されたフィルター条件に基づいてすべてのリクエストをフィルターします。 フィルターを使用する場合は、LISTリクエストに対してresourceVersion0に設定することを推奨します。 要求されたデータは、etcdの代わりにAPIサーバー上のキャッシュから取得されるため、etcdの負荷が軽減されます。

  • 非CRDリソースにアクセスするには、JSONではなくprotobufを使用します。

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

    ただし、すべてのAPIリソースタイプがprotobuf形式をサポートしているわけではありません。 [Accept] リクエストヘッダーには、application/jsonapplication/vnd.kubernetes.protobufなど、複数のコンテンツタイプを指定できます。 このように、protobuf形式がサポートされていない場合、JSON形式のリソースが返されます。 詳細については、「リソースの代替表現」をご参照ください。 例:

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

集中コントローラの使用

クラスタデータを監視するために、各ノードに個別のコントローラを作成しないようにする必要があります。 そうしないと、コントローラが起動すると、大量のLISTリクエストが同時にAPIサーバーに送信され、クラスターのステータスが同期されます。 これは、制御プレーンの負荷を増加させ、サービスの安定性を損ない、またはサービスの中断を引き起こす。

この問題を回避するには、集中コントローラの使用を推奨します。 1つのノードで実行されるコントローラインスタンス、または少数のノードで実行されるコントローラインスタンスのグループを作成して、集中管理を行うことができます。 集中コントローラは、1回または数回起動することによって、LIST要求をリッスンし、処理することができる。 さらに、集中型コントローラは、少数のウォッチ接続を維持するだけでよいため、APIサーバの負荷が大幅に低減される。

大規模なワークロードを適切に計画する

デフォルトのサービスアカウントを自動的にマウントする機能を無効にする

ポッド内のSecretsが同期的に更新されるようにするために、kubeletは各Secretのウォッチ永続接続を作成します。 ウォッチメカニズムにより、kubeletはシークレット更新通知をリアルタイムで受信できます。 過剰な数の腕時計が作成されると、腕時計の接続は、制御プレーンの性能に影響を及ぼす可能性がある。

  • 1.22より前のバージョンのKubernetesでは: ポッドを作成すると、サービスアカウントを指定しないと、デフォルトのサービスアカウントが自動的にポッドのシークレットとしてマウントされます。 ポッド内のアプリケーションは、サービスアカウントを使用してAPIサーバーと安全に通信できます。

    バッチシステムのポッドまたはAPIサーバーにアクセスする必要のないポッドの場合は、サービスアカウントのトークンの自動マウントを明示的に禁止することを推奨します。 このように、関連する秘密と時計は作成されません。 詳細については、「automountServiceAccountToken」をご参照ください。 大規模なクラスターでは、この操作により、不要なSecretsとAPIサーバーのwatch接続の作成を回避できます。これにより、コントロールプレーンの負荷が軽減されます。

  • Kubernetes 1.22以降の場合: TokenRequest APIを使用して一時的な自動ローテーショントークンを取得し、投影ボリュームを使用してトークンをマウントできます。 この動作は、Secretsのセキュリティを強化するだけでなく、各サービスアカウントのSecretに対してkubeletによって確立された監視接続を減少させる。 このようにして、クラスターのパフォーマンスが保証されます。

    serviceAccountToken投影ボリュームを有効にする方法の詳細については、「ServiceAccountトークンボリューム投影の使用」をご参照ください。

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

ConfigMaps、Secrets、永続ボリュームクレーム (PVC) などのアイドル状態のKubernetesリソースをできるだけ早く削除して、システムリソースの使用量を減らし、クラスターパフォーマンスを確保します。 次の提案を読むことをお勧めします。

  • 過去のDeployment ReplicaSetsの数を制限する: revisionHistoryLimitは、Deploymentに対して保持される過去のReplicaSetsの数を要求します。 値が大きい場合、Kubernetesは過剰な数の履歴ReplicaSetを保持します。 これにより、kube-controller-managerの負荷が増加します。 大規模なクラスターでは、多数のデプロイメントを頻繁に更新する必要がある場合、デプロイメントのrevisionHistoryLimitの値を減らし、履歴ReplicaSetを削除できます。 デプロイメントのrevisionHistoryLimitのデフォルト値は10です。

  • 不要になったジョブとポッドの削除: CronJobsまたはその他のメカニズムによって作成された多数のJobオブジェクトがクラスターに含まれている場合は、ttlSecondsAfterFinishedを使用して、前のサイクル内にジョブ用に作成されたポッドを自動的に削除します。

Informerコンポーネントにリソースを適切に割り当てる

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

コントローラーやkube-schedulerなどのInformerコンポーネントのメモリ使用量は、Watchリソースのサイズによって異なります。 大規模なクラスターでは、メモリ不足 (OOM) の問題を回避するために、Informerコンポーネントのメモリ使用量に注意してください。 InformerコンポーネントがOOMの問題に頻繁に遭遇すると、リソースリスニングエラーが発生する可能性があります。 Informerコンポーネントが頻繁に再起動すると、各List-Watch操作によって制御プレーン (特にAPIサーバー) の負荷が増加します。

コントロールプレーンのメトリックに注意してください

主要な制御プレーンコンポーネントのメトリックを表示し、制御プレーンコンポーネントのダッシュボードで異常なメトリックを分析できます。 大規模なクラスターでは、次のメトリックに細心の注意を払う必要があります。 使用上の注意事項とメトリクスの説明の詳細については、「コントロールプレーンコンポーネントの監視」をご参照ください。

制御プレーンコンポーネントのリソース使用量

次の表に、制御プレーンコンポーネントのリソース使用量メトリックを示します。

メトリック

PromQL

説明

メモリ使用量

memory_utilization_byte{container="kube-apiserver"}

kube-apiserverのメモリ使用量。 単位はバイトです。

CPU使用率

cpu_utilization_core{container="kube-apiserver"}* 1000

kube-apiserverのCPU使用率。 単位: ミリコア。

kube-apiserver

メトリックとその説明を表示する方法の詳細については、「メトリックのkube-apiserver」をご参照ください。

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

    メトリック

    PromQL

    説明

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

    • max by(resource)(apiserver_storage_objects)

    • max by (リソース)(etcd_object_counts)

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

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

    説明

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

  • リクエストの待ち時間

    メトリック

    PromQL

    説明

    GET読み取りリクエスト遅延P[0.9]

    histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb="GET",resource!="",subresource!="," log | proxy "}[$interval])) by (pod, verb, resource, subresource, scope, le))

    APIサーバーポッド、GET動詞、リソース、スコープのディメンションに基づいて表示されるGETリクエストの応答時間。

    リスト読み取りリクエスト遅延P[0.9]

    histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb="LIST"}[$interval]))) by (pod_name, verb, resource, scope, le)

    LISTリクエストの応答時間は、APIサーバーポッド、LIST動詞、リソース、およびスコープのディメンションに基づいて表示されます。

    書き込みリクエスト遅延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))

    APIサーバーポッド、GET、WATCH、LIST、CONNECTなどの動詞、リソース、およびスコープのディメンションに基づいて表示される変更要求の応答時間。

  • リクエストの調整

    メトリック

    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のスロットルレート。 No dataまたは0は、リクエストスロットリングがトリガーされないことを示します。

kube-scheduler

メトリックとその説明を表示する方法の詳細については、「メトリックのkube-scheduler」をご参照ください。

  • 保留中のポッド数

    メトリック

    PromQL

    説明

    スケジューラ保留ポッド

    scheduler_pending_pods{job="ack-scheduler"}

    保留中のポッドの数。 保留中のポッドは、次のタイプで構成されます。

    • unschedulable: unschedulableポッド。

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

    • active: アクティブなキューポッド。スケジュールする準備ができているポッドです。

  • リクエストの待ち時間

    メトリック

    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によって返された応答との間の時間間隔。 レイテンシは、動詞とURLに基づいて計算されます。

kube-controller-manager

メトリクスとその説明を表示する方法の詳細については、「Monitor kube-controller-manager」をご参照ください。

ワークキュー

メトリック

PromQL

説明

ワークキューの深さ

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

指定された間隔でのワークキューの長さの変更。

ワークキュー処理の遅延

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

ワークキュー内のイベントの期間。

etcd

メトリクスとその説明を表示する方法の詳細については、「metrics of etcd」をご参照ください。

  • キーと値のペアの総数

    メトリック

    PromQL

    説明

    合計kv

    etcd_debugging_mvcc_keys_total

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

  • etcdサイズ (DBサイズ)

    メトリック

    PromQL

    説明

    ディスクサイズ

    etcd_mvcc_db_total_size_in_bytes

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

    etcd_mvcc_db_total_size_in_use_in_bytes

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

関連ドキュメント