為瞭解決實際運行中叢集資源無法充分利用或浪費的問題,可以使用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
預期輸出:
當前的調度策略如下表所示。關於
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被分散到三個不同節點上,實現了副本之間在不同節點的均衡分布。