반응형
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 컨트롤러 자체가 죽었다면?
- Redis 컨트롤러는 쿠버네티스의 디플로이먼트로 구성이 되어 파드가 자동으로 생성
- 전체 CRD의 리컨사일작업
- 컨트롤러는 이벤트큐를 생성
- 이벤트를 받아서 정상적인 처리할 수 있는 상태가 되어서 복구가 완료!!
고민사항
컨트롤러 동작중 발생한 오류에 따른 롤백처리
- Action단위로 스택에 저장을 하고 문제가 발생하는 경우에 저장되어 있는 Action을 보고 이전 상태로 되돌리는 롤백 방법을 사용
모니터링
- Exporter와 Prometheus, Grafana를 사용해 구성
- 여러 쿠버네티스 클러스터에서 수집되는 메트릭을 하나의 Grafana 화면
'Kubernetes' 카테고리의 다른 글
MySQL on Kubernetes 카카오 강연 내용 정리 (0) | 2023.08.12 |
---|---|
Kubernetes : mysql-operator 개념 (0) | 2023.08.12 |
Kubernetes : Statefulset/Headless 개념 (0) | 2023.08.12 |
Kubernetes: 스토리지/네트워크 (0) | 2023.08.10 |