阿里云容器計算服務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 |