no metrics returned from custom metrics API

2020, Jun 24    

no metrics returned from custom metrics API

Prometheus의 custom metrics 를 사용하여 autoscale을 설정할 경우, 간혹 다음과 같은 event 를 볼 수 있었습니다. 시간이 지남에 따라 event 메세지는 사라지고 autoscale이 적용되지만 보기 좋지 않아 찾아보기로 했습니다.

invalid metrics (1 invalid out of 1), first error is: failed to get pods metric value: unable to get metric was_threads: no metrics returned from custom metrics API

hpa를 보면 최근 사용률이 unknown 인 것을 확인할 수 있습니다.

NAME       REFERENCE               TARGETS        MINPODS   MAXPODS   REPLICAS     AGE
shop       Deployment/shop       <unknown>/33      1         2         1           1m

처음에는 custom metrics의 수집주기가 짧은것 같아 –metrics-relist-interval 옵션 값을 조정해보았으나 증상은 동일하였습니다.

확인하던 중 prometheus의 설정 파일(/etc/prometheus/config_out/prometheus.env.yaml)에 scrape 설정이 없는 것을 확인하였습니다. prometheus는 prometheus-config-reloader가 주기적으로 설정 파일이 변경된 것을 확인하여 반영하는데 변경한 설정 파일이 제때 반영되지 않아 생긴 문제로 파악되었습니다. prometheus-config-reloader의 trigger 는 파일 변경시점이 아니라 시간으로 보이며 정확한 시간주기는 알 수 없었습니다.

해결

kube-controller-manager에 horizontal-pod-autoscaler-use-rest-clients=true 옵션 필요합니다. false로 설정하면 더 이상 사용되지 않는 힙스터 기반 오토스케일링으로 전환됩니다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
  
  (생략)

    - --horizontal-pod-autoscaler-use-rest-clients=true
    image: k8s.gcr.io/kube-controller-manager:v1.16.9
    imagePullPolicy: IfNotPresent

참조

https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale/ https://www.openshift.com/blog/kubernetes-1-8-now-custom-metrics https://github.com/kubeless/kubeless/issues/493