본문 바로가기
Kubernetes

'쿠버네티스에 레디스 캐시 클러스터 구축기' 카카오 테크 내용 정리

by SE_123 2023. 8. 12.

URL: https://tech.kakao.com/2022/02/09/k8s-redis/

쿠버네티스에 레디스 캐시 클러스터 구축기


쿠버네티스에 Redis를 올리게 된 이유 :Redis도 스케일인&아웃이 쉬워야 한다!

  • 쿠버네티스 오퍼레이터 패턴(Kubernetes Operator Pattern)을 사용
  • 호스트 네트워크(Host Network)를 사용
  • HA를 위해서 파드 어피니티(Pod Affinity)를 적용
  • 모니터링을 위해 Mysql Exporter와 Prometheus, 그리고 Grafana를 사용

 

Redis 클러스터를 구성한 방법

CRD(Custom Resource Definition) 생성

Redis 컨트롤러 개발

CRD의 생성, 삭제, 변경 등의 이벤트들을 받아서 처리할 수 있는 Redis Controller

→ 해당 컨트롤러는 해당 커스텀리소스용 이벤트 큐를 생성하고 적재합니다. 이후, 별도의 쓰레드를 이용해 커스텀리소스 값에 맞게 Redis 클러스터를 생성

→ 그런 다음, HA처리를 위해 Redis 파드의 삭제에 대한 알림을 수신할 수 있도록 별도의 Watch 처리를 추가

 

Redis 컨트롤러의 동작 방법: 리컨사일(reconcile)

reconcile : CRD와 Redis클러스터의 현재 상태가 동일한 지 확인

CRD가 추가된 경우

  • 새로운 이벤트 큐를 생성한 다음, 이를 기반으로 리컨사일을 진행

CRD에 변경이 있다면

  • 스케일 인/아웃과 삭제 상황
  • 리컨사일 작업을 통해 클러스터를 업데이트

마스터 pod가 죽었을때

  • 클러스터 HA처리

 

Redis 파드의 내부 구성

1개의 Redis 파드는, 크게 Redis 컨테이너와 Exporter 컨테이너의 2개의 컨테이너로 구성

호스트 네트워크 사용

Redis 클러스터에 어떻게 접근할 것인가(← 보통은 쿠버가 권장하는 ingress 방식 사용)

→ 개발 복잡도를 낮추고 캐시 서버의 성능을 최대한 확보하기 위해 호스트 네트워크를 사용

파드 번호 Redis 포트 클러스터 버스 포트 Exporter 포트

1 10000 20000 15000
2 10001 20001 15001

레이블과 어노테이션 추가

마스터와 레플리카가 같은 워커노드에 올라가지 않도록 파드어피니티를 적용

(← 해당 워커 노드가 죽는 순간 정상적인 HA처리가 되지 않기 때문)

  • PodAfinity: Label에 레디스 노드의ID를 추가 하고 이 값을 이용해서 같은 워커노드에 올라가지 않도록 함
  • Prometheus가 메트릭 값을 정상적으로 읽어 갈 수 있도록, 포트 번호도 어노테이션에 추가

Redis 컨트롤러 자체가 죽었다면?

  1. Redis 컨트롤러는 쿠버네티스의 디플로이먼트로 구성이 되어 파드가 자동으로 생성
  2. 전체 CRD의 리컨사일작업
  3. 컨트롤러는 이벤트큐를 생성
  4. 이벤트를 받아서 정상적인 처리할 수 있는 상태가 되어서 복구가 완료!!

 

고민사항

컨트롤러 동작중 발생한 오류에 따른 롤백처리

  • Action단위로 스택에 저장을 하고 문제가 발생하는 경우에 저장되어 있는 Action을 보고 이전 상태로 되돌리는 롤백 방법을 사용

모니터링

  • Exporter와 Prometheus, Grafana를 사용해 구성
  • 여러 쿠버네티스 클러스터에서 수집되는 메트릭을 하나의 Grafana 화면
반응형