當您需要工作負載快速啟動而無需考慮節點資源問題時,可以考慮使用ack-autoscaling-placeholder組件。ack-autoscaling-placeholder為集群的自動擴展提供了緩沖區,使用優先級非常低(負數)的占位容器來超額配置,以保留其他Pod可以使用的資源。如果集群沒有可用的資源,真正的工作負載也會將占位容器所占用的資源搶占,實現快速啟動,然后結合使用Cluster-Autoscaler,迫使集群進行節點維度的擴展。本文介紹如何使用ack-autoscaling-placeholder實現容器秒級伸縮。
前提條件
您已為ACK集群開通自動伸縮。關于開通自動伸縮的操作步驟,請參見節點自動伸縮。
操作步驟
登錄容器服務管理控制臺,在左側導航欄選擇 。
在應用目錄頁簽,搜索ack-autoscaling-placeholder,然后單擊ack-autoscaling-placeholder。
在ack-autoscaling-placeholder頁面,單擊一鍵部署。
在創建面板,選擇集群和命名空間,然后單擊下一步。選擇Chart版本,編輯參數,然后單擊確定。
創建成功后,在
頁面,可查看到該應用狀態為已部署。在集群管理頁左側導航欄,選擇 。
在Helm頁面,單擊ack-autoscaling-placeholder操作列的更新。然后在更新發布面板中,更新YAML,然后單擊確定。
nameOverride: "" fullnameOverride: "" ## priorityClassDefault: enabled: true name: default-priority-class value: -1 ## deployments: - name: ack-place-holder replicaCount: 1 containers: - name: placeholder image: registry-vpc.cn-shenzhen.aliyuncs.com/acs/pause:3.1 pullPolicy: IfNotPresent resources: requests: cpu: 4 #資源占位4C8G。 memory: 8 imagePullSecrets: {} annotations: {} nodeSelector: #節點選擇。 demo: "yes" tolerations: [] affinity: {} labels: {}
部署工作負載的PriorityClass。
本文示例定義一個優先級較高的PriorityClass。
kubectl apply -f priorityClass.yaml
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 #配置優先級。 globalDefault: false description: "This priority class should be used for XYZ service pods only."
部署實際的工作負載。
kubectl apply -f workload.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: placeholder-test labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: #節點選擇。 demo: "yes" priorityClassName: high-priority #這里寫入第8步配置的PriorityClass名稱。 containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 resources: requests: cpu: 3 #實際負載的資源需求。 memory: 5
從下圖可以看到,實際工作負載由于Pod配置了高優先級的PriorityClass。當節點資源不足時,會將占位容器placeHolder進行驅逐,此時占位容器placeHolder處于Pending狀態。由于集群開通了自動伸縮,此狀態會觸發ACK集群進行擴容。實現了工作負載的秒級彈出。
相關文檔
多可用區均衡是數據類型業務在高可用場景下常用的部署方式。當業務壓力增大時,有多可用區均衡調度策略的應用希望可以自動擴容出多個可用區的實例來滿足集群的調度水位。詳細信息,請參見多可用區實現同時快速彈性擴容。