作者:京東科技 徐憲章
1 什么是超容量擴容
超容量擴容功能,是指預先調度一定數量的作業節點,當業務高峰期或者集群整體負載較高時,可以使應用不必等待集群作業節點擴容,從而迅速完成應用橫向擴容,通常情況下HPA、ClusterAutosacler和超容量擴容同時使用以滿足負載敏感度高的業務場景,
超容量擴容功能是通過K8S應用優先級設定和ClusterAutosaler共同作用實作的,通過調整低優先級空載應用的數量,使集群已調度資源保持在較高的狀態,當其他高優先級應用因為HPA或者手動調整應用分片數量時,可以通過驅逐空載的方式騰空調度資源卻保高優先級應用可以在第一時間調度并創建,當空載應用從被驅逐轉變為等到狀態時,ClusterAutosaler此時對集群機型擴容,確保下次高優先級應用調度時,有足夠的空載應用可以被驅逐,
超容量擴容功能的核心為OverprovisionAutoscaler(超容量擴容)和ClusterAutosaler(集群自動擴容),兩者都需要通過不斷調整引數配置去適配多重業務需求需求,
超容量擴容功能在一定程度上降低了資源使用飽和度,通過增加成本提高了集群和應用的穩定性,實際業務場景中需要根據需求進行取舍并合理配置,
2 什么情況下需要使用超容量擴容
當集群值開啟Hpa和Autoscaler時,在發生節點擴容的情況下,應用調度時間通常為4-12分鐘,主要取決于創建作業節點資源以及作業節點從加入集群到Ready的總耗時,以下為最佳和最差效率分析
最佳案例場景-4分鐘
? 30秒 - 目標指標值更新:30-60秒
? 30秒 - HPA檢查指標值:30秒 - >30秒 - HPA檢查指標值:30秒 - >
? <2秒 - Pods創建之后進入pending狀態<2秒 -Pods創建之后進入pending狀態
? <2秒 - CA看到pending狀態的pods,之后呼叫來創建node 1秒<2秒 -CA看到pending狀態的pods,之后呼叫來創建node 1秒
? 3分鐘 - cloud provider創建作業節點,之后加入k8s之后等待node變成ready
最糟糕的情況 - 12分鐘
? 60 秒 —目標指標值更新
? 30 秒 — HPA檢查指標值
? < 2 秒 — Pods創建之后進入pending狀態
? < 2 秒 —CA看到pending狀態的pods,之后呼叫來創建node 1秒
? 10 分鐘 — cloud provider創建作業節點,之后加入k8s之后等待node變成ready
兩種場景下,創建作業節點耗時占比超過75%,如果可以降低或者完全不考慮該時間,將大大提高應用擴容速度,配合超容量擴容功能可以大大增強集群和業務穩定性,超容量擴容主要用于對應用負載敏感度較高的業務場景
-
大促備戰
-
流計算/實時計算
-
Devops系統
-
其他調度頻繁的業務場景
3 如何開啟超容量擴容
超容量擴容功能以ClusterAutoscaler為基礎,配合OverprovisionAutoscaler實作,以京東公有云Kubernetes容器服務為例
3.1 開啟ClusterAutoscaler
https://cns-console.jdcloud.com/host/nodeGroups/list
? 進入 “kubernetes容器服務”->“作業節點組”
? 選擇需要對應節點組,點擊開啟自動伸縮
? 設定節點數量區間,并點擊確定

3.2 部署OverprovisionAutoscaler
1 部署控制器及配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: overprovisioning-autoscaler
namespace: default
labels:
app: overprovisioning-autoscaler
owner: cluster-autoscaler-overprovisioning
spec:
selector:
matchLabels:
app: overprovisioning-autoscaler
owner: cluster-autoscaler-overprovisioning
replicas: 1
template:
metadata:
labels:
app: overprovisioning-autoscaler
owner: cluster-autoscaler-overprovisioning
spec:
serviceAccountName: cluster-proportional-autoscaler
containers:
- image: jdcloud-cn-north-1.jcr.service.jdcloud.com/k8s/cluster-proportional-autoscaler:v1.16.3
name: proportional-autoscaler
command:
- /autoscaler
- --namespace=default
## 注意這里需要根據需要指定上述的configmap的名稱
## /overprovisioning-autoscaler-ladder/overprovisioning-autoscaler-linear
- --configmap=overprovisioning-autoscaler-{provision-mode}
## 預熱集群應用(型別)/ 名稱,基準應用和空值應用需要在同一個命名空間下
- --target=deployment/overprovisioning
- --logtostderr=true
- --v=2
imagePullPolicy: IfNotPresent
volumeMounts:
- name: host-time
mountPath: /etc/localtime
volumes:
- name: host-time
hostPath:
path: /etc/localtime
---
kind: ServiceAccount
apiVersion: v1
metadata:
name: cluster-proportional-autoscaler
namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cluster-proportional-autoscaler
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["replicationcontrollers/scale"]
verbs: ["get", "update"]
- apiGroups: ["extensions","apps"]
resources: ["deployments/scale", "replicasets/scale","deployments","replicasets"]
verbs: ["get", "update"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cluster-proportional-autoscaler
subjects:
- kind: ServiceAccount
name: cluster-proportional-autoscaler
namespace: default
roleRef:
kind: ClusterRole
name: cluster-proportional-autoscaler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: overprovisioning
value: -1
globalDefault: false
description: "Priority class used by overprovisioning."
2 部署空載應用
apiVersion: apps/v1
kind: Deployment
metadata:
name: overprovisioning
namespace: default
labels:
app: overprovisioning
owner: cluster-autoscaler-overprovisioning
spec:
replicas: 1
selector:
matchLabels:
app: overprovisioning
owner: cluster-autoscaler-overprovisioning
template:
metadata:
annotations:
autoscaler.jke.jdcloud.com/overprovisioning: "reserve-pod"
labels:
app: overprovisioning
owner: cluster-autoscaler-overprovisioning
spec:
priorityClassName: overprovisioning
containers:
- name: reserve-resources
image: jdcloud-cn-east-2.jcr.service.jdcloud.com/k8s/pause-amd64:3.1
resources:
requests:
## 根據預熱預期設定配置的分片數量及單分片所需資源
cpu: 7
imagePullPolicy: IfNotPresent
3.3 驗證超容量擴容功能是否正常
1 驗證Autoscaler
? 查看autoscaler控制器是否Running
? 不斷創建測驗應用,應用需求資源略微小于節點組單節點可調度資源
? 觀察集群節點狀態,當資源不足導致pod 等待中狀態時,autocalser是否會按照預設(擴容等待、擴容冷卻、最大節點數量等)進行擴容
? 開啟集群自動縮容,洗掉測驗應用,觀察集群節點資源Request到達閾值后是否發生縮容,
2 驗證OverprovisionAutoscaler
? 查看OverprovisionAutoscaler控制器是否Running
? 不斷創建測驗應用,當發生autoscaler后,空載應用數量是否會根據配置發生變化
? 當業務應用pendding后,空載應用是否會發生驅逐,并調度業務應用
4 設定OverprovisionAutoscaler及ClusterAutoscaler引數
4.1 配置ClusterAutoscaler
1 ca引數說明
| 引數名稱 | 默認值 | 引數說明 |
|---|---|---|
| scan_interval | 20s | How often cluster is reevaluated for scale up or down |
| max_nodes_total | 0 | Maximum number of nodes in all node groups |
| estimator | binpacking | Type of resource estimator to be used in scale up. |
| expander | least-waste | Type of node group expander to be used in scale up |
| max_empty_bulk_delete | 15 | Maximum number of empty nodes that can be deleted at the same time |
| max_graceful_termination_sec | 600 | Maximum number of seconds CA waits for pod termination when trying to scale down a node |
| max_total_unready_percentage | 45 | Maximum percentage of unready nodes in the cluster. After this is exceeded, CA halts operations |
| ok_total_unready_count | 100 | Number of allowed unready nodes, irrespective of max-total-unready-percentage |
| max_node_provision_time | 900s | Maximum time CA waits for node to be provisioned |
| scale_down_enabled | true | Should CA scale down the cluster |
| scale_down_delay_after_add | 600s | How long after scale up that scale down evaluation resumes |
| scale_down_delay_after_delete | 10s | How long after node deletion that scale down evaluation resumes, defaults to scanInterval |
| scale_down_delay_after_failure | 180s | How long after scale down failure that scale down evaluation resumes |
| scale_down_unneeded_time | 600s | How long a node should be unneeded before it is eligible for scale down |
| scale_down_unready_time | 1200s | How long an unready node should be unneeded before it is eligible for scale down |
| scale_down_utilization_threshold | 0.5 | Node utilization level, defined as sum of requested resources divided by capacity, below which a node can be considered for scale down |
| balance_similar_node_groups | false | Detect similar node groups and balance the number of nodes between them |
| node_autoprovisioning_enabled | false | Should CA autoprovision node groups when needed |
| max_autoprovisioned_node_group_count | 15 | The maximum number of autoprovisioned groups in the cluster |
| skip_nodes_with_system_pods | true | If true cluster autoscaler will never delete nodes with pods from kube-system (except for DaemonSet or mirror pods) |
| skip_nodes_with_local_storage | true | If true cluster autoscaler will never delete nodes with pods with local storage, e.g. EmptyDir or HostPath', NOW(), NOW(), 1); |
2 推薦配置
# 其他保持默認
scan_interval=10s
max_node_provision_time=180s
scale_down_delay_after_add=180s
scale_down_delay_after_delete=180s
scale_down_unneeded_time=300s
scale_down_utilization_threshold=0.4
4.2 配置OverprovisionAutoscaler
OverprovisionAutoscaler的配置有線性配置和階梯配置兩種方式,兩種配置方式只能選擇一種.
1 線性配置(ladder)
線性配置,通過配置總體CPU核數以及節點數量和空載應用數量的比例實作線性資源預留,空載應用數量總是和CPU總量以及節點數量成正比,精度會根據空載應用CPU資源request變化,request值越小,精度月高,當配置發生沖突時,取符合線性關系的空載應用數量最大值.
節點數量滿足配置中min和max的區間
preventSinglePointFailure,當為true時,Running狀態的空載應用分片數滿足線性關系;當為false時,Failer/Running狀態的空載應用分片數滿足線性關系
includeUnschedulableNodes,是否考慮不可調度節點
kind: ConfigMap
apiVersion: v1
metadata:
name: overprovisioning-autoscaler-linear
namespace: default
data:
linear: |-
{
"coresPerReplica": 2,
"nodesPerReplica": 1,
"min": 1,
"max": 100,
"includeUnschedulableNodes": false,
"preventSinglePointFailure": true
}
2 階梯配置(linear)
階梯配置,通過配置總體CPU核數或者節點數量和空載應用數量的矩陣實作階梯狀資源預留,空載應用數量符合CPU總量以及節點數量的分布狀態,當配置發生沖突時,取符合區間分布的空載應用數量最大值
kind: ConfigMap
apiVersion: v1
metadata:
name: overprovisioning-autoscaler-ladder
namespace: default
data:
ladder: |-
{
"coresToReplicas":
[
[ 1,1 ],
[ 50,3 ],
[ 200,5 ],
[ 500,7 ]
],
"nodesToReplicas":
[
[ 1,1 ],
[ 3,4 ],
[ 10,5 ],
[ 50,20 ],
[ 100,120 ],
[ 150,120 ]
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/550448.html
標籤:其他
