阿里云容器计算服务ACS支持采用Sidecar容器的形式实现类似DaemonSet的效果。为了避免在使用Sidecar模式时增加Pod的资源消耗, 同时保证Sidecar容器和业务容器合理共享资源,您可以通过配置调度策略来忽略Sidecar容器的资源占用。本文介绍如何在ACS集群中配置调度策略,以忽略特定容器资源。
功能说明
在ACS集群中,由于虚拟节点的限制,不支持Kubernetes的DaemonSet功能。此时可以采用为ACS Pod添加Sidecar容器的形式来实现类似DaemonSet的效果。同时,ACS支持忽略特定容器资源的功能,您可以为Sidecar容器添加忽略容器资源的环境变量。在ACS实例进行资源规整和调度时,系统会直接忽略该容器;而运行时则会继续遵循容器的resources.requests
和resources.limits
,以保持Sidecar容器与实例中其他容器的资源共享和隔离。
忽略特定容器的资源意味着该容器实际上是复用了该ACS Pod中其他容器的资源。如果遇到其他容器的资源余量不足, 可能会导致忽略资源的容器的CPU用量被压制或者出现OOM的情况。
配置说明
忽略容器资源的环境变量名为__IGNORE_RESOURCE__
,设置取值为true
时则表示忽略该容器的资源声明。
配置示例
使用以下内容创建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内包含两个容器,都做了资源声明。
执行以下命令,创建Deployment。
kubectl apply -f test-ignore.yaml
执行以下命令,查看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
。使用以下内容更新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
执行以下命令,更新deployment。
kubectl apply -f test-ignore.yaml
再次执行以下命令,查看Pod的详细信息,确认Pod规整后的规格。
kubectl get pod <pod-name> -o yaml | grep alibabacloud.com/pod-use-spec
可以看到,ACS实例规整后的结果为
1-2Gi
。检查容器运行时的CPU权重。
执行以下命令,登录到
app
容器内,查看app
容器的CPU权重。kubectl exec -ti <pod-name> -c app -- cat /sys/fs/cgroup/cpu/cpu.shares
预期输出:
1024
执行以下命令,登录到
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 |