使用Prometheus Adapter自动扩展Pod

首先

通过自定义指标进行Pod的水平扩展,介绍了自定义指标的种类、设置方法以及用于提供自定义指标的API服务器。本次将介绍其中之一——Prometheus适配器的概述以及使用它进行Pod的自动伸缩。

Prometheus适配器是什么?

Prometheus适配器1是用于将Prometheus的任何指标用作自定义外部指标的API服务器。目前它由DirectXMan维护的个人存储库开发,但正在转移至kubernetes-sigs,将成为Kubernetes官方存储库之一。

image.png

上面的图表是Prometheus Adapter的基本结构。Prometheus Adapter作为连接Kubernetes和Prometheus之间的适配器,起到了重要作用。它根据在ConfigMap中设置的自定义指标规则,从Prometheus获取实际指标,并将其格式化和公开,以符合指标API的格式要求。

安装方法

Prometheus Adapter提供了用于安装的Helm Chart。您可以通过Helm的Values文件来修改Prometheus服务器的地址以及接下来要介绍的度量规则等各种配置。请根据各个环境进行修改。

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install --name my-release prometheus-community/prometheus-adapter

如果正常启动,Custom Metrics API 的响应将如下返回。(根据度量规则设置,resources 数组的内容可能会有所不同。)

$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1
{"kind":"APIResourceList","apiVersion":"v1","groupVersion":"custom.metrics.k8s.io/v1beta1","resources":[]}

自定义指标规则设定

以下是有关Prometheus适配器处理内容和顺序的排序列表。首先,确认Prometheus是否存在相关指标,如果存在,则将其与实际的Kubernetes资源关联起来。然后,将其作为指标API进行公开。

    1. 发现:确认有效指标

 

    1. 关联:指标与Kubernetes资源的关联

 

    1. 命名:用于公开自定义指标API的命名

 

    查询:执行Prometheus查询以获取指标

将自定义指标的设置保存在ConfigMap中,保存为config.yaml文件。config.yaml文件的格式根据前面介绍的Prometheus Adapter的工作方式,大致分为四个部分。此外,可以设置多个规则。

rules:
  # Discovery: Discovery対象のSeriesを指定する (関数は使えない)
- seriesQuery: 'http_request_duration_seconds_bucket{deploy_namespace!="",deploy_name!=""}'
  # Association: メトリクスをマッピングするリソース設定、APIのパスになる
  resources:
    overrides:
      deploy_name: {resource: "deployment", group: "apps"}
      deploy_namespace: {resource: "namespace"}
  # Naming: メトリクス名として公開する名前
  name:
    as: 'http_request_per_seconds'
  # Quering: 公開するメトリクスをPrometheusから取得するためのクエリ
  metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'

给予读取权限

由于Prometheus Adapter没有被授予除Pod以外的资源的访问权限,如果要设置其他资源的自定义指标,则需要进行权限授予。读取资源的权限是由名为prometheus-adapter-resource-reader的ClusterRole定义的,因此请在此处添加所需的设置。例如,如果想要添加Deployment的访问权限,可以按照以下方式进行设置。

- apiGroups:
  - "apps"
  resources:
  - deployments
  verbs:
  - get
  - list
  - watch

紧急情况下

如果配置错误,Metrics API 将返回一个空的资源数组。Prometheus Adapter 仓库中也有一个问题,即资源经常变为空,但大多数情况下是用户配置错误。请注意以下几点,重新检查配置。

    1. 请确认 Prometheus Adapter 的 Pod 是否正常启动且没有输出错误日志

 

    1. 请确认 SeriesQuery 是否没有使用函数

 

    1. 请确认在 Naming 中使用的标签是否包含在指标中

 

    1. 请确认 Prometheus 是否能够正常返回相应的查询结果

 

    请确认有关资源的权限是否已在 RBAC 中授予

确认已设置的自定义指标。

如果所有设置都成功完成,您就可以调用设置的自定义度量API。使用kubectl get命令调用API的根路径时,会显示已注册的自定义度量列表。

$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq
{
  "kind": "APIResourceList",
  "apiVersion": "v1",
  "groupVersion": "custom.metrics.k8s.io/v1beta1",
  "resources": [
    {
      "name": "namespaces/http_request_per_seconds",
      "singularName": "",
      "namespaced": false,
      "kind": "MetricValueList",
      "verbs": [
        "get"
      ]
    },
    {
      "name": "service/http_request_per_seconds",
      "singularName": "",
      "namespaced": true,
      "kind": "MetricValueList",
      "verbs": [
        "get"
      ]
    }
  ]
}

在namespace中无法使用通配符(*),但在name中可以使用通配符来进行匹配。value的响应是指此时的度量值。

$ kubectl get --raw '/apis/custom.metrics.k8s.io/v1beta1/namespaces/test_namespace/deployments.apps/*/http_request
_per_seconds'|jq
{
  "kind": "MetricValueList",
  "apiVersion": "custom.metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/test_namespace/deployments.apps/%2A/http_request_per_seconds"
  },
  "items": [
    {
      "describedObject": {
        "kind": "Deployment",
        "namespace": "test_namespace",
        "name": "testapp",
        "apiVersion": "apps/v1"
      },
      "metricName": "http_request_per_seconds",
      "timestamp": "2020-11-22T08:40:47Z",
      "value": "68",
      "selector": null
    }
  ]
}

使用自定义指标来验证HPA的操作

一旦自定义API能够成功返回值,接下来只需在HPA中设置自定义指标即可。(有关详细设置方法,请参阅上一篇文章。)下面的清单是设置HPA的示例,其中包括了名为http_request_per_seconds的自定义指标。

kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
  name: testapp
spec:
  scaleTargetRef:
    kind: Deployment
    name: testapp
  metrics:
  # Pod以外のカスタムメトリクスはObject
  - type: Object
    object:
      describedObject:
        apiVersion: apps/v1
        kind: Deployment
        name: testapp
      metric:
        name: http_request_per_seconds # カスタムメトリクス名
      target:
        type: Value # Value
        value: "100" # しきい値

当获取到所创建的HPA资源时,可以确认通过.status.conditions下的ScalingActive类型成功地设置了自定义指标。另外,在使用`hey`命令施加负载时,可以确认在超过阈值时进行了扩展。

$ kubectl get hpa.v2beta2.autoscaling testapp -n test_namespace -o yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
...
  metrics:
  - object:
      describedObject:
        apiVersion: apps/v1
        kind: Deployment
        name: testapp
      metric:
        name: http_request_per_seconds
      target:
        type: Value
        value: "100"
    type: Object
...
status:
  conditions:
  - lastTransitionTime: "2020-11-22T07:42:03Z"
    message: the HPA was able to successfully calculate a replica count from object
      metric http_request_per_seconds
    reason: ValidMetricFound
    status: "True"
    type: ScalingActive
...

最后

本次解說了即將被納入kubernetes-sigs的Prometheus Adapter。此外,用於安裝的Helm Chart已經移交給Prometheus社群,與官方的Stable Charts存儲庫一致。對於使用Prometheus進行指標管理的人來說,在使用HPA自定義指標時,這將是一個不錯的選擇。

DirectXMan12/k8s-prometheus-adapter是使用Prometheus实现custom.metrics.K8s.io API的一个项目。

将DirectXMan12/k8s-prometheus-adapter迁移到kubernetes-sigs。

在prometheus-community/helm-charts的主分支下的helm-charts/charts/prometheus-adapter目录。

参考链接:https://github.com/prometheus-community/helm-charts/blob/main/charts/prometheus-adapter/values.yaml。

广告
将在 10 秒后关闭
bannerAds