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