github.com/gocrane/crane@v0.11.0/docs/tutorials/replicas-recommendation.zh.md (about) 1 # 副本数推荐 2 3 Kubernetes 用户在创建应用资源时常常是基于经验值来设置副本数或者 EHPA 配置。通过副本数推荐的算法分析应用的真实用量推荐更合适的副本配置,您可以参考并采纳它提升集群的资源利用率。 4 5 ## 产品功能 6 7 1. 算法:计算副本数的算法参考了 HPA 的计算公式,并且支持自定义算法的关键配置 8 2. HPA 推荐:副本数推荐会扫描出适合配置水平弹性(EHPA)的应用,并给出 EHPA 的配置, [EHPA](using-effective-hpa-to-scaling-with-effectiveness.md) 是 Crane 提供了智能水平弹性产品 9 3. 支持批量分析:通过 `Analytics` 的 ResourceSelector,用户可以批量分析多个工作负载 10 11 ## 创建弹性分析 12 13 创建一个**弹性分析** `Analytics`,这里我们通过实例 deployment: `nginx` 作为一个例子 14 15 === "Main" 16 17 ```bash 18 kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/analytics/nginx-deployment.yaml 19 kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/analytics/analytics-replicas.yaml 20 kubectl get analytics 21 ``` 22 23 === "Mirror" 24 25 ```bash 26 kubectl apply -f https://gitee.com/finops/crane/raw/main/examples/analytics/nginx-deployment.yaml 27 kubectl apply -f https://gitee.com/finops/crane/raw/main/examples/analytics/analytics-replicas.yaml 28 kubectl get analytics 29 ``` 30 31 32 ```yaml title="analytics-replicas.yaml" 33 apiVersion: analysis.crane.io/v1alpha1 34 kind: Analytics 35 metadata: 36 name: nginx-replicas 37 spec: 38 type: Replicas # This can only be "Resource" or "Replicas". 39 completionStrategy: 40 completionStrategyType: Periodical # This can only be "Once" or "Periodical". 41 periodSeconds: 600 # analytics selected resources every 10 minutes 42 resourceSelectors: # defines all the resources to be select with 43 - kind: Deployment 44 apiVersion: apps/v1 45 name: nginx-deployment 46 config: # defines all the configuration for this analytics 47 replicas.workload-min-replicas: "1" 48 replicas.fluctuation-threshold: "0" 49 replicas.min-cpu-usage-threshold: "0" 50 ``` 51 52 结果如下: 53 54 ```bash 55 NAME AGE 56 nginx-replicas 16m 57 ``` 58 59 查看 Analytics 详情: 60 61 ```bash 62 kubectl get analytics nginx-replicas -o yaml 63 ``` 64 65 结果如下: 66 67 ```yaml 68 apiVersion: analysis.crane.io/v1alpha1 69 kind: Analytics 70 metadata: 71 name: nginx-replicas 72 namespace: default 73 spec: 74 completionStrategy: 75 completionStrategyType: Periodical 76 periodSeconds: 600 77 config: 78 replicas.fluctuation-threshold: "0" 79 replicas.min-cpu-usage-threshold: "0" 80 replicas.workload-min-replicas: "1" 81 resourceSelectors: 82 - apiVersion: apps/v1 83 kind: Deployment 84 labelSelector: {} 85 name: nginx-deployment 86 type: Replicas 87 status: 88 conditions: 89 - lastTransitionTime: "2022-06-17T06:56:07Z" 90 message: Analytics is ready 91 reason: AnalyticsReady 92 status: "True" 93 type: Ready 94 lastUpdateTime: "2022-06-17T06:56:06Z" 95 recommendations: 96 - lastStartTime: "2022-06-17T06:56:06Z" 97 message: Success 98 name: nginx-replicas-replicas-wq6wm 99 namespace: default 100 targetRef: 101 apiVersion: apps/v1 102 kind: Deployment 103 name: nginx-deployment 104 namespace: default 105 uid: 59f3eb3c-f786-4b15-b37e-774e5784c2db 106 ``` 107 108 ## 查看分析结果 109 110 查看 **Recommendation** 结果: 111 112 ```bash 113 kubectl get recommend -l analysis.crane.io/analytics-name=nginx-replicas -o yaml 114 ``` 115 116 分析结果如下: 117 118 ```yaml 119 apiVersion: v1 120 items: 121 - apiVersion: analysis.crane.io/v1alpha1 122 kind: Recommendation 123 metadata: 124 creationTimestamp: "2022-06-17T06:56:06Z" 125 generateName: nginx-replicas-replicas- 126 generation: 2 127 labels: 128 analysis.crane.io/analytics-name: nginx-replicas 129 analysis.crane.io/analytics-type: Replicas 130 analysis.crane.io/analytics-uid: 795f245b-1e1f-4f7b-a02b-885d7a495e5b 131 app: nginx 132 name: nginx-replicas-replicas-wq6wm 133 namespace: default 134 ownerReferences: 135 - apiVersion: analysis.crane.io/v1alpha1 136 blockOwnerDeletion: false 137 controller: false 138 kind: Analytics 139 name: nginx-replicas 140 uid: 795f245b-1e1f-4f7b-a02b-885d7a495e5b 141 resourceVersion: "2182455668" 142 selfLink: /apis/analysis.crane.io/v1alpha1/namespaces/default/recommendations/nginx-replicas-replicas-wq6wm 143 uid: 59f3eb3c-f786-4b15-b37e-774e5784c2db 144 spec: 145 adoptionType: StatusAndAnnotation 146 completionStrategy: 147 completionStrategyType: Once 148 targetRef: 149 apiVersion: apps/v1 150 kind: Deployment 151 name: nginx-deployment 152 namespace: default 153 type: Replicas 154 status: 155 conditions: 156 - lastTransitionTime: "2022-06-17T06:56:07Z" 157 message: Recommendation is ready 158 reason: RecommendationReady 159 status: "True" 160 type: Ready 161 lastUpdateTime: "2022-06-17T06:56:07Z" 162 recommendedValue: | 163 effectiveHPA: 164 maxReplicas: 3 165 metrics: 166 - resource: 167 name: cpu 168 target: 169 averageUtilization: 75 170 type: Utilization 171 type: Resource 172 minReplicas: 3 173 replicasRecommendation: 174 replicas: 3 175 kind: List 176 metadata: 177 resourceVersion: "" 178 selfLink: "" 179 ``` 180 181 ## 批量推荐 182 183 我们通过一个例子来演示如何使用 `Analytics` 推荐集群中所有的 Deployment 和 StatefulSet: 184 185 ```yaml 186 apiVersion: analysis.crane.io/v1alpha1 187 kind: Analytics 188 metadata: 189 name: workload-replicas 190 namespace: crane-system # The Analytics in Crane-system will select all resource across all namespaces. 191 spec: 192 type: Replicas # This can only be "Resource" or "Replicas". 193 completionStrategy: 194 completionStrategyType: Periodical # This can only be "Once" or "Periodical". 195 periodSeconds: 86400 # analytics selected resources every 1 day 196 resourceSelectors: # defines all the resources to be select with 197 - kind: Deployment 198 apiVersion: apps/v1 199 - kind: StatefulSet 200 apiVersion: apps/v1 201 ``` 202 203 1. 当 namespace 等于 `crane-system` 时,`Analytics` 选择的资源是集群中所有的 namespace,当 namespace 不等于 `crane-system` 时,`Analytics` 选择 `Analytics` namespace 下的资源 204 2. resourceSelectors 通过数组配置需要分析的资源,kind 和 apiVersion 是必填字段,name 选填 205 3. resourceSelectors 支持配置任意支持 [Scale Subresource](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#scale-subresource) 的资源 206 207 ## 弹性推荐计算模型 208 209 ### 筛选阶段 210 211 1. 低副本数的工作负载: 过低的副本数可能弹性需求不高,关联配置: `ehpa.deployment-min-replicas` | `ehpa.statefulset-min-replicas` | `ehpa.workload-min-replicas` 212 2. 存在一定比例非 Running Pod 的工作负载: 如果工作负载的 Pod 大多不能正常运行,可能不适合弹性,关联配置: `ehpa.pod-min-ready-seconds` | `ehpa.pod-available-ratio` 213 3. 低 CPU 使用量的工作负载: 过低使用量的工作负载意味着没有业务压力,此时通过使用率推荐弹性不准,关联配置: `ehpa.min-cpu-usage-threshold` 214 4. CPU 使用量的波动率过低: 使用量的最大值和最小值的倍数定义为波动率,波动率过低的工作负载通过弹性降本的收益不大,关联配置: `ehpa.fluctuation-threshold` 215 216 ### 推荐 217 218 推荐阶段通过以下模型推荐一个 EffectiveHPA 的 Spec。每个字段的推荐逻辑如下: 219 220 **推荐 TargetUtilization** 221 222 原理: 使用 Pod P99 资源利用率推荐弹性的目标。因为如果应用可以在 P99 时间内接受这个利用率,可以推断出可作为弹性的目标。 223 224 1. 通过 Percentile 算法得到 Pod 过去七天 的 P99 使用量: $pod\_cpu\_usage\_p99$ 225 2. 对应的利用率: 226 227 $target\_pod\_CPU\_utilization = \frac{pod\_cpu\_usage\_p99}{pod\_cpu\_request}$ 228 229 3. 为了防止利用率过大或过小,target_pod_cpu_utilization 需要小于 ehpa.min-cpu-target-utilization 和大于 ehpa.max-cpu-target-utilization 230 231 $ehpa.max\mbox{-}cpu\mbox{-}target\mbox{-}utilization < target\_pod\_cpu\_utilization < ehpa.min\mbox{-}cpu\mbox{-}target\mbox{-}utilization$ 232 233 **推荐 minReplicas** 234 235 原理: 使用 workload 过去七天内每小时负载最低的利用率推荐 minReplicas。 236 237 1. 计算过去7天 workload 每小时使用量中位数的最低值: $workload\_cpu\_usage\_medium\_min$ 238 2. 对应的最低利用率对应的副本数: 239 240 $minReplicas = \frac{\mathrm{workload\_cpu\_usage\_medium\_min} }{pod\_cpu\_request \times ehpa.max-cpu-target-utilization}$ 241 242 3. 为了防止 minReplicas 过小,minReplicas 需要大于等于 ehpa.default-min-replicas 243 244 $minReplicas \geq ehpa.default\mbox{-}min\mbox{-}replicas$ 245 246 **推荐 maxReplicas** 247 248 原理: 使用 workload 过去和未来七天的负载推荐最大副本数。 249 250 1. 计算过去七天和未来七天 workload cpu 使用量的 P95: $workload\_cpu\_usage\_p95$ 251 2. 对应的副本数: 252 253 $max\_replicas\_origin = \frac{\mathrm{workload\_cpu\_usage\_p95} }{pod\_cpu\_request \times target\_cpu\_utilization}$ 254 255 3. 为了应对流量洪峰,放大一定倍数: 256 257 $max\_replicas = max\_replicas\_origin \times ehpa.max\mbox{-}replicas\mbox{-}factor$ 258 259 **推荐CPU以外 MetricSpec** 260 261 1. 如果 workload 配置了 HPA,继承相应除 CpuUtilization 以外的其他 MetricSpec 262 263 **推荐 Behavior** 264 265 1. 如果 workload 配置了 HPA,继承相应的 Behavior 配置 266 267 **预测** 268 269 1. 尝试预测工作负载未来七天的 CPU 使用量,算法是 DSP 270 2. 如果预测成功则添加预测配置 271 3. 如果不可预测则不添加预测配置,退化成不具有预测功能的 EffectiveHPA 272 273 ## 弹性分析计算配置 274 275 | 配置项 | 默认值 | 描述| 276 | ------------- | ------------- | ----------- | 277 | ehpa.deployment-min-replicas | 1 | 小于该值的工作负载不做弹性推荐 | 278 | ehpa.statefulset-min-replicas| 1 | 小于该值的工作负载不做弹性推荐 | 279 | ehpa.workload-min-replicas| 1 | 小于该值的工作负载不做弹性推荐 | 280 | ehpa.pod-min-ready-seconds| 30 | 定义了 Pod 是否 Ready 的秒数 | 281 | ehpa.pod-available-ratio| 0.5 | Ready Pod 比例小于该值的工作负载不做弹性推荐 | 282 | ehpa.default-min-replicas| 2 | 最小 minReplicas | 283 | ehpa.max-replicas-factor| 3 | 计算 maxReplicas 的倍数 | 284 | ehpa.min-cpu-usage-threshold| 10| 小于该值的工作负载不做弹性推荐 | 285 | ehpa.fluctuation-threshold| 1.5 | 小于该值的工作负载不做弹性推荐 | 286 | ehpa.min-cpu-target-utilization| 30 | | 287 | ehpa.max-cpu-target-utilization| 75 | | 288 | ehpa.reference-hpa| true | 继承现有的 HPA 配置 | 289 290