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