험난한 Kubernetes 전환기 (5) - KEDA 적용하기
오랜 기간 동안 진행한 Kubernetes 전환 과정 이후에도, 팀 내에서 더 나은 환경을 제공하기 위해 여러 계획을 진행하고 있습니다.
최근에는 이벤트와 트래픽에 따른 자원 관리를 본격적으로 시작할 필요성이 생겼고, 이를 위해 KEDA를 도입하게 되었습니다.
이를 구성한 과정과 느낀 점을 간단히 정리해 보았습니다.
KEDA
KEDA는 다양한 이벤트를 기반으로 컨테이너를 동적으로 확장하거나 축소할 수 있도록 지원하는 Kubernetes 컴포넌트로, CNCF Graduated Project이기도 합니다.
예를 들어, 메시지 큐나 DB에 쌓인 데이 터의 양을 보고 트래픽을 조정하거나, CronJob처럼 특정 시간대를 기준으로 Pod 수를 조절할 수 있습니다.
KEDA의 원리를 간단히 설명하면, ScaledObject라는 리소스를 정의하여 HPA(Horizontal Pod Autoscaler)의 상태를 지속적으로 업데이트하는 것입니다.
외부 이벤트가 발생하면 ScaledObject가 Scaling 규칙을 변경하고, 이를 HPA에 전달하여 Pod 수를 조절하도록 합니다.
실제로 ScaledObject를 생성해 보면 자동으로 HPA가 생성되는 것을 확인할 수 있고, Pod scaling 이벤트 자체는 HPA에 위임됩니다.
기존의 HPA는 보통 CPU 또는 메모리 사용률에 따라 Pod의 수를 조절하는 방식이었습니다. KEDA는 이를 확장하여 이벤트 소스를 중심으로 더 유연하고 확장된 조건에서의 리소스 조정을 가능하도록 해 줍니다.
저희 회사의 경우에는 문서 처리나 각종 배치 처리를 RabbitMQ 이벤트를 보고 동적으로 처리하고자 하는 요구가 있었습니다.
기존에는 코드로 이 로직을 직접 구현했었는데, Kubernetes 환경으로 전환하면서 실제 KEDA를 사용하도록 변경이 필요했습니다.
또한 B2B 서비스가 메인이기 때문에 회사 서비스의 트래픽은 특정 시간대에 몰리는 경향이 있었고, 이에 따른 트래픽 대응과 리소스 효율화에도 KEDA가 좋은 해결책이 될 수 있었습니다.
RabbitMQ 연동하기
저희가 KEDA를 적용하고자 한 앱들의 이벤트 소 스는 RabbitMQ였고, 따라서 이를 집중적으로 구현했습니다. RabbitMQ 이벤트 소스를 어떻게 연동하는지는 이 문서에 사례별로 자세히 나와 있습니다.
기본 구현
KEDA 설치는 Helm chart를 통해 쉽게 설치할 수 있습니다.
KEDA를 사용할 모든 클러스터에 설치해야 합니다.
KEDA를 구현할 때는 다음 리소스들을 구현해야 합니다.
- ScaledObject: 이벤트 소스를 모니터링하고, HPA가 작동하기 위한 Scaling 규칙을 정의합니다. ScaledObject가 정의되면 자동으로 HPA가 생성됩니다.
- TriggerAuthentication: 이벤트 소스에 대한 인증 정보를 저장합니다. 여기서는 RabbitMQ의 URL이나 인증 정보가 해당됩니다.
- Secret: 당연히 리소스에 직접 비밀 정보를 입력하는 것은 좋지 않습니다. 따라서 이를 Secret으로 관리합니다.
- 저희는 External Secret Operator를 사용하여 외부 Secret Manager에서 비밀 정보를 가져오도록 설정했습니다.
관련된 구현체는 공식 문서에 매우 잘 설명되어 있습니다.
저는 이 리소스들을 기존 서비스 Helm chart 템플릿에 통합하여 values.yaml
에서 쉽게 적용할 수 있도록 했습니다.