AKS에서 hpa에 따른 autoscale 기능이 동작하지 않는다면?
결과 먼저 말하자면, 원인을 밝혀내진 못했으니 그냥 참고삼아 보시면 되겠습니다. ^^
Azure에 생성한 AKS 서비스에서 autoscale 설정을 했는데,
$ kubectl autoscale deployment --max=10 net-razor31-sample --min=2
아무리 부하를 줘도 pod는 그대로 2개에 머물고 있습니다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
net-razor31-sample-6b747bb886-ncvvw 1/1 Running 0 4m51s
net-razor31-sample-6b747bb886-sxkbj 1/1 Running 0 5m6s
hpa 설정을 보면 이상 없는 듯한데요,
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
net-razor31-sample Deployment/net-razor31-sample <unknown>/80% 2 10 2 6m50s
실제로는 이상이 있는 것입니다. ^^ 문제가 되는 부분은 "TARGETS"의 조건인데 여기에 "<unknown>"이 나오는 것은 현재 해당 시스템의 성능 metrics 데이터를 정상적으로 가져오지 못한다는 것을 의미합니다. 따라서 부하 측정을 할 수 없고 당연히 autoscale을 위한 기준을 잡지 못하는 것입니다.
기본적으로 (근래 버전의 k8s를 선택한 경우) AKS는 metrics-server 구성 요소를 이미 준비하고 있습니다.
C:\temp> kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default net-razor31-sample-6b747bb886-mldk2 0/1 Pending 0 107s
kube-system azure-ip-masq-agent-tmqtq 1/1 Running 0 6h
kube-system coredns-845757d86-7bzwn 1/1 Running 0 17h
kube-system coredns-845757d86-rljs8 1/1 Running 0 17h
kube-system coredns-autoscaler-5f85dc856b-m9s57 1/1 Running 0 17h
kube-system csi-azuredisk-node-ltfl4 3/3 Running 0 6h
kube-system csi-azurefile-node-8xggf 3/3 Running 0 6h
kube-system kube-proxy-p4zj6 1/1 Running 0 17h
kube-system metrics-server-6bc97b47f7-6tqms 1/1 Running 0 17h
kube-system tunnelfront-78bc5d7569-fvlth 1/1 Running 0 16h
따라서 성능 메트릭 데이터를 수집하지 못할 이유가 없는데요, 이에 대한 문제를 describe hpa로 살펴볼 수 있습니다.
c:\temp> kubectl describe hpa net-razor31-sample
Name: net-razor31-sample
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Tue, 25 Jan 2022 15:44:52 +0900
Reference: Deployment/net-razor31-sample
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): <unknown> / 80%
Min replicas: 2
Max replicas: 10
Deployment pods: 2 current / 2 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: failed to get cpu utilization: missing request for cpu
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 33s horizontal-pod-autoscaler New size: 2; reason: Current number of replicas below Spec.MinReplicas
Warning FailedGetResourceMetric 18s horizontal-pod-autoscaler failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API
Warning FailedComputeMetricsReplicas 18s horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API
Warning FailedGetResourceMetric 3s horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu
Warning FailedComputeMetricsReplicas 3s horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: missing request for cpu
위의 결과에 보면, "failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API"라는 메시지가 있는데요, 뭔가 해당 pod에서 CPU 자원을 구하는 코드가 동작하지 않는 듯합니다.
이상한 것은, top nodes나 top pods 옵션에서는 CPU 정보를 잘 가져온다는 점입니다.
c:\temp> kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
aks-agentpool-20726260-vmss000000 216m 11% 2073Mi 45%
c:\temp> kubectl top pods
NAME CPU(cores) MEMORY(bytes)
net-razor31-sample-574ffd4758-4zlxm 2m 52Mi
net-razor31-sample-574ffd4758-7szr8 1m 54Mi
sample-back-56bf7ff864-7hdzm 2m 14Mi
sample-front-65fd487fdf-jjhwh 1m 43Mi
sample-front-65fd487fdf-sjcbr 1m 43Mi
참... 이걸 뭐라고 설명해야 할지 모르겠군요. ^^;
웹 검색을 했지만, 딱히 이거라고 할 만한 오류 원인을 찾지 못했습니다. 그래서 어쩔 수 없이 AKS 클러스터를 새로 생성하는 것으로 해결을 했습니다.
단지, 이전 실습과 다르게 한 점이 있다면,
AKS - Azure Kubernetes Service 생성 및 SLO/SLA 변경 방법
; https://www.sysnet.pe.kr/2/0/12922
이번에는 클러스터 생성 시 ACR까지 함께 생성했다는 점입니다. 그 외에는 (쿠버네티스 버전을 포함한) 모든 옵션들이 이전 클러스터 생성과 다른 점이 없었습니다. 하지만 상식적으로 ACR이 성능 메트릭스를 가져오는 것에 영향을 미쳤을 것 같지는 않고, 테스트 플랫폼이라 이거저거 실습하느라 건드린 무엇인가가... 문제였을 듯합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]