オープンソースの Kubernetes は、ブロックストレージデバイスのスロットリングをサポートしていません。Container Service for Kubernetes (ACK) を使用すると、クラウドディスクや Logical Volume Manager (LVM) を使用して仮想化されたローカルディスクなど、Pod にマウントされたブロックストレージデバイスをスロットリングできます。これにより、ストレージリソースをより効率的に管理および割り当て、システムのパフォーマンスと安定性を確保し、コストを削減できます。このトピックでは、ブロックストレージデバイスをスロットリングする方法について説明します。
制限事項
ホストで使用される OS は、Alibaba Cloud Linux 2 以降である必要があります。
ACK クラスターの Kubernetes バージョンは 1.20 以降である必要があります。
クラスターで使用される Container Storage Interface (CSI) プラグインのバージョンは 1.22 以降である必要があります。CSI バージョンの詳細については、「csi-provisioner」をご参照ください。
パラメーター
readIOPS: Pod がブロックストレージデバイスで 1 秒あたりに実行できる読み取り操作の最大数を指定します。
writeIOPS: Pod がブロックストレージデバイスで 1 秒あたりに実行できる書き込み操作の最大数を指定します。
readBPS: Pod がブロックストレージデバイスから 1 秒あたりに読み取ることができるデータの最大量を指定します。
writeBPS: Pod がブロックストレージデバイスに 1 秒あたりに書き込むことができるデータの最大量を指定します。
使用方法
次の例は、クラウドディスクをスロットリングする方法を示しています。クラウドディスクは、動的プロビジョニングボリュームまたは静的プロビジョニングボリュームとしてマウントできます。
クラウドディスクのスロットリング設定を構成した後は、変更できません。StorageClass でスロットリング構成を調整した場合、変更は新しく作成されたクラウドディスクにのみ適用されます。既存のクラウドディスクは影響を受けません。
動的プロビジョニングボリュームとしてディスクをマウントする
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次のコマンドを実行して StorageClass を作成します。
kubectl apply -f alicloud-disk-topology-essd.yamlnginx.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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: disk-csi mountPath: /data volumeClaimTemplates: - metadata: name: disk-csi spec: accessModes: [ "ReadWriteOnce" ] storageClassName: alicloud-disk-topology-essd resources: requests: storage: 80Gi次のコマンドを実行してアプリケーションを作成します。
kubectl apply -f nginx.yamlcgroup バージョンに基づいてコンテナーのブロックデバイスの制限を表示します。
次のコマンドを実行して cgroup バージョンを確認します。
stat -fc %T /sys/fs/cgroup出力が
cgroup2fsの場合、バージョンは cgroup V2 です。それ以外の場合は cgroup V1 です。cgroup バージョンに基づいてコンテナーのブロックデバイスの制限を表示します。
cgroup V2
ホストにログインし、Pod UID を使用してパスを構築する必要があります。次のコマンドを実行して、制限が正しく設定されていることを確認します。
/sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod<UID>.slice/io.maxcgroup V1
ホストにログインし、Pod UID を使用してパスを構築する必要があります。次のコマンドを実行して、制限が正しく設定されていることを確認します。
readIOPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_iops_devicewriteIOPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_iops_devicereadBPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_bps_devicewriteBPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_bps_device
静的プロビジョニングボリュームとしてディスクをマウントする
次のテンプレートを使用して、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次のコマンドを実行して PV を作成します。
kubectl apply -f pv-static.yaml次のテンプレートを使用して 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-****次のコマンドを実行して PVC を作成します。
kubectl apply -f pvc-static.yamlnginx.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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: disk-pvc2 mountPath: /data volumes: - name: disk-pvc2 persistentVolumeClaim: claimName: disk-pvc次のコマンドを実行してアプリケーションを作成します。
kubectl apply -f nginx.yamlcgroup バージョンに基づいてコンテナーのブロックデバイスの制限を表示します。
次のコマンドを実行して cgroup バージョンを確認します。
stat -fc %T /sys/fs/cgroup出力が
cgroup2fsの場合、バージョンは cgroup V2 です。それ以外の場合は cgroup V1 です。cgroup バージョンに基づいてコンテナーのブロックデバイスの制限を表示します。
cgroup V2
ホストにログインし、Pod UID を使用してパスを構築する必要があります。次のコマンドを実行して、制限が正しく設定されていることを確認します。
/sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod<UID>.slice/io.maxcgroup V1
ホストにログインし、Pod UID を使用してパスを構築する必要があります。次のコマンドを実行して、制限が正しく設定されていることを確認します。
readIOPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_iops_devicewriteIOPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_iops_devicereadBPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_bps_devicewriteBPS:
/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_bps_device