Redis HA 설치 가이드
1. 개요
본 문서는 gitops 저장소의 /redis-ha 디렉터리 구조를 기반으로 Redis High Availability 클러스터를 Kubernetes에 설치하는 전체 과정을 안내합니다. Redis Master/Slave 구성과 Sentinel을 활용한 자동 failover, HAProxy를 통한 로드 밸런싱, Kustomize, Helm, Makefile을 활용한 배포 자동화, 환경별 설정, 주요 커스텀 옵션, 운영 팁을 포함합니다.
2. 사전 요구사항
- Kubernetes 클러스터: v1.20 이상
- 로컬 도구
kubectl: Kubernetes 클러스터 제어kustomize: v4.x 이상helm: v3.x 이상
3. 디렉터리 구조 및 역할
redis-ha/
├── Makefile # 배포 자동화 스크립트
├── kustomize/
│ ├── base/ # 공통 리소스(Helm 차트, CRD 등)
│ └── overlays/
│ └── dev/ # dev 환경 설정
│ ├── kustomization.yaml # Kustomize 구성
│ └── helm/
│ ├── values.yaml # Redis HA 설정
│ └── helm-chart.yaml # HelmChartInflationGenerator
- Makefile:
apply,delete,preview등 배포 자동화 명령어 - kustomize/base/: 모든 환경에 공통 적용될 리소스(Helm 차트, CRD 등)
- kustomize/overlays/dev/: dev 환경 특화 설정
- helm/values.yaml: Redis HA Helm Chart 커스터마이징 설정
4. 설치 단계
4.1. values.yaml 커스터마이징
kustomize/overlays/dev/helm/values.yaml 파일을 열어 주요 설정을 수정합니다.
4.1.1. 클러스터/스토리지/복제본 설정
replicas: 3
persistentVolume:
enabled: true
size: 1Gi
4.1.2. 리소스 제한 및 보안
redis:
resources:
limits:
memory: 1Gi
requests:
cpu: 50m
memory: 128Mi
sentinel:
resources:
limits:
memory: 256Mi
requests:
cpu: 50m
memory: 128Mi
4.1.3. 모니터링 및 HAProxy
haproxy:
enabled: true
replicas: 3
metrics:
enabled: true
serviceMonitor:
enabled: true
labels:
prometheus: main
exporter:
enabled: true
serviceMonitor:
enabled: true
labels:
prometheus: main
4.1.4. Affinity 설정
HAProxy, Redis Pod는 서로 다른 3개의 노드에 배치되도록 Affinity가 구성되어 있습니다.
기본적으로 hardAntiAffinity: true가 설정되어 있어, 각 Pod가 별도의 노드에 배치됩니다.
이 구성을 변경하려면 values.yaml에서 affinity 설정을 조정하세요.
redis:
hardAntiAffinity: true
additionalAffinities: {}
affinity: |
haproxy:
hardAntiAffinity: true
additionalAffinities: {}
affinity: |
4.1.5. Redis/Sentinel 설정
- masterGroupName, disableCommands, quorum 등 Redis/Sentinel 관련 설정
4.2. Kustomize 구성
4.2.1. kustomization.yaml 구성
kustomize/overlays/dev/kustomization.yaml에서 namespace, generators 지정
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: database
generators:
- ./helm/helm-chart.yaml
4.2.2. HelmChartInflationGenerator 설정
helm/helm-chart.yaml에서 Helm 차트 경로와 values 파일 지정
apiVersion: builtin
kind: HelmChartInflationGenerator
metadata:
name: redis-ha
name: redis-ha
chartHome: ../../base/helm
chart: redis-ha
releaseName: redis-ha
valuesFile: ./helm/values.yaml
includeCRDs: true
namespace: database
4.3. 배포 프로세스 (Makefile 활용)
Step 1: Namespace 생성
make namespace DEPLOY_ENV=dev
Step 2: 배포 미리보기
make preview DEPLOY_ENV=dev
Step 3: 배포 실행
make apply DEPLOY_ENV=dev
Step 4: 배포 상태 확인
kubectl get pods -n database -w
5. 설치 후 검증
5.1. 리소스 상태 확인
kubectl get pods,svc,pvc -n database | grep redis-ha
확인 사항:
- 모든 Pod이
Running상태 (redis-ha-server-0, redis-ha-server-1, redis-ha-server-2, redis-ha-haproxy-*) - PVC가
Bound상태 - Service 생성 확인 (redis-ha, redis-ha-headless, redis-ha-haproxy 등)
5.2. Prometheus/ServiceMonitor 연동 확인
- ServiceMonitor 리소스 생성 확인:
kubectl get servicemonitor -n database - Prometheus에서 메트릭 수집 여부 확인
5.3. Redis HA 구성 검증
Redis 클러스터의 고가용성 구성과 Sentinel 상태를 확인합니다.
5.3.1. 클러스터 리소스 확인
kubectl -n database get svc,sts,pod,pvc | grep redis-ha
확인 사항:
- StatefulSet:
redis-ha-server(3개 replica) - Pod: 3개 Redis 인스턴스 (
redis-ha-server-0,redis-ha-server-1,redis-ha-server-2) 모두Running상태 - PVC: 각 인스턴스당 1Gi 스토리지 바인딩 확인
- Service:
redis-ha(Sentinel),redis-ha-headless,redis-ha-haproxy(HAProxy)
5.3.2. Master/Slave 상태 확인
각 Redis Pod에 접속하여 replication 정보를 확인합니다. 이를 통해 Master/Slave 구성을 검증할 수 있습니다.
for i in 0 1 2; do
echo "### redis-ha-server-$i"
kubectl -n database exec redis-ha-server-$i -- redis-cli info replication
done
예상 결과:
### redis-ha-server-0
# Replication
role:master
connected_slaves:2
slave0:ip=10.244.x.x,port=6379,state=online,offset=xxx,lag=0
slave1:ip=10.244.x.x,port=6379,state=online,offset=xxx,lag=0
### redis-ha-server-1
# Replication
role:slave
master_host:10.244.x.x
master_port:6379
master_link_status:up
### redis-ha-server-2
# Replication
role:slave
master_host:10.244.x.x
master_port:6379
master_link_status:up
확인 사항:
- 하나의 노드가 Master, 나머지가 Slave로 구성
- 모든 Slave가 online 상태 (master_link_status: up)
- lag 값이 낮은지 확인 (데이터 동기화 상태)
5.3.3. Sentinel 상태 확인
Sentinel을 통해 Master 정보를 확인하여 failover 준비 상태를 검증합니다.
kubectl -n database exec redis-ha-server-0 -- redis-cli -p 26379 sentinel masters
예상 결과:
1) "name"
2) "mymaster"
3) "ip"
4) "10.244.x.x"
5) "port"
6) "6379"
7) "runid"
8) "xxx"
9) "flags"
10) "master"
...
확인 사항:
- Sentinel이 Master를 인식하고 모니터링 중
- quorum 설정 (기본 2) 확인
- flags가 “master"인지 확인
5.3.4. HAProxy 상태 확인
HAProxy를 통해 Redis 클러스터에 연결하여 Master로의 트래픽 라우팅이 정상인지 확인합니다.
kubectl -n database exec redis-ha-server-0 -- redis-cli -h redis-ha-haproxy -p 6379 info replication
예상 결과:
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
HAProxy가 Redis Master로 트래픽을 올바르게 라우팅하고 있음을 확인합니다. Slave 수와 min_slaves_good_slaves 값이 일치하는지 검증합니다.
6. 운영 및 Troubleshooting
6.1. Pod가 Running 상태가 아닌 경우
kubectl get pods -n database
kubectl describe pod <pod명> -n database
kubectl logs <pod명> -n database
주요 원인:
- PVC 미바인딩 → StorageClass 확인
- 리소스 부족 →
kubectl top nodes로 노드 상태 확인 - 이미지 Pull 오류 → values.yaml의 image.repository, image.tag 확인
6.2. Redis 연결 오류
- HAProxy를 통한 연결:
redis-cli -h redis-ha-haproxy - 직접 연결:
redis-cli -h redis-ha-headless - Sentinel 연결:
redis-cli -p 26379
6.3. Failover 테스트
kubectl delete pod redis-ha-server-0 -n database
kubectl get pods -n database -w
확인 사항:
- 새로운 Master 선출
- Slave 재구성
- HAProxy 트래픽 라우팅 변경
6.4. Secret 관리
민감 정보(비밀번호 등)는 별도 Secret으로 관리하고 values.yaml에서 참조하도록 권장합니다.
kubectl create secret generic redis-secret --from-literal=password='your-strong-password' -n database
6.5. Network Policy
Redis Pod 간 네트워크 통신을 제한하는 NetworkPolicy 적용을 권장합니다.
7. 보안 및 운영 권장사항
7.1. Secret 관리
민감 정보(비밀번호 등)는 별도 Secret으로 관리하고 values.yaml에서 참조하도록 권장합니다.
kubectl create secret generic redis-secret --from-literal=password='your-strong-password' -n database
7.2. Network Policy
Redis Pod 간 네트워크 통신을 제한하는 NetworkPolicy 적용을 권장합니다.
8. 배포 제거
8.1. Redis HA 삭제
make delete DEPLOY_ENV=dev
8.2. Namespace 삭제 (선택사항)
kubectl delete namespace database
주의: Namespace를 삭제하면 PVC를 포함한 모든 데이터가 영구 삭제됩니다.
9. 부록: 최종 체크리스트
설치 전:
- Kubernetes 클러스터 준비 (v1.20+)
- kubectl, kustomize, helm 설치
- 네임스페이스(database) 생성
설치:
- values.yaml 커스터마이징 완료
- kustomization.yaml 구성 완료
- make namespace 실행
- make preview 실행 및 확인
- make apply 실행
검증:
- 모든 Pod이 Running 상태
- PVC가 Bound 상태
- Service/StatefulSet 생성 확인
- Master/Slave 구성 확인
- Sentinel 모니터링 확인
- HAProxy 라우팅 확인
운영:
- Secret 관리 적용
- Network Policy 구성
- 모니터링 및 알림 설정