【问题标题】:Difference between API versions v2beta1 and v2beta2 in Horizontal Pod Autoscaler?Horizo​​ntal Pod Autoscaler 中 API 版本 v2beta1 和 v2beta2 之间的区别?
【发布时间】:2019-06-24 20:19:48
【问题描述】:

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ 中的 Kubernetes Horizo​​ntal Pod Autoscaler 演练解释说我们可以对自定义指标执行自动缩放。我不明白的是何时使用两个 API 版本:v2beta1 和 v2beta2。如果有人能解释一下,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: kubernetes openshift autoscaling


    【解决方案1】:

    第一个指标 autoscaling/V2beta1 不允许您根据自定义指标扩展您的 pod。这只允许您根据应用程序的 CPUmemory 利用率来扩展应用程序

    第二个指标autoscaling/V2beta2允许用户根据自定义指标进行自动缩放。它允许基于来自 Kubernetes 外部的指标进行自动缩放。此 api 中添加了一个新的外部指标源。

    metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
    

    它将根据指标名称和标签选择器识别要自动缩放的特定指标。这些指标可以来自任何地方,例如 stackdriver 或 prometheus 监控应用程序,并且基于您想要扩展应用程序的 prometheus 的一些查询。

    最好使用V2beta2 api,因为它可以在 CPU 和内存以及自定义指标上进行缩放,而 V2beta1 API 只能根据内部指标进行缩放。

    我在回答中提到的 sn-p 表示如何在V2beta2 API 中指定目标 CPU 利用率

    【讨论】:

    • GKE 教程使用 v2beta1 和自定义指标:cloud.google.com/kubernetes-engine/docs/tutorials/…
    • 你知道如何安装/启用 v2beta2 吗?当我运行kubectl api-versions 时它没有出现在列表中
    • 我在 Prometheus 的自定义指标上使用了缩放,它与 autoscaling/V2beta1 配合使用。
    • 我使用 Prometheus Adapter(github.com/DirectXMan12/k8s-prometheus-adapter) 对来自 Prometheus 的自定义指标进行了扩展,它与 autoscaling/V2beta1 配合使用
    • 外部指标支持与 v2beta2 无关。检查规格以获取详尽的差异。我们可以注意到的一项重大变化与 v2beta2 中的 .spec.behavior 引入有关
    【解决方案2】:

    更新:v2beta1 在 1.19 中已弃用,您应该继续使用 v2beta2

    此外,v2beta2 在 1.18 中添加了新的 api 字段 spec.behavior,它允许您定义放大和缩小 Pod 的速度或速度。


    最初,两个版本在功能上相同,但具有不同的 API。

    autoscaling/v2beta2 在 Kubernetes 版本 1.12 中发布,发行说明指出:

    • 我们发布了 autoscaling/v2beta2,它清理并统一了 API

    “清理和统一 API”指的是 v2beta2 始终使用 MetricIdentifierMetricTarget 对象:

    spec:
      metrics:
        external:
          metric: MetricIdentifier
          target: MetricTarget
        object:
          describedObject: CrossVersionObjectReference
          metric: MetricIdentifier
          target: MetricTarget
        pods:
          metric: MetricIdentifier
          target: MetricTarget
        resource:
          name: string
          target: MetricTarget
        type: string
    

    v2beta1 中,这些字段的规格大相径庭,这使得(在我看来)更难弄清楚如何使用。

    【讨论】:

      【解决方案3】:

      如果您需要使用自定义外部指标来驱动水平 pod 自动扩缩器,并且只有 v2beta1 可供您使用(我认为 GKE 仍然如此),我们会在 GKE 中例行执行此操作。你需要:

      1. 一种堆栈驱动程序监控指标,可能是您自己创建的,
      2. 如果指标不是从 Stackdriver 日志采样中得出的,一种将数据发布到 Stackdriver 监控指标的方法,例如每分钟运行不超过一次的 cronjob(我们使用一个小 Python 脚本和 Google 的 Python 库监控_v3),以及
      3. 一个自定义指标适配器,用于向 HPA 公开 Stackdriver 监控(例如,在 Google 中,gcr.io/google-containers/custom-metrics-stackdriver-adapter:v0.10.0)。有一个关于如何部署这个适配器here 的教程。您需要确保将所需的 RBAC 内容授予运行适配器的服务帐户,如 here 所示。您可能希望也可能不希望授予部署配置 cluster-admin 角色的委托人,如教程中所述;我们使用带 Tiller 的 Helm 2,并小心地授予 Tiller 部署的最低权限。

      以这种方式配置您的 HPA:

      kind: HorizontalPodAutoscaler
      apiVersion: autoscaling/v2beta1
      metadata:
       ...
      spec:
         scaleTargetRef:
            kind: e.g., StatefulSet
            name: name-of-pod-to-scale
            apiVersion: e.g., apps/v1
         minReplicas: 1
         maxReplicas: ...
         metrics:
           type: External
           external: 
             metricName: "custom.googleapis.com|your_metric_name"
             metricSelector:
                matchLabels:
                   resource.type: "generic_task"
                   resource.labels.job: ...
                   resource.labels.namespace: ...
                   resource.labels.project_id: ...
                   resourcel.labels.task_id: ...
             targetValue: e.g., 0.7 (i.e., if you publish a metric that measures the ratio between demand and current capacity)
      

      如果您向 kubectl 询问您的 HPA 对象,您将看不到 autoscaling/v2beta1 设置,但这很好用:

      kubectl get --raw /apis/autoscaling/v2beta1/namespaces/your-namespace/horizontalpodautoscalers/your-autoscaler | jq
      

      到目前为止,我们只在 GKE 上进行了此操作。它显然是特定于 Stackdriver 的。如果 Stackdriver 可以部署在其他公共托管的 k8s 平台上,它实际上可能是可移植的。或者,您最终可能会以不同的方式为每个平台发布自定义指标,在您的 cronjob 中使用不同的指标发布库和不同的自定义指标适配器。例如,我们知道 Azure 存在一个。

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 2018-10-09
        • 2018-10-09
        • 1970-01-01
        相关资源
        最近更新 更多