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

Container Compute Service:容量スケジューリングの使用

最終更新日:Dec 27, 2024

Alibaba Cloud Container Compute Service (ACS) は、オープンソース Kubernetes の ResourceQuota メカニズムを使用して、名前空間内のリソース使用量を制限および制御します。ResourceQuota を使用すると、名前空間内のさまざまなリソースの使用量 (CPU、メモリ、ストレージリソースの使用量、レプリケートされたポッドの数、サービスの数など) を制限および監視できます。これにより、名前空間内の他のアプリケーションが過剰なリソースを占有することを防ぎ、アプリケーションの安定性と信頼性を確保できます。

ResourceQuota

ACS クラスタでオープンソース Kubernetes の ResourceQuota メカニズムを使用して、各名前空間のリソース使用量の合計を制御できます。 ResourceQuota を定義して、名前空間内のリソース (CPU、メモリ、拡張リソースなど) の上限を制限できます。名前空間でポッドやサービスなどの Kubernetes リソースを作成すると、Kubernetes のクォータシステムはクラスタのリソース使用量を追跡し、リソース使用量の合計が名前空間の ResourceQuota で定義されているハードリソース制限を超えないようにします。

ResourceQuota を使用する場合、次の項目に注意してください。

  • 各チームまたはアプリケーションには、個別の名前空間が必要です。

  • クラスタ管理者は、各名前空間に 1 つ以上の ResourceQuota を作成する必要があります。

  • リソース使用量が ResourceQuota のハードリソース制限を超えると、後続の Kubernetes リソース作成リクエストは拒否されます。

  • ResourceQuota で CPU およびメモリクォータを構成する場合は、作成するポッドのリソースリクエストと制限を構成する必要があります。そうしないと、ポッドを作成できません。

説明
  • 拡張リソースなどの他のリソースのリソースリクエストまたは制限を構成する必要はありません。注: LimitRanger アドミッションコントローラを使用して、リソースリクエストが構成されていないポッドのデフォルトのリソース制限を構成できます。

  • ResourceQuota の名前は、有効な DNS サブドメイン である必要があります。

  • ResourceQuota を変更した後、変更は既に ResourceQuota を使用しているリソースには適用されません。

ResourceQuota 機能の有効化

デフォルトでは、ACS コンソールで作成された Container Service for Kubernetes (ACK) クラスタでは、ResourceQuota 機能が有効になっています。名前空間で ResourceQuota を作成するだけで済みます。その後、名前空間で resourceQuota 機能が有効になります。

サポートされているリソースタイプ

ACS は、オープンソース Kubernetes の ResourceQuota メカニズムと完全に互換性があります。したがって、標準リソースと拡張リソースの両方が ResourceQuota をサポートしています。

標準リソース

リソース名

説明

limits.cpu

終了状態ではないポッドの CPU 使用量は、この制限を超えてはなりません。

limits.memory

終了状態ではないポッドのメモリ使用量は、この制限を超えてはなりません。

requests.cpu

終了状態ではないポッドの CPU リクエストは、この制限を超えてはなりません。

requests.memory

終了状態ではないポッドのメモリリクエストは、この制限を超えてはなりません。

enormouspages-<size>

終了状態ではないポッドの EnormousPage リクエストのサイズは、この制限を超えてはなりません。

cpu

requests.cpu と同等です。

memory

requests.memory と同等です。

拡張リソース

Kubernetes は、拡張リソースのオーバーコミット (制限 > リクエスト) をサポートしていません。したがって、「requests.」で始まるリソースクォータのみを構成する必要があります。

説明

詳細については、リソースクォータ を参照してください。

この例では、kubectl を使用して ResourceQuota を表示および作成する方法を示します。

  1. 名前空間を作成します。

  2. kubectl create namespace test
  3. ResourceQuota を作成して、test という名前の Namespace の CPU 制限を 4000 ミリコアに設定します。

  4. cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: test-quota
      namespace: test
    spec:
      hard:
        requests.cpu: "4000m"
        limits.cpu: "4000m"
    EOF
  5. ResourceQuota をクエリします。

  6. kubectl -n test describe resourcequota test-quota
    Name:         test-quota
    Namespace:    test
    Resource      Used  Hard
    --------      ----  ----
    limits.cpu    0     4
    requests.cpu  0     4
  7. 4 つのポッドを作成します。各ポッドは最大 1000 ミリコアを使用できます。

  8. cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: test-app
      name: test-app
      namespace: test
    spec:
      replicas: 5  // 5つのレプリカを指定
      selector:
        matchLabels:
          app: test-app
      template:
        metadata:
          labels:
            app: test-app
        spec:
          containers:
          - image: busybox:latest
            imagePullPolicy: IfNotPresent
            name: test
            command:
            - sleep
            - "360000000"
            resources:
              limits:
                cpu: "1"
    EOF
  9. ポッドをクエリします。出力は、4 つのポッドが実行中状態であることを示しています。

  10. kubectl -n test get pod
    NAME                        READY   STATUS    RESTARTS   AGE
    test-app-5ddc68c994-jdv4m   1/1     Running   0          35s
    test-app-5ddc68c994-jhmtb   1/1     Running   0          35s
    test-app-5ddc68c994-mr8vq   1/1     Running   0          35s
    test-app-5ddc68c994-pjdfn   1/1     Running   0          35s
  11. test-quota という名前の ResourceQuota の状態をクエリします。出力は、「使用済み」列の値が「ハード」列の値と等しいことを示しています。

  12. kubectl -n test describe resourcequota
    Name:         test-quota
    Namespace:    test
    Resource      Used  Hard
    --------      ----  ----
    limits.cpu    4     4
    requests.cpu  4     4
  13. 別のポッドを作成します。ポッド作成リクエストは、ResourceQuota アドミッションコントローラによってインターセプトされます。

    1. ポッドを作成します。

      kubectl -n test scale deploy test-app --replicas 5
    2. ReplicaSet をクエリします。「DESIRED」列には 5 が表示されますが、「CURRENT」列には 4 が表示されます。これは、ポッドの作成に失敗したことを示しています。

      kubectl -n test get rs
      NAME                  DESIRED   CURRENT   READY   AGE
      test-app-5ddc68c994   5         4         4       3m10s
    3. ReplicaSet のイベントをクエリします。出力は、新しいポッドが ResourceQuota アドミッションコントローラによってインターセプトされたことを示しています。

      k -n test describe rs test-app-5ddc68c994
      Name:           test-app-5ddc68c994
      Namespace:      test
      Selector:       app=test-app,pod-template-hash=5ddc68c994
      Labels:         app=test-app
                      pod-template-hash=5ddc68c994
      Annotations:    deployment.kubernetes.io/desired-replicas: 5
                      deployment.kubernetes.io/max-replicas: 7
                      deployment.kubernetes.io/revision: 1
      Controlled By:  Deployment/test-app
      Replicas:       4 current / 5 desired
      Pods Status:    4 Running / 0 Waiting / 0 Succeeded / 0 Failed
      Pod Template:
        Labels:  app=test-app
                 pod-template-hash=5ddc68c994
        Containers:
         test:
          Image:      busybox:latest
          Port:       <none>
          Host Port:  <none>
          Command:
            sleep
            360000000
          Limits:
            cpu:        1
          Environment:  <none>
          Mounts:       <none>
        Volumes:        <none>
      Conditions:
        Type             Status  Reason
        ----             ------  ------
        ReplicaFailure   True    FailedCreate
      Events:
        Type     Reason            Age                    From                   Message
        ----     ------            ----                   ----                   -------
        Normal   SuccessfulCreate  3m18s                  replicaset-controller  Created pod: test-app-5ddc68c994-pjdfn
        Normal   SuccessfulCreate  3m18s                  replicaset-controller  Created pod: test-app-5ddc68c994-jdv4m
        Normal   SuccessfulCreate  3m18s                  replicaset-controller  Created pod: test-app-5ddc68c994-jhmtb
        Normal   SuccessfulCreate  3m18s                  replicaset-controller  Created pod: test-app-5ddc68c994-mr8vq
        Warning  FailedCreate      3m18s                  replicaset-controller  Error creating: pods "test-app-5ddc68c994-5s4ph" is forbidden: exceeded quota: test-quota, requested: limits.cpu=1,requests.cpu=1, used: limits.cpu=4,requests.cpu=4, limited: limits.cpu=4,requests.cpu=