쿠버네티스 환경에서 Redis-Sentinel Sidecar 패턴 구축 실전 가이드 ①


Sidecar 패턴 개념

파드 하나에 밀접하게 결합된 협업 구조(2개 컨테이너/프로세스)를 다루기 위해서입니다. 예를 들어, 웹 서버 (메인) 컨테이너(예: Nginx, Node.js) 옆에 로그 수집기나 보안 프록시 (사이드카) 컨테이너를 붙여야 할 때가 있습니다. 사이드카 컨테이너는 메인 컨테이너에 종속된 것일 때 사용합니다. 즉 메인 컨테이너가 다운되면 사이트카 컨테이너는 살아있어도 소용이 없을 때 사용합니다.

개념이 좀 다르고, 센티널은 레디스와 별도로 운용되는 것이 맞지만(레디스를 모니터링 하는 것이므로 한 파드에 있어서 같이 죽으면 안된다. 센티널을 별로 파드로 구성하는게 맞다), Redis-Sentinel 구성을 3개 파드로 해야 될 경우에 시도해 볼 수 있다.   그리고 (다행히) 센티널은 CPU(1core)를 평상 시 1~2% 사용하고, 피크때도 5% 이하로 사용하고, 메모리도 10MB 정도만 사용하므로 Sidecar 패턴을 사용해서 구성해보자.

1. Redis-Sentinel Sidecar 패턴 명세서(YAML)

쿠버네티스에서 Redis-Sentinel Sidecar 패턴를 배포할 때는 설정(Config), 서비스(Service), 생성(StatefulSet) 역할을 명확히 분리하여 3개의 YAML 파일로 관리합니다.

┌──────────────────────────────────────────────────────────┐ │ 1. redis-sentinel-sidecar-config.yaml (ConfigMap) │ │ : redis.conf, sentinel.conf, users.acl │ └──────────────────┬───────────────────────────────────────┘ │ [1단계: 설정 제공] ▼ ┌──────────────────────────────────────────────────────────┐ │ 2. redis-sentinel-sidecar-service.yaml (Service) │ │ : redis-sentinel-service, port, sentinel-port │ └──────────────────┬───────────────────────────────────────┘ │ [2단계: 서비스 준비] ▼ ┌──────────────────────────────────────────────────────────┐ │ 3. redis-sentinel-sidecar-statefulset.yaml (StatefulSet) │ │ : Config, Service -> redis-sentinel-0~3 (3Pods) │ │ Persistent Volume Claim (PVC) │ └──────────────────────────────────────────────────────────┘ [3단계: 레디스/센티널 파드 생성]

2. 배포 순서에 따른 파일별 내용 설명

🟢 [1단계] 레디스-센티널 Sidecar 패턴 설정: redis-sentinel-sidecar-config.yaml

  • 종류(kind): ConfigMap
  • 이름(metadata:name): redis-sentinel-sidecar-config
    ⚠️ 이름은 소문자(a-z), 숫자(0-9), 하이픈(`-`)만 사용하도록 엄격하게 제한 (대문자 사용 불가)
  • ConfigMap 설정 파일입니다. 여기에 설정된 지시자로 redis.conf, sentinel.conf 파일을 만듭니다.
  • 기존 압축(tar) 파일에 기본으로 제공되는 redis.conf, sentinel.conf 파일은 사용되지 않습니다.
  • 레디스 인스턴스(파드)마다 다른 값이 필요하면 StatefulSet에서 command 스크립트를 사용해서 동적으로 설정할 수 있습니다.   예) replica-priority 100, 110, 120

🧑‍💻 주요 값 설명

  • bind * -::* # IP가 동적으로 할당되고 변경되므로 모든 IP를 받을 수 있도록 설정합니다.
    한국인터넷진흥원(KISA) [클라우드 취약점 점검 가이드]에서는 보안 목적으로 bind 항목에 IP를 설정하도록 강요한다.   VM/물리서버에서는 그게 맞지만, 쿠버네티스 환경에서는 설정할 수가 없다.
    (공공/금융권 등 프로젝트에서 감리위원에게 잘 설명할 필요가 있습니다)
  • protected-mode no # 'bind *'으로 설정했기 때문에 'yes'로 설정하면 외부에서 접속할 수 없다.
    보안에 위배되는 것 같지만 쿠버네티스에서는 자체 보안이 있으므로 이렇게 설정해도 문제없다.
  • daemonize no # 'yes'로 설정하면 안된다.
  • requirepass password # 💥password는 꼭 설정하세요. 서버나 PC가 인터넷에 연결되어 있다면 개발환경이라고 꼭 password를 설정하세요. 레디스 해킹은 🕵️사람(해커)가 하지 않고 💻 프로그램이 24시간 돌면서 해킹합니다. Password가 없다면 개발용으로 몇 분 간만 띄워놓고 있어도 바로 해킹당할 수 있습니다.
    자세한 내용은 여기를 참조하세요. 🔗 Redis Hacking
    users.acl을 설정했을 경우 'requirepass'는 설정하지 않아도 됩니다.
  • masterauth password # 꼭 설정하세요.
  • replica-priority 100 # 📍Redis-0 100, Redis-1 110, Redis-2 120
    statefulset.yaml initContainer:command에서 동적으로 주입됩니다.
  • replica-announce-ip # 📍redis-0.redis-service...
    statefulset.yaml initContainer:command에서 동적으로 주입됩니다.
    echo "replica-announce-ip redis-$INDEX.redis-service.default.svc.cluster.local" >> /data/redis.conf
  • users.acl: 66~67라인 설정. Password('#0cbc...' 64자리)는 별도로 설정해야 합니다.
    자세한 내용은 여기를 참조하세요. 🔗 ACL
💾 redis-sentinel-sidecar-config.yaml 보기

여기 제시한 값은 레디스게이트에서 1백여 이상 사이트에 설치/운영할 때 90% 이상 적용된 redis.conf 값입니다.   (maxmemory 값은 데이터 사이즈에 맞게 조정하세요)

💻 물리서버/VM의 경우 아래 몇 가지 값을 수정해서 사용하세요.

  • bind 114.x.y.z 127.0.0.1 -::1 -> IP 지정
  • protected-mode yes
  • port -> default 💥6379 port는 해킹의 주요 타겟입니다. 반드시 다른 포트를 사용하세요.
  • daemonize yes
  • dir /app/redis -> pidfile, logfile 등도 이 dir에 위치
  • aclfile /app/redis/users.acl -> 사용자별로 권한 부여 가능: 사용 권장
  • #maxmemory <bytes> -> 주석처리(default)
    ① 레디스 전용 서버일 경우 시스템 메모리의 50%~90%까지 지정
    ② 메모리 여유가 충분하다면: 시스템 메모리가 16GB인데 레디스가 사용하는 메모리가 1~2GB이면 (현실적으로) 굳이 설정하지 않아도 됨
    ③ 💥 레디스가 시스템 메모리를 모두 사용하면 OS(Linux)에서 레디스 프로세스를 kill 시킵니다.
  • # replica-announce-ip -> 주석처리(default)

🟢 [2단계] 서비스(Service) 설정: redis-sentinel-sidecar-service.yaml

  • 종류(kind): Service
  • 이름(metadata:name): redis-sentinel-service
    ⚠️ 이름은 소문자(a-z), 숫자(0-9), 하이픈(`-`)만 사용하도록 엄격하게 제한(대문자 사용 불가)
  • Service 설정 파일입니다.   파드들의 IP가 바뀌더라도 고정된 도메인 네임(FQDN:Full Qualified Domain Name)으로 개별 Redis에 접근할 수 있도록 미리 네트워크 주소판을 만들어주는 역할을 합니다.

🧑‍💻 주요 값 설명

  • clusterIP: None # 📍'None'으로 설정(개별 파드 DNS 단독 식별용)
  • port: 18504 # 레디스 포트
  • port: 28504 # 센티널 포트
💾 redis-sentinel-sidecar-service.yaml 보기

🟢 [3단계] 레디스/센티널 파드 생성 명세서: redis-sentinel-sidecar-statefulset.yaml

레디스 파드(replicas, initContainers, memory, pvc(disk volume)) 생성 명세서 파일입니다.

  • 종류(kind): StatefulSet
  • 이름: metadata: name: redis-sentinel
    ⚠️ 이름은 소문자(a-z), 숫자(0-9), 하이픈(`-`)만 사용하도록 제한 (대문자 사용 불가)
    이 이름으로 redis-sentinel-0,1,2과 같이 숫자를 붙여 파드 이름을 짓습니다.
    파드이름과 serviceName을 이용해서 아래와 같이 FQDN(Full Qualified Domain Name)을 만듭니다.
    redis-sentinel-0.redis-sentinel-service.default.svc.cluster.local
    레디스마다 고유한 FQDN 이름으로 레디스 간, 센티널과 레디스 간 또는 레디스/센티널과 App간에 통신할 수 있습니다. IP가 변경되면 변경된 IP를 FQDN에 연결(설정)합니다.

🧑‍💻 주요 값 설명

  • configMap: name: redis-sentinel-sidecar-config (1단계 레디스/센티널 설정과 연결)
  • serviceName: redis-sentinel-service (2단계 Service와 연결)
  • replicas: 3
    • 파드① Redis-0(Master)/Sentinel-0
    • 파드② Redis-1(Replica-1)/Sentinel-1
    • 파드③ Redis-2(Replica-2)/Sentinel-2
  • image: redis:8.8.2 # 2026년 08월 17일(월) 발표된 버전 8.8.2 사용
  • imagePullPolicy: IfNotPresent # 로컬 이미지 사용
  • command 스크립트: 1단계 ConfigMap의 설정 파일 복사 및 동적 설정
  • volumeMounts: mountPath: /data: 레디스에서 사용/관리하는 모든 파일 (redis.conf, users.acl, aof files 등)을 저장합니다.
💾 redis-sentinel-sidecar-statefulset.yaml

🧑‍💻 initContainers: command: 스크립트 설명

  • 파드 인덱스(숫자) 추출(redis-sentinel-0 -> 0, redis-sentinel-1 -> 1, redis-sentinel-2 -> 2)해서 파드별 동적 설정하는데 사용합니다.
  • redis.conf 파일이 있으면 복사하지 않습니다. (최초 기동 시에만 복사하고 설정 주입)
    레디스는 운영 중 중요 이벤트 발생 시 redis.conf 파일에 쓰기(write) 때문에 파드 재시작 시 생성된 파일을 복사하면 안됩니다.
  • users.acl 파일이 있으면 복사하지 않습니다. (최초 기동 시에만 복사)
  • sentinel.conf 파일이 있으면 복사하지 않습니다. (최초 기동 시에만 복사하고 설정 주입)

🧑‍💻 containers: command: 스크립트 설명

  • .bashrc 파일에 사용하기 편리한 몇 가지 alias 지정

    '--color=auto'를 지정하면 파일명이 아래와 같이 몇 가지 색으로 구분된다.
    dir file: redis-sentinel-model
    exec file: cluster_create.sh
    tar file: file redis-8.8.2.tar
  • redis.tar 파일 기준 시간이 UTC(영국) 이다. 한국 시간(host OS time)으로 변경한다.

➡ 이제 준비되었으니 파드를 생성하러 갑시다.


<< K8s Redis-Sentinel App ② K8s Sidecar 패턴 구축 ② >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.