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

Container Service for Kubernetes:ブロックストレージデバイスのスロットルに関するベストプラクティス

最終更新日:Oct 21, 2024

オープンソースKubernetesはブロックストレージデバイスのスロットリングをサポートしていません。 Container Service for Kubernetes (ACK) では、Logical Volume Manager (LVM) を使用して仮想化されたクラウドディスクやローカルディスクなど、ポッドにマウントされているブロックストレージデバイスを抑制できます。 これにより、ストレージリソースをより効率的に管理および割り当て、システムのパフォーマンスと安定性を確保し、コストを削減できます。 このトピックでは、ブロックストレージデバイスをスロットルする方法について説明します。

制限事項

  • ホストが使用するOSは、Alibaba Cloud Linux 2以降である必要があります。

  • ACKクラスターのKubernetesバージョンは1.20以降である必要があります。

  • クラスターで使用されるContainer Storage Interface (CSI) プラグインのバージョンは、1.22以降である必要があります。 CSIバージョンの詳細については、「csi-provisioner」をご参照ください。

パラメーター

  • readIOPS: ポッドがブロックストレージデバイスで実行できる1秒あたりの読み取り操作の最大数を指定します。

  • writeIOPS: ポッドがブロックストレージデバイスに対して実行できる1秒あたりの最大書き込み操作数を指定します。

  • readBPS: ポッドがブロックストレージデバイスから読み取ることができる1秒あたりの最大データ量を指定します。

  • writeBPS: ポッドがブロックストレージデバイスに書き込むことができる1秒あたりの最大データ量を指定します。

ブロックストレージデバイスをスロットルする方法

次の例は、クラウドディスクをスロットルする方法を示しています。 クラウドディスクは、動的にプロビジョニングされたボリュームまたは静的にプロビジョニングされたボリュームとしてマウントできます。

説明

設定後、スロットル設定は変更できません。

動的にプロビジョニングされたボリュームとしてディスクをマウントする

  1. alicloud-disk-topology-essd.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-topology-essd
    parameters:
      type: cloud_essd
      readIOPS: "100"
      writeIOPS: "10"
      readBPS: "100k"
      writeBPS: "100m"
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
  2. 次のコマンドを実行してStorageClassを作成します。

    kubectl apply -f alicloud-disk-topology-essd.yaml
  3. nginx.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

    アプリケーションは、作成したStorageClassを参照する永続ボリューム要求 (PVC) を使用して、クラウドディスクをボリュームとして動的にプロビジョニングします。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web-csi-encrypt
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      podManagementPolicy: "Parallel"
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          hostNetwork: true
          containers:
          - name: nginx
            command:
            - sleep
            - "999999999"
            image: nginx
            volumeMounts:
            - name: disk-csi
              mountPath: /data
      volumeClaimTemplates:
      - metadata:
          name: disk-csi
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: alicloud-disk-topology-essd
          resources:
            requests:
              storage: 80Gi
  4. 次のコマンドを実行して、アプリケーションを作成します。

    kubectl apply -f nginx.yaml
  5. 次のコマンドを実行して、コンテナーで使用されるブロックストレージデバイスの読み取り制限と書き込み制限を表示します。

    Log on to the host. Specify the UID of the pod in the following code to verify that the limit is set to the value that you specified. 
    readIOPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_iops_device
    writeIOPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_iops_device
    readBPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_bps_device
    writeBPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_bps_device

静的にプロビジョニングされたボリュームとしてディスクをマウントする

  1. 次のテンプレートを使用して、pv-static.yamlという名前のファイルを作成します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: d-****
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 80Gi
      csi:
        driver: diskplugin.csi.alibabacloud.com
        fsType: ext4
        volumeAttributes:
          app: nginx
          type: cloud_ssd
          readBPS: 100K
          readIOPS: "100"
        volumeHandle: d-****
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem
  2. 次のコマンドを実行してPVを作成します。

    kubectl apply -f pv-static.yaml
  3. 次のテンプレートを使用して、pvc-static.yamlファイルを作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      labels:
        app: nginx
      name: disk-pvc
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 80Gi
      volumeMode: Filesystem
      volumeName: d-****
  4. 次のコマンドを実行してPVCを作成します。

    kubectl apply -f pvc-static.yaml
  5. nginx.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

    アプリケーションは作成したPVCを使用します。 PVCは、クラウドディスクをボリュームとして静的にプロビジョニングするために使用されます。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deploy-disk
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            volumeMounts:
            - name: disk-pvc2
              mountPath: /data
          volumes:
            - name: disk-pvc2
              persistentVolumeClaim:
                claimName: disk-pvc
  6. 次のコマンドを実行して、アプリケーションを作成します。

    kubectl apply -f nginx.yaml
  7. 次のコマンドを実行して、コンテナーで使用されるブロックストレージデバイスの読み取り制限と書き込み制限を表示します。

    Log on to the host. Specify the UID of the pod in the following code to verify that the limit is set to the value that you specified. 
    readIOPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_iops_device
    writeIOPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_iops_device
    readBPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_bps_device
    writeBPS: /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_bps_device