Kubernetes本身不支持对存储介质进行限速,您可以通过容器服务ACK实现对某个Pod进行某个块设备(云盘或LVM本地盘)的限速。本文以云盘为例介绍如何对块存储进行限速。
使用限制
- 宿主机操作系统必须为Alibaba Cloud Linux 2及以上版本。
- ACK集群版本不低于1.20。
- CSI存储组件版本不低于1.22。版本信息,请参见csi-provisioner。
参数说明
- readIOPS:限制当前Pod对指定块存储每秒读IO的次数。
- writeIOPS:限制当前Pod对指定块存储每秒写IO的次数。
- readBPS:限制当前Pod对指定块存储每秒读取的数据量,单位 (KB,MB,GB)。
- writeBPS:限制当前Pod对指定块存储每秒写入的数据量,单位(KB,MB,GB)。
使用方式
本文以云盘为例说明如何对块存储进行限速。您可以通过动态创建云盘或静态创建云盘的方式使用。
通过动态创建云盘的方式使用
- 使用以下内容,创建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.yaml
- 使用以下内容,创建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
- 执行以下命令,创建应用。
kubectl apply -f nginx.yaml
- 执行以下命令,查看容器的块设备限制值。
# 登录宿主机, 根据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
通过静态创建云盘的方式使用
- 使用以下内容,创建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.yaml
- 使用以下内容,创建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
- 执行以下命令,创建应用。
kubectl apply -f nginx.yaml
- 执行以下命令,查看容器的块设备限制值。
# 登录宿主机, 根据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