전공공부
[K8S] SidecarContainer가 존재하는 Pod의 HPA 적용기 본문
HorizontalPodAutoscaler
Deployments를 자동으로 업데이트 하며 target resource의 설정 값에 따라서 replica를 늘리고 줄이는 등의 행위를 하는 리소스입니다.
이를 사내 서비스에 Deployments의 Request.memory 기준으로 70%로 설정해서 배포하려고 하였는데 생긴 이슈가 있었습니다.
오류 내용은 Unable to get metrics for resource memory: no metrics returned from resource metrics API 와 같았습니다.
이때, 제가 1차로 의심 한 것은 metric server의 동작 유무를 체크하였습니다.
하지만, 명령어로 확인해보았으나 정상적으로 cpu, memory 사용량 등이 적절히 출력되었습니다.
k top pod #pod의 각 CPU, Mem을 확인
그러면, 뭐가 문제일까요... 또 다시 고민에 빠졌고 다른 곳에서 찾아보니 1.23+ 부터는 apiVersion: autoscaling/v2 으로 apiVersion이 변경되었다고 합니다. 하지만, 이는 문제가 되지 않은 것이 cli 환경에서 hpa를 먼저 dry-run으로 테스트하여서 yaml을 복제해서 사용했기 때문에 이미 apiVersion 또한, v2였습니다.
그래서, 어떻게 해결했는데?
- 결국 찾아낸 결론은 sidecar container의 request memory,cpu가 설정되지 않았기 때문입니다.
예시로 service용 container와 monitoring container가 같이 올라간 deployments의 경우 각각 request를 정해서 metric 서버가 읽을 수 있게 설정해줘야 하는데 이를 설정하는 방법은 아래와 같습니다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache-hpa
namespace: default
spec:
maxReplicas: 10
metrics:
- containerResource:
container: nginx
name: cpu
target:
averageUtilization: 50
type: Utilization
type: ContainerResource
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
보시면 알겠지만, containerResource라는 항목으로 deployments의 한 항목에만 집중해서 resource를 지정할 수 있고 이를 이용해서 targetResource를 특정 컨테이너에 한정해서 쓸 수 있습니다.
저는 sidecarContainer의 존재 유무와 상관 없이 metrics.resource 형태로 작성하여 pod 전체의 resource를 바라봐야하는 상황인데 sidecarContainer도 존재하니 metricServer가 이를 제대로 탐지하지 못해서 HPA가 target resource를 읽지 못하는 오류였습니다.
결국, 명령어 사용을 잘하는게 이번 이슈의 해결책이지만 어떻게 보면 metrics-server의 존재 유무 및 사용 이유에 대해서도 알 수 있었으며 k top pods와 같은 명령어들도 초기에 실행이 불가능하고 설치를 통해서만 사용이 가능한 존재인지 알 수 있었습니다.
'Study > K8S' 카테고리의 다른 글
[K8S - CKA] DNS in K8S (0) | 2024.02.15 |
---|---|
[K8S - CKA] Service Networking (1) | 2024.02.15 |
[K8S - CKA] Networking (0) | 2024.01.22 |
[K8S - CKA] Volumes & Persistent Volumes (Claims) (0) | 2024.01.21 |
[K8S - CKA] Storage in Docker (0) | 2024.01.20 |