3

我有包含 GKE 应用程序的 GCP 集群: 在此处输入图像描述

我想使用HPA扩展应用程序

基于对指标的支持

HPA能够从

  • metrics.k8s.io(资源指标)

  • custom.metrics.k8s.io(自定义指标)

  • external.metrics.k8s.io(外部指标)

我如何检查可用的指标?我怎么能自己尝试这个API?有可能吗?

附言

根据建议的答案,我执行了命令:

 kubectl get --raw https://MY-KUBE-APISERVER-IP:6443/apis/metrics.k8s.io/v1beta1/namespaces/default/pods

回应是:

{
  "items": [
    {
      "metadata": {
        "name": "prometheus-adapter-69fcdd56bc-2plh7",
        "namespace": "default",
        "selfLink": "/\r\napis/metrics.k8s.io/v1beta1/namespaces/default/pods/prometheus-adapter-69fcdd56bc-2plh7",
        "creationTimestamp": "2020-02-05T10:56:02Z"
      },
      "timestamp": "2020-02-05T10:55:22Z",
      "window": "30s",
      "containers": [
        {
          "name": "prometheus-adapter",
          "usage": {
            "cpu": "15\r\n31939n",
            "memory": "10408Ki"
          }
        }
      ]
    },
    {
      "metadata": {
        "name": "stackdriver-exporter-76fdbc9d8f-c285l",
        "namespace": "default",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/stackdriver-exporter-76fdbc9d8f-c285l",
        "creationTimestamp": "2020-0\r\n2-05T10:56:02Z"
      },
      "timestamp": "2020-02-05T10:55:22Z",
      "window": "30s",
      "containers": [
        {
          "name": "stackdriver-exporter",
          "usage": {
            "cpu": "79340n",
            "memory": "2000Ki"
          }
        }
      ]
    }
  ],
  "kind": "PodMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods"
  }
}


$ kubectl top pods
NAME                                    CPU(cores)   MEMORY(bytes)
prometheus-adapter-69fcdd56bc-2plh7     2m           10Mi
stackdriver-exporter-76fdbc9d8f-c285l   1m           1Mi

但我仍然没有看到所有可用于 HPA 的指标

4

2 回答 2

8

指标服务器通过以下 API 公开指标。

  1. /nodes- 所有节点指标;type []NodeMetrics
  2. /nodes/{node}- 指定节点的指标;type NodeMetrics
  3. /namespaces/{namespace}/pods- 命名空间内的所有 pod 指标,支持所有命名空间;type []PodMetrics
  4. /namespaces/{namespace}/pods/{pod}- 指定 pod 的指标; type PodMetrics

例如,您可以查看以下可用指标

$ kubectl get --raw https://KUBE-APISERVER-IP:6443/apis/metrics.k8s.io/v1beta1
{
  "kind": "APIResourceList",
  "apiVersion": "v1",
  "groupVersion": "metrics.k8s.io/v1beta1",
  "resources": [
    {
      "name": "nodes",
      "singularName": "",
      "namespaced": false,
      "kind": "NodeMetrics",
      "verbs": [
        "get",
        "list"
      ]
    },
    {
      "name": "pods",
      "singularName": "",
      "namespaced": true,
      "kind": "PodMetrics",
      "verbs": [
        "get",
        "list"
      ]
    }
  ]
}

$ kubectl get --raw https://KUBE-APISERVER-IP:6443/apis/metrics.k8s.io/v1beta1/namespaces/default/pods
{
  "kind": "PodMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods"
  },
  "items": []
}

$ kubectl get --raw https://KUBE-APISERVER-IP:6443/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods
{
  "kind": "PodMetricsList",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods"
  },
  "items": [
    {
      "metadata": {
        "name": "coredns-bcccf59f-jfl6x",
        "namespace": "kube-system",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/coredns-bcccf59f-jfl6x",
        "creationTimestamp": "2021-02-17T20:31:29Z"
      },
      "timestamp": "2021-02-17T20:30:27Z",
      "window": "30s",
      "containers": [
        {
          "name": "coredns",
          "usage": {
            "cpu": "1891053n",
            "memory": "8036Ki"
          }
        }
      ]
    },
    {
      "metadata": {
        "name": "coredns-bcccf59f-vmfvv",
        "namespace": "kube-system",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/coredns-bcccf59f-vmfvv",
        "creationTimestamp": "2021-02-17T20:31:29Z"
      },
      "timestamp": "2021-02-17T20:30:25Z",
      "window": "30s",
      "containers": [
        {
          "name": "coredns",
          "usage": {
            "cpu": "1869226n",
            "memory": "8096Ki"
          }
        }
      ]
    }
  ]
}

您还可以使用kubectl top pods内部调用上述 API 的命令。

自定义指标

这些由供应商开发的适配器提供,可用的指标取决于适配器。一旦您知道指标名称,您就可以使用API来访问它。

您可以如下查看可用指标并获取指标名称。

kubectl get --raw https://KUBE-APISERVER-IP:6443/apis/custom.metrics.k8s.io/v1beta1

外部指标

这些由供应商开发的适配器提供,可用的指标取决于适配器。一旦您知道指标名称,您就可以使用API来访问它。

您可以如下查看可用指标并获取指标名称。

kubectl get --raw https://KUBE-APISERVER-IP:6443/apis/external.metrics.k8s.io/v1beta1

编辑:

您已经拥有 Prometheus 适配器,但如果该指标未作为自定义指标公开以供 HPA 使用,那么您需要公开所需的指标。请参阅本指南

于 2020-02-04T16:08:08.200 回答
2

GKE情况有点不同。

默认情况下Kubernetes有一些内置指标(CPU 和内存)。如果你想HPA基于这个指标使用,你不会有任何问题。

GCP概念上:

  • Custom Metrics当您想要使用 Kubernetes 工作负载导出的指标或附加到Kubernetes对象(例如Pod或)的指标时使用Node
  • External Metrics- 以度量类型开头external.googleapis.com的发送到工作区的度量称为external metrics. 这些指标通常由开源项目和第三方提供商导出。更多细节可以在这里找到。 Stackdriver Monitoringexternal metrics相同custom metrics,但有一个例外。对于外部指标,a resource_typeof global 无效,会导致指标数据被丢弃。

由于 GKE 与Stackdriver集成

Google Kubernetes Engine (GKE) 包括与 Stackdriver Monitoring 和 Stackdriver Logging 的原生集成。当您创建 GKE 集群时,Stackdriver Kubernetes Engine Monitoring 会默认启用,并提供专门为 Kubernetes 量身定制的监控仪表板。

使用Stackdriver Kubernetes Engine Monitoring,您可以控制 Stackdriver Logging 是否收集应用日志。您还可以选择完全禁用 Stackdriver Monitoring 和 Stackdriver Logging 集成。

检查可用指标

当您使用云环境GKE时,您可以通过在适当的端口上curiling localhost 来找到所有默认的可用指标。您必须SSH to one of Nodes然后 curl metric-server $ curl localhost:10255/metrics

第二种方法是检查可用的指标文档

重要的

您可以看到可用的指标,但是要使用它们,您需要像或一样HPA部署。在默认(版本 1.13.11)中,您已经部署了 GKE 集群(在较新版本中已弃用)和prometheus-to-sd-XXX。如果您想使用,您将已经应用了许多配置,但如果您想使用,则需要调整、、。详细信息可以在这里找到。AdaptersStackdriver adapterPrometheus adaptermetrics-serverheapsterStackdriverPrometheusPrometheus operatorsadaptersdeployments

GKE文档中,您可以找到一些教程来使用HPA 和 Custom MetricsHPA 和 External Metrics。您还可以阅读有关使用 Prometheus 和 Stackdriver 进行 GKE 监控的信息,具体取决于您的需要。

与您GKE集成后,Stackdriver您可以阅读有关启用监控的文章。

于 2020-02-12T12:14:14.307 回答