全部產品
Search
文件中心

Container Service for Kubernetes:Block Storage限速最佳實務

更新時間:Jun 19, 2024

Kubernetes本身不支援對儲存介質進行限速,您可以通過Container ServiceACK實現對某個Pod進行某個塊裝置(雲端硬碟或LVM本地碟)的限速,有效地管理和分配儲存資源,確保系統的效能和穩定性,同時減少不必要的成本。本文以雲端硬碟為例介紹如何對Block Storage進行限速。

使用限制

  • 宿主機作業系統必須為Alibaba Cloud Linux 2及以上版本。

  • ACK叢集版本不低於1.20。

  • CSI儲存群組件版本不低於1.22。版本資訊,請參見csi-provisioner

參數說明

  • readIOPS:限制當前Pod對指定Block Storage每秒讀IO的次數。

  • writeIOPS:限制當前Pod對指定Block Storage每秒寫IO的次數。

  • readBPS:限制當前Pod對指定Block Storage每秒讀取的資料量,單位 (KB,MB,GB)。

  • writeBPS:限制當前Pod對指定Block Storage每秒寫入的資料量,單位(KB,MB,GB)。

使用方式

本文以雲端硬碟為例說明如何對Block Storage進行限速。您可以通過動態建立雲端硬碟或靜態建立雲端硬碟的方式使用。

說明

Block Storage限速設定後,無法變更。

通過動態建立雲端硬碟的方式使用

  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,即可使用限速雲端硬碟。

    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. 執行以下命令,查看容器的塊裝置限制值。

    # 登入宿主機, 根據PodUID來進行路徑拼接, 查看值是否被正確設定上。
    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,即可使用限速雲端硬碟。

    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. 執行以下命令,查看容器的塊裝置限制值。

    # 登入宿主機, 根據PodUID來進行路徑拼接, 查看值是否被正確設定上。
    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