配置调度忽略特定容器资源

阿里云容器计算服务ACS支持采用Sidecar容器的形式实现类似DaemonSet的效果。为了避免在使用Sidecar模式时增加Pod的资源消耗, 同时保证Sidecar容器和业务容器合理共享资源,您可以通过配置调度策略来忽略Sidecar容器的资源占用。本文介绍如何在ACS集群中配置调度策略,以忽略特定容器资源。

功能说明

在ACS集群中,由于虚拟节点的限制,不支持Kubernetes的DaemonSet功能。此时可以采用为ACS Pod添加Sidecar容器的形式来实现类似DaemonSet的效果。同时,ACS支持忽略特定容器资源的功能,您可以为Sidecar容器添加忽略容器资源的环境变量。在ACS实例进行资源规整和调度时,系统会直接忽略该容器;而运行时则会继续遵循容器的resources.requestsresources.limits,以保持Sidecar容器与实例中其他容器的资源共享和隔离。

ignore-resource.svg

重要

忽略特定容器的资源意味着该容器实际上是复用了该ACS Pod中其他容器的资源。如果遇到其他容器的资源余量不足, 可能会导致忽略资源的容器的CPU用量被压制或者出现OOM的情况。

配置说明

忽略容器资源的环境变量名为__IGNORE_RESOURCE__,设置取值为true时则表示忽略该容器的资源声明。

配置示例

  1. 使用以下内容创建test-ignore.yaml。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-ignore
      labels:
        app: test
    spec:
      replicas: 1 
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          labels:
            app: test
        spec:
          containers:
          - name: app
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ["/bin/sh", "-c", "sleep 999"]
            resources:
              requests:
                cpu: 1
                memory: 2Gi
          - name: sidecar
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ["/bin/sh", "-c", "sleep 999"]
            resources:
              requests:
                cpu: 0.25
                memory: 0.5Gi

    此YAML将创建一个包含1个Pod副本的Deployment。Pod内包含两个容器,都做了资源声明。

  2. 执行以下命令,创建Deployment。

    kubectl apply -f test-ignore.yaml
  3. 执行以下命令,查看Pod的详细信息,确认Pod规整后的规格。

    kubectl get pod <pod-name> -o yaml | grep alibabacloud.com/pod-use-spec

    预期输出:

    alibabacloud.com/pod-use-spec: 2-4Gi

    可以看到, 如果不配置忽略容器资源,该ACS实例的规整结果是2-4Gi

  4. 使用以下内容更新test-ignore.yaml中的sidecar容器部分,为sidecar增加忽略资源声明的环境变量。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-ignore
    .....
          - name: sidecar
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ["/bin/sh", "-c", "sleep 999"]
            env:
            - name: __IGNORE_RESOURCE__
              value: "true"
            resources:
              requests:
                cpu: 0.25
                memory: 0.5Gi
  5. 执行以下命令,更新deployment。

    kubectl apply -f test-ignore.yaml
  6. 再次执行以下命令,查看Pod的详细信息,确认Pod规整后的规格。

    kubectl get pod <pod-name> -o yaml | grep alibabacloud.com/pod-use-spec

    可以看到,ACS实例规整后的结果为1-2Gi

  7. 检查容器运行时的CPU权重。

    1. 执行以下命令,登录到app容器内,查看app容器的CPU权重。

      kubectl exec -ti <pod-name> -c app -- cat /sys/fs/cgroup/cpu/cpu.shares

      预期输出:

      1024
    2. 执行以下命令,登录到sidecar容器内,查看sidecar容器的CPU权重。

      kubectl exec -ti <pod-name> -c sidecar -- cat /sys/fs/cgroup/cpu/cpu.shares

      预期输出:

      256

      可以看到该ACS实例的app和sidecar容器的运行时CPU shares比例是4:1。

说明

如果把sidecar容器的resources.requests设置成0, 也可以达到规整后是1-2Gi的效果,但是在运行时,app容器和sidecar容器的CPU shares比例会远远大于期望的4:1的比例,无法合理设置。

下表展示了各种Pod配置下的资源规整结果以及实际生效的资源隔离情况:

sidecar configuration

app vs sidecar CPU shares

Pod resource

ignore_resource=false

CPU request=0.25c

4:1

2c4g

ignore_resource=false

CPU request=0c

512:1

1c2g

ignore_resource=true

CPU request=0.25c

4:1

1c2g