no metrics returned from custom metrics API
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