k8s_redis_sentinel_sidecar_1
쿠버네티스 환경에서 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 파일로 관리합니다.
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 패턴 구축 ② >> |
|---|
