為了解決實際運行中集群資源無法充分利用或浪費的問題,可以使用ack-descheduler組件對集群的Pod進行調度優化,使部分不合理的Pod能夠重新調度到合適的節點上。本文介紹如何使用ack-descheduler組件優化Pod調度。
ack-descheduler已停止維護,建議您遷移至當前維護的組件模塊Koordinator Descheduler。更多信息,請參見【組件公告】ack-descheduler組件遷移公告。
前提條件
已創建ACK集群(版本不低于1.14)。具體操作,請參見創建ACK托管集群。
已通過kubectl工具連接Kubernetes集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
Helm組件版本為v3.0及以上。如需升級,請參見將Helm V2升級遷移至Helm V3。
安裝ack-descheduler組件
登錄容器服務管理控制臺。
在控制臺左側導航欄,選擇 。
在應用市場頁面單擊應用目錄頁簽,選中ack-descheduler。
在ack-descheduler頁面,單擊一鍵部署。
在創建面板中,選擇集群和命名空間,然后單擊下一步。
在參數配置頁面,設置相應參數,然后單擊確定。
安裝完成后,默認會在
kube-system
的命名空間下部署執行周期為兩分鐘的CronJob。創建成功后,會自動跳轉到目標集群的ack-descheduler-default頁面,檢查安裝結果。若下圖中所有資源創建成功,則說明組件安裝成功。
通過ack-descheduler優化Pod調度
執行以下命令查看配置項(ConfigMap)文件,確認當前的調度策略(DeschedulerPolicy)。
kubectl describe cm ack-descheduler-default -n kube-system
預期輸出:
Name: descheduler Namespace: kube-system Labels: app.kubernetes.io/instance=descheduler app.kubernetes.io/managed-by=Helm app.kuberne tes.io/name=descheduler app.kubernetes.io/version=0.20.0 helm.sh/chart=descheduler-0.20.0 Annotations: meta.helm.sh/release-name: descheduler meta.helm.sh/release-namespace: kube-system Data ==== policy.yaml: ---- apiVersion: "descheduler/v1alpha1" kind: "DeschedulerPolicy" strategies: "RemoveDuplicates": enabled: true "RemovePodsViolatingInterPodAntiAffinity": enabled: true "LowNodeUtilization": enabled: true params: nodeResourceUtilizationThresholds: thresholds: "cpu" : 20 "memory": 20 "pods": 20 targetThresholds: "cpu" : 50 "memory": 50 "pods": 50 "RemovePodsHavingTooManyRestarts": enabled: true params: podsHavingTooManyRestarts: podRestartThreshold: 100 includingInitContainers: true Events: <none>
當前的調度策略如下表所示。關于
strategies
中策略的更多信息,請參見Descheduler。策略
描述
RemoveDuplicates
刪除重復的Pod,確保只有一個Pod與同一節點上運行的ReplicaSet、Replication Controller、StatefulSet或者Job關聯。
RemovePodsViolatingInterPodAntiAffinity
此策略可確保從節點中刪除違反Pod間反親和性的Pod。
LowNodeUtilization
此策略會找到未充分利用的節點,并盡可能從其他節點上驅逐Pod,以便ack-descheduler重新將這些被驅逐的Pod調度到未充分利用的節點上。該策略的參數可以通過
nodeResourceUtilizationThresholds
字段進行配置。RemovePodsHavingTooManyRestarts
此策略可確保從節點中刪除重啟次數過多的Pod。
查看調度策略修改前的調度效果。
部署測試Deployment。
nginx.yaml的命令示例如下所示。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 #替換為實際的容器鏡像,格式為:<image_name:tags>。 ports: - containerPort: 80
執行以下命令,部署Deployment nginx.yaml。
kubectl apply -f nginx.yaml
預期輸出:
deployment.apps/nginx-deployment-basic created
等待兩分鐘后,執行以下命令,查看Pod分布節點。
kubectl get pod -o wide | grep nginx
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-basic-**1 1/1 Running 0 36s 172.25.XXX.XX1 cn-hangzhou.172.16.XXX.XX2 <none> <none> nginx-deployment-basic-**2 1/1 Running 0 11s 172.25.XXX.XX2 cn-hangzhou.172.16.XXX.XX3 <none> <none> nginx-deployment-basic-**3 1/1 Running 0 36s 172.25.XXX.XX3 cn-hangzhou.172.16.XXX.XX3 <none> <none>
從以上預期輸出可以得出,
nginx-deployment-basic-**2
及nginx-deployment-basic-**3
都被調度到cn-hangzhou.172.16.XXX.XX3
節點。說明默認ConfigMap配置下的調度結果取決于實際的集群環境,此處的結果為多種情況之一,僅作示例。
修改調度策略。
為了防止多個調度策略影響調度效果,修改步驟1中的ConfigMap,只保留RemoveDuplicates策略。
說明RemoveDuplicates策略是指盡可能保障有副本控制器的Pod,可以水平分布到不同的節點上。
修改后的ConfigMap文件命名為newPolicy.yaml,內容示例如下所示。
apiVersion: v1 kind: ConfigMap metadata: name: descheduler namespace: kube-system labels: app.kubernetes.io/instance: descheduler app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: descheduler app.kubernetes.io/version: 0.20.0 helm.sh/chart: descheduler-0.20.0 annotations: meta.helm.sh/release-name: descheduler meta.helm.sh/release-namespace: kube-system data: policy.yaml: |- apiVersion: "descheduler/v1alpha1" kind: "DeschedulerPolicy" strategies: "RemoveDuplicates": #僅保留removeDuplicates策略。 enabled: true
查看調度策略修改后的調度效果。
執行以下命令,部署新的調度策略。
kubectl apply -f newPolicy.yaml
預期輸出:
configmap/descheduler created
等待兩分鐘后,執行以下命令,查看Pod分布節點。
kubectl get pod -o wide | grep nginx
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-basic-**1 1/1 Running 0 8m26s 172.25.XXX.XX1 cn-hangzhou.172.16.XXX.XX2 <none> <none> nginx-deployment-basic-**2 1/1 Running 0 8m1s 172.25.XXX.XX2 cn-hangzhou.172.16.XXX.XX1 <none> <none> nginx-deployment-basic-**3 1/1 Running 0 8m26s 172.25.XXX.XX3 cn-hangzhou.172.16.XXX.XX3 <none> <none>
從以上預期輸出可以得出,
nginx-deployment-basic-**2
被ack-descheduler重新調度到cn-hangzhou.172.16.XXX.XX1
節點,三個Pod被分散到三個不同節點上,實現了副本之間在不同節點的均衡分布。