kubernetes(reids sentinel)

임재성·2026년 1월 4일

쿠버네티스 Redis Sentinel 적용

gemini 통해 생성된 기본 설정 파일 수정본

  1. 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
  1. 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
  1. 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) 사용 권장

문제 및 해결

  1. 해당 파일을 기반으로 실행시 configmap.yaml 파일 내부에 사용되는 sentinel의 설정파일중 초기에 서비스의 이름을 가지고 마스터를 모니터링 하는 부분에서 자꾸 오류가 발생.
  2. pod 내부에 존재하는 sentinel의 컨테이너를 확인
    kubectl logs redis-0 -c sentinel
  3. 오류 발생 로그 확인.
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.
  1. sentinel에서 호스트이름 확인 기능이 기본적으로 비활성화 되어있음.
    configmap.yaml을 통해 sentinel resolve-hostnames yes 옵션 활성화.
    https://stackoverflow.com/questions/57464443/redis-sentinel-throws-error-cant-resolve-master-instance-hostname
  2. 이후 정상적으로 pod가 뜨는것을 확인.
profile
조금씩 앞으로

0개의 댓글