k8s_redis_cluster_1
쿠버네티스 환경에서 Redis-Cluster 구축 실전 가이드 ①
명세서(YAML) 개요 및 내용
Redis-Cluster 개요
Redis-Cluster는 레디스 3개 파드(마스터)에 데이터를 분산해서 저장(관리)하고,
각 파드(마스터)는 백업(복제) 파드를 가지고 있다.
레디스 마스터 파드가 다운되면 백업(복제) 레디스가 마스터로 승격된다.
6개 파드(마스터 3개, 복제 3개)로 레디스-클러스터를 구성해보자.
🔗
Redis-Cluster에 대한 전반적인 내용은 여기를 보세요.
1. Redis-Cluster 명세서(YAML)
쿠버네티스에서 Redis-Cluster를 배포할 때는 설정(Config), 서비스(Service), 생성(StatefulSet) 역할로 분리하여 3개의 YAML 파일로 관리합니다.
2. 배포 순서에 따른 파일별 내용 설명
🟢 [1단계] 레디스 설정: redis-cluster-config.yaml
- 종류(kind): ConfigMap
- 이름(metadata:name): redis-cluster-config
⚠️ 이름은 소문자(a-z), 숫자(0-9), 하이픈(`-`)만 사용하도록 엄격하게 제한 (대문자 사용 불가)
- ConfigMap 설정 파일입니다. 여기에 설정된 지시자로 redis.conf 파일을 만듭니다.
- 기존 압축(tar) 파일에 기본으로 제공되는 redis.conf 파일은 사용되지 않습니다.
- 레디스 인스턴스(파드)마다 다른 값이 필요하면 StatefulSet에서 command 스크립트를 사용해서 동적으로 설정할 수 있습니다. 예) cluster-announce-hostname redis-cluster-0,1,2...
🧑💻 주요 값 설명
- 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 # 꼭 설정하세요.
- cluster-node-timeout 3000 # 노드 다운 감지 시간(3000ms(3sec)): 3초로 설정합니다.
- cluster-announce-hostname, cluster-announce-human-nodename 두 항목은 파드 생성 시
statefulset.yaml 파일 initContainer:command에서 파드 이름을 구해서 동적 주입합니다.
따라서 여기서는 설정하지 않습니다.
echo "cluster-announce-hostname ${POD_FQDN}" >> /data/redis.conf
echo "cluster-announce-human-nodename ${POD_NAME}" >> /data/redis.conf
- users.acl: 90~91라인 설정. Password('#0cbc...' 64자리)는 별도로 설정해야 합니다.
자세한 내용은 여기를 참조하세요. 🔗 ACL
💾 redis-cluster-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 시킵니다. - #cluster-announce-hostname "" -> 주석처리(default)
- #cluster-announce-human-nodename "" -> 주석처리(default)
🟢 [2단계] 서비스(Service) 설정: redis-cluster-service.yaml
- 종류(kind): Service
- 이름(metadata:name): redis-cluster-service
⚠️ 이름은 소문자(a-z), 숫자(0-9), 하이픈(`-`)만 사용하도록 엄격하게 제한(대문자 사용 불가)
- Service 설정 파일입니다.
파드들의 IP가 바뀌더라도 고정된 도메인 네임(FQDN:Full Qualified Domain Name)으로
개별 Redis에 접근할 수 있도록 미리 네트워크 주소판을 만들어주는 역할을 합니다.
🧑💻 주요 값 설명
- clusterIP: None # 📍'None'으로 설정(개별 파드 DNS 단독 식별용)
- port: 18504 # 레디스 포트
- port: 28504 # 레디스 클러스터 포트
💾 redis-cluster-service.yaml 보기
🟢 [3단계] 레디스 파드 생성 명세서: redis-cluster-statefulset.yaml
레디스 파드(replicas, initContainers, memory, pvc(disk volume)) 생성 명세서 파일입니다.
- 종류(kind): StatefulSet
- 이름(metadata:name): redis-cluster
⚠️ 이름은 소문자(a-z), 숫자(0-9), 하이픈(`-`)만 사용하도록 제한 (대문자 사용 불가)
이 이름으로 redis-cluster-0,1,2과 같이 숫자를 붙여 파드 이름을 짓습니다.
파드이름과 serviceName을 이용해서 아래와 같이 FQDN(Full Qualified Domain Name)을 만듭니다.
redis-cluster-0.redis-cluster-service.default.svc.cluster.local
레디스마다 고유한 FQDN 이름으로 레디스 간 또는 레디스와 App간에 통신할 수 있습니다.
IP가 변경되면 변경된 IP를 FQDN에 연결(설정)합니다.
🧑💻 주요 값 설명
- configMap: name: redis-cluster-config (1단계 레디스 설정과 연결)
- serviceName: redis-cluster-service (2단계 Service와 연결)
- replicas: 6 # Redis 파드 6개 생성, Master(3개), Replica(3개)로 역할을 나누는 것은 Redis-Cluster 구성(생성) 시 결정된다.
- 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-cluster-statefulset.yaml 보기
🧑💻 initContainers: command: 스크립트 설명
- ① ConfigMap에서 읽기 전용 redis.conf를 쓰기 가능한 /data 로 복사
레디스는 'config rewrite' 명령으로 conf 파일을 다시 쓸수도 있고, Master-Replica 역할이 변경될 경우 'replicaof' 지시자가 다시 쓰여집니다. 그래서 redis.conf 피일은 read-write 가능한 dir에 있어야 합니다.
- ② users.acl 파일 복사 및 권한 부여
- ③ Redis Cluster 동적으로 FQDN를 구해서 cluster-announce-*name에 주입
🧑💻 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)으로 변경한다.
| << Kubernetes 레디스 준비 ③ | K8s Redis-Cluster 구축 ② >> |
|---|
