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 구성
  • 모니터링 및 알림 설정
💬 무료 컨설팅 신청