쿠버네티스 Redis Sentinel 적용
gemini 통해 생성된 기본 설정 파일 수정본
- redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
port 6379
bind 0.0.0.0
appendonly yes
sentinel.conf: |
port 26379
bind 0.0.0.0
# redis-0.redis-service를 초기 마스터로 지정
sentinel monitor mymaster redis-0.redis-service 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel resolve-hostnames yes
init.sh: |
# 1. 호스트네임 가져오기 (예: redis-0)
HOSTNAME=$(hostname)
echo "Configuring for $HOSTNAME"
# 2. 하이픈(-) 뒤의 숫자만 추출 (sh 호환 문법)
ORDINAL=${HOSTNAME##*-}
# 3. 설정 파일 복사
cp /readonly-config/redis.conf /data/redis.conf
cp /readonly-config/sentinel.conf /data/sentinel.conf
# 4. 0번이 아니면 슬레이브로 설정
if [ "$ORDINAL" -eq 0 ]; then
echo "I am the initial master."
else
echo "I am a replica. Pointing to redis-0.redis-service"
echo "replicaof redis-0.redis-service 6379" >> /data/redis.conf
fi
- redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
clusterIP: None # Headless Service
publishNotReadyAddresses: true # 이 줄을 추가하세요!
ports:
- name: redis
port: 6379
- name: sentinel
port: 26379
selector:
app: redis
---
# 외부 앱이 접근할 때 사용할 일반 서비스 (선택 사항)
apiVersion: v1
kind: Service
metadata:
name: redis-client
spec:
ports:
- name: sentinel
port: 26379
selector:
app: redis
- redis-stateful.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis-service"
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
initContainers:
- name: init-redis
image: redis:7.0-alpine
command: ["sh", "/readonly-config/init.sh"]
volumeMounts:
- name: config
mountPath: /readonly-config
- name: data
mountPath: /data
containers:
- name: redis
image: redis:7.0-alpine
command: ["redis-server", "/data/redis.conf"]
ports:
- containerPort: 6379
volumeMounts:
- name: data
mountPath: /data
- name: sentinel
image: redis:7.0-alpine
command: ["redis-sentinel", "/data/sentinel.conf"]
ports:
- containerPort: 26379
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: config
configMap:
name: redis-config
- name: data
emptyDir: {} # 실제 운영 환경에서는 PersistentVolumeClaim(PVC) 사용 권장
문제 및 해결
- 해당 파일을 기반으로 실행시 configmap.yaml 파일 내부에 사용되는 sentinel의 설정파일중 초기에 서비스의 이름을 가지고 마스터를 모니터링 하는 부분에서 자꾸 오류가 발생.
- pod 내부에 존재하는 sentinel의 컨테이너를 확인
kubectl logs redis-0 -c sentinel
- 오류 발생 로그 확인.
1:X 04 Jan 2026 13:58:01.651 # Failed to resolve hostname 'redis-0.redis-service'
*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***
Reading the configuration file, at line 4
\>>> 'sentinel monitor mymaster redis-0.redis-service 6379 2'
Can't resolve instance hostname.
- sentinel에서 호스트이름 확인 기능이 기본적으로 비활성화 되어있음.
configmap.yaml을 통해 sentinel resolve-hostnames yes 옵션 활성화.
https://stackoverflow.com/questions/57464443/redis-sentinel-throws-error-cant-resolve-master-instance-hostname
- 이후 정상적으로 pod가 뜨는것을 확인.