由于目前一个安全沙箱运行时节点上的所有容器(包括安全沙箱容器)的RootFS底层共享一块云盘,部分应用容器可能占满整块云盘IO,从而影响节点上其他应用容器。本文通过示例说明如何为Pod配置RootFS Block IO限制,帮助您避免容器间的IO抢占问题。

前提条件

为Pod配置RootFS Block IO限制前,请确保您已经:

背景信息

RootFS Block IO限速类型如下:
  • read_bps:每秒最大的读取字节数。
  • write_bps:每秒最大的写入字节数。
  • read_iops:每秒最大的读IOPS。
  • write_iops:每秒最大的写IOPS。
注意 此文档内容仅适用于安全沙箱容器v1(1.x.x)版本,不适用于v2版本。

配置说明

为Pod配置RootFS Block IO限制时,您需要在Pod的annotations中增加一对Key:Value配置。配置如下:
  • 设置annotations中的Key值为io.kubernetes.container.blkio
  • 设置annotations中的Value值为以下格式。
    '{
      "device_read_bps": [
        {
          "device": "rootfs",
          "value": "${VALUE}"
        }
      ],
      "device_write_bps": [
        {
          "device": "rootfs",
          "value": "${VALUE}"
        }
      ],
      "device_read_iops": [
        {
          "device": "rootfs",
          "value": "${VALUE}"
        }
      ],
      "device_write_iops": [
        {
          "device": "rootfs",
          "value": "${VALUE}"
        }
      ]
    }'
    参数 类型 含义
    device_read_bps 数组 设备每秒最大可以被读取的字节数。
    device_read_bps[].device 字符串 设备绝对路径,例如/dev/sda1。目前只支持rootfs。
    device_read_bps[].value 字符串 具体限制的值,单位支持k、m、g。例如20m,表示每秒最大可以被读取20兆字节。
    device_write_bps 数组 设备每秒最大可以被写入的字节数。
    device_write_bps[].device 字符串 设备绝对路径,例如/dev/sda1。目前只支持rootfs。
    device_write_bps[].value 字符串 具体限制的值,单位支持k、m、g。例如20m,表示每秒最大可以被写入20兆字节。
    device_read_iops 数组 设备允许读的最大iops。
    device_read_iops[].device 字符串 设备绝对路径,例如/dev/sda1。目前只支持rootfs。
    device_read_iops[].value 字符串 具体限制的值,例如200,表示读iops不超过200。
    device_write_iops 数组 设备允许写的最大iops。
    device_write_iops[].device 字符串 设备绝对路径,例如/dev/sda1。目前只支持rootfs。
    device_write_iops[].value 字符串 具体限制的值,例如200,表示写iops不超过200。

示例

本文以通过定义Deployment部署一个测试应用,并限制Pod内容器RootFS每秒最大的读写字节数都是20MiB、读IOPS限制为200、写IOPS限制为300为例,说明如何为Pod配置RootFS Block IO限制。示例模板如下。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: iops-app
  name: iops-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iops-app
  template:
    metadata:
      labels:
        app: iops-app
      annotations:
        io.kubernetes.container.blkio: '{"device_read_bps":[{"device":"rootfs","value":"20m"}],"device_write_bps":[{"device":"rootfs","value":"20m"}],"device_read_iops":[{"device":"rootfs","value":"200"}],"device_write_iops":[{"device":"rootfs","value":"300"}]}'
    spec:
      runtimeClassName: runv
      nodeSelector:
        alibabacloud.com/container-runtime: Sandboxed-Container.runv
      containers:
        - image: docker.io/centos:7
          command: ["/bin/sh","-c"]
          args: ["while(true);do /bin/sleep 10;done"]
          name: iops-app
          resources:
            requests:
              memory: "1Gi"
              cpu: 1
            limits:
              memory: "1Gi"
              cpu: 1
          volumeMounts:
            - name: host-time
              mountPath: /etc/localtime
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime

测试验证

  1. 执行以下命令登录到已经创建好的安全沙箱Pod中。
    kubectl get pod
    kubectl exec -ti ${POD} /bin/sh
  2. 执行以下命令对容器进行压测。
    cd /
    dd if=/dev/zero of=test oflag=direct bs=1M count=10
    dd if=/dev/zero of=test oflag=direct bs=2M count=20

执行结果

压测结果

如上图所示,写入速率为20MB左右,符合annotations中设置的阈值。