【问题标题】:Unable to fetch metrics from custom metrics API: the server is currently unable to handle the request无法从自定义指标 API 获取指标:服务器当前无法处理请求
【发布时间】:2022-11-11 02:20:13
【问题描述】:

我在 GKE 上使用基于自定义指标的 HPA。

HPA 不工作,它向我显示此错误日志:

无法从自定义指标 API 获取指标:服务器当前无法处理请求

当我运行kubectl get apiservices | grep custom 我得到

v1beta1.custom.metrics.k8s.io services/prometheus-adapter False (FailedDiscoveryCheck) 135d

这是 HPA 规范配置:

spec:
  scaleTargetRef:
    kind: Deployment
    name: api-name
    apiVersion: apps/v1
  minReplicas: 3
  maxReplicas: 50
  metrics:
    - type: Object
      object:
        target:
          kind: Service
          name: api-name
          apiVersion: v1
        metricName: messages_ready_per_consumer
        targetValue: '1'

这是服务的规范配置:

spec:
  ports:
    - name: worker-metrics
      protocol: TCP
      port: 8080
      targetPort: worker-metrics
  selector:
    app.kubernetes.io/instance: api
    app.kubernetes.io/name: api-name
  clusterIP: 10.8.7.9
  clusterIPs:
    - 10.8.7.9
  type: ClusterIP
  sessionAffinity: None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack

我应该怎么做才能让它工作?

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine autoscaling hpa


    【解决方案1】:

    首先,确认 Metrics Server POD 正在您的 kube-system 命名空间中运行。此外,您可以使用以下清单:

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: metrics-server
      namespace: kube-system
      labels:
        k8s-app: metrics-server
    spec:
      selector:
        matchLabels:
          k8s-app: metrics-server
      template:
        metadata:
          name: metrics-server
          labels:
            k8s-app: metrics-server
        spec:
          serviceAccountName: metrics-server
          volumes:
          # mount in tmp so we can safely use from-scratch images and/or read-only containers
          - name: tmp-dir
            emptyDir: {}
          containers:
          - name: metrics-server
            image: k8s.gcr.io/metrics-server-amd64:v0.3.1
            command:
            - /metrics-server
            - --kubelet-insecure-tls
            - --kubelet-preferred-address-types=InternalIP
            imagePullPolicy: Always
            volumeMounts:
            - name: tmp-dir
              mountPath: /tmp
    

    如果是这样,请查看日志并查找任何堆栈驱动程序适配器线。此问题通常是由 custom-metrics-stackdriver-adapter 的问题引起的。它通常在 metrics-server 命名空间中崩溃。要解决这个问题,请使用来自此 URL 的资源,对于部署,请使用此图像:

    gcr.io/google-containers/custom-metrics-stackdriver-adapter:v0.10.1
    

    另一个常见的根本原因是OOM问题。在这种情况下,添加更多内存可以解决问题。要分配更多内存,您可以在配置文件中指定新的内存量,如以下示例所示:

    apiVersion: v1
    kind: Pod
    metadata:
      name: memory-demo
      namespace: mem-example
    spec:
      containers:
      - name: memory-demo-ctr
        image: polinux/stress
        resources:
          limits:
            memory: "200Mi"
          requests:
            memory: "100Mi"
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
    

    在上面的示例中,Container 的内存请求为 100 MiB,内存限制为 200 MiB。在清单中,“--vm-bytes”、“150M”参数告诉容器尝试分配 150 MiB 的内存。您可以访问这个 Kubernetes 官方Documentation 以获取有关内存设置的更多参考。

    您可以使用以下线程获取更多参考 GKE - HPA using custom metrics - unable to fetch metricsStackdriver-metadata-agent-cluster-level gets OOMKilledCustom-metrics-stackdriver-adapter pod keeps crashing

    【讨论】:

    • 我有一个指标服务器 pod 正在运行:kubectl get pods -n kube-system | grep metrics-server metrics-server-v0.4.4-c9bf648dc-dk476 2/2 运行 0 17h
    • 伟大的@mohamedwaelthabet。然后请按照其他两个步骤,一个关于日志和一个关于 OOM 问题,让我们知道结果。我刚刚编辑了我的答案,添加了如何增加内存量。
    • 请问我们在配置文件中所说的“pod”是什么?
    • 您发布了 2 个清单,一个用于 HPA,另一个用于服务。没有列出 POD。我只是要求您确认 Metrics Server POD 正在运行,而您确实做到了。如果您想知道您的 Service 指向哪个 POD,请运行 app.kubernetes.io/instance=api,app.kubernetes.io/name=api-name。另外,请按照我为您提供的有关堆栈驱动程序适配器和其他 OOM 问题的说明进行操作,并与我们分享结果。
    • @mohamedwaelthabet 答案中发布的信息对您有帮助吗?或者,您是否认为需要更多信息才能解决您的问题或疑问?
    【解决方案2】:

    kubectl get pod -l "app.kubernetes.io/instance=api,app.kubernetes.io/name=api-name" 能得到什么? 应该有一个 pod,服务引用它。 如果有 pod,请使用 kubectl logs <pod-name> 检查其日志。您可以将-f 添加到kubectl logs 命令,以跟踪日志。

    【讨论】:

    • 它在日志中没有显示任何特别之处:/
    【解决方案3】:

    在我的 EKS 节点安全组规则中添加这个块为我解决了这个问题:

    node_security_group_additional_rules = {
      ...
      ingress_cluster_metricserver = {
        description                   = "Cluster to node 4443 (Metrics Server)"
        protocol                      = "tcp"
        from_port                     = 4443
        to_port                       = 4443
        type                          = "ingress"
        source_cluster_security_group = true 
      }
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 2020-09-20
      • 2017-05-03
      • 2019-09-07
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多