在Kubernetes叢集中,您可能會將延遲敏感型LS(Latency Sensitive)和低優先順序BE(Best Effort)的應用部署在同一節點上。雖然應用會有CPU Request和Limit的限制,但不同優先順序的應用之間可能會存在CPU資源的爭搶,導致服務品質,尤其是高優先順序應用的服務品質下降。建議您開啟容器CPU QoS功能,優先保障LS應用的CPU資源使用。
為了協助您更好地理解本文檔並使用本功能,推薦您參見Kubernetes官方文檔瞭解Pod Qos類、為容器和 Pod 分配記憶體資源等概念,並參見Group Identity功能說明瞭解Group Identity功能原理。
為什麼需要容器CPU QoS
為了充分利用節點資源,在離線混部情境會將高優先順序的LS應用和低優先順序的BE應用部署在同一台機器上。雖然Kubernetes根據應用的CPU Request和Limit限制容器實體資源的使用,但容器間CPU資源的競爭仍然不可避免。例如,BE應用和LS應用共用物理核或邏輯核時,在BE應用負載較高時,會干擾LS應用的運行,導致服務響應延遲變高。
為了提高LS應用可用的CPU資源的穩定性,降低BE應用帶來的幹擾,ack-koordinator基於Alibaba Cloud Linux提供了容器CPU QoS功能。ack-koordinator基於Group Identity提供的Linux調度優先順序支援差異化保障不同優先順序應用的CPU調度,將LS應用標識為高優,BE應用標識為低優,在混合部署情境中有效改善LS應用的服務品質。
啟用容器CPU QoS後,您將獲得以下功能特性。
LS應用的任務能更快地被作業系統調度運行,提高響應速度和效能。
BE應用的任務被喚醒時,不會搶佔LS應用的進程,避免對高優先順序任務的幹擾。
即使在同時多線程SMT(Simultaneous MultiThreading)的情境下,BE應用的任務也不會與LS應用的任務在同一物理核心上並存執行,防止BE任務因爭奪同一物理核心的計算資源而對LS任務的效能產生影響。
前提條件
已建立ACK叢集,且符合以下要求:
叢集版本:1.18及以上。如需升級叢集,請參見手動升級叢集。
作業系統:本功能使用的Group Identity參數依賴Alibaba Cloud Linux。關於核心版本號碼限制,請參見Group Identity功能說明。
說明若您的作業系統類型不是Alibaba Cloud Linux,您可以使用CPU彈性資源限制功能控制BE類型Pod可使用的CPU資源量,請參見啟用CPU資源彈性限制式能力。
已安裝ack-koordinator組件,且組件版本為v0.8.0及以上,請參見ack-koordinator(ack-slo-manager)。
費用說明
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
操作步驟
您可以通過ConfigMap在叢集維度開啟容器CPU QoS功能,為LS、BE類型的Pod配置對應的CPU Group Identity的優先順序。Group Identity可以為每一個CPU cgroup設定身份標識,系統核心在調度包含具有身份標識的任務時,會根據不同的優先順序做相應處理。
配置完成後,您便可以在Pod YAML中通過Labelkoordinator.sh/qosClass
聲明Pod對應的CPU QoS類。對於未指定koordinator.sh/qosClass
的Pod,ack-koordinator將遵循Kubernetes原生的QoS類來配置,其中BestEffort類型的Pod為BE
、其他QoS類的Pod為LS
。
使用以下ConfigMap,建立configmap.yaml檔案,啟用CPU QoS功能。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: # 開啟容器CPU QoS功能。 resource-qos-config: | { "clusterStrategy": { "lsClass": { "cpuQOS": { "enable": true, "groupIdentity": 2 } }, "beClass": { "cpuQOS": { "enable": true, "groupIdentity": -1 } } } }
lsClass
、beClass
分別用於配置QoS等級為LS、BE的Pod,cpuQOS
用於配置容器CPU QoS功能。關鍵參數說明如下。參數
類型
取值範圍
說明
enable
Boolean
true
false
true
:叢集全域開啟容器CPU QoS功能。false
:叢集全域關閉容器CPU QoS功能。
groupIdentity
Int
[-1, 2]
CPU Group Identity的優先順序。
groupIdentity
值越大,表示容器在核心調度的優先順序越高。更多資訊,請參見Group Identity功能說明。預設情況下,LS Pod為
2
,BE為-1
。0
表示關閉。查看命名空間kube-system下是否存在ConfigMap
ack-slo-config
。存在:使用PATCH方式進行更新,避免幹擾ConfigMap中其他配置項。
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
不存在:執行以下命令建立ConfigMap。
kubectl apply -f configmap.yaml
使用以下YAML內容,建立ls-pod-demo.yaml檔案,其中指定Pod的QoS類為LS,並將YAML檔案部署到叢集中。
說明如需在工作負載(例如Deployment)中配置,請在
template.metadata
欄位下配置Pod對應的Annotation。apiVersion: v1 kind: Pod metadata: name: ls-pod-demo labels: koordinator.sh/qosClass: 'LS' # 指定Pod的QoS類為LS。 spec: containers: - command: - httpd - -D - FOREGROUND image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1 imagePullPolicy: Always name: apache resources: limits: cpu: "4" memory: 10Gi requests: cpu: "4" memory: 10Gi restartPolicy: Never schedulerName: default-scheduler
kubectl apply -f ls-pod-demo.yaml
執行以下命令,在單機端的Cgroup分組中查看LS Pod的核心Group Identity生效情況。
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_ns
預期輸出:
# LS Pod的Group Identity優先順序為2,表示高優。 2
使用以下YAML內容,建立be-pod-demo.yaml檔案,其中指定Pod的QoS類為BE,並將YAML檔案部署到叢集中。
apiVersion: v1 kind: Pod metadata: name: be-pod-demo labels: koordinator.sh/qosClass: 'BE' # 指定Pod的QoS類為BE。 spec: containers: - args: - '-c' - '1' - '--vm' - '1' command: - stress image: polinux/stress imagePullPolicy: Always name: stress restartPolicy: Always schedulerName: default-scheduler
kubectl apply -f be-pod-demo.yaml
執行以下命令,在單機端的Cgroup分組中查看BE Pod的核心Group Identity生效情況。
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_ns
預期輸出:
# BE Pod的Group Identity優先順序為-1,表示低優。 -1
預期輸出表明,LS Pod的Group Identity為高優先順序,BE Pod的Group Identity為低優先順序,即LS Pod的CPU服務品質將被優先保障。
FAQ
當前已經通過ack-slo-manager的舊版本協議使用了CPU QoS功能,升級為ack-koordinator後是否繼續支援CPU QoS功能?
舊版本(≤0.8.0)的Pod協議中,通過在Pod的Annotation中填寫alibabacloud.com/qosClass
啟用CPU QoS。
ack-koordinator保持了對以上舊版本協議的相容,您可以將組件無縫升級至ack-koordinator,並逐步將Pod切換為koordinator.sh協議。ack-koordinator將對以上舊版本協議相容至2023年07月30日,我們建議您將原協議資源欄位及時升級到新版本。
ack-koordinator各版本對CPU QoS功能的適配如下。
組件版本 | alibabacloud.com協議 | koordinator.sh協議 |
≥0.5.2且<0.8.0 | 支援 | 不支援 |
≥0.8.0 | 支援 | 支援 |