[트러블 슈팅] Headless Service 에 대한 오해 (1)

2023. 9. 18. 15:34·개발중/Redis
728x90
반응형

 

 

아래와 같은 설정을 하는 와중에 오해한 부분을 찾았습니다.

 

고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지)

목표 1. Redis k8s 구성 이해 Redis Sentinel 고가용성(High Availability, HA) 클러스터 구성 방식으로 설계하였습니다. Master Redis Server 실제 데이터를 저장하고 처리하는 주 서버입니다. Slave Redis Server Master

soobindeveloper8.tistory.com

 

Headless service

 

 Headless service는 Kubernetes에서 특별한 유형의 서비스입니다. 

일반적인 Kubernetes 서비스는 서비스에 연결된 파드들에 대한 로드 밸런싱과 DNS 이름 해석을 제공합니다. 

그러나 Headless 서비스는 이러한 기능을 비활성화하고, 대신 각 파드에 직접 접근할 수 있는 방법을 제공합니다.

일반적인 서비스는 가상 IP와 DNS 레코드를 가지며, 이 IP 주소로 들어오는 트래픽을 서비스에 연결된 파드 중 하나로 자동으로 로드 밸런싱합니다. 

반면에 Headless 서비스는 이러한 가상 IP를 생성하지 않습니다. 

대신, DNS 쿼리를 통해 연결된 모든 파드의 IP 주소를 직접 반환합니다.

Headless 서비스는 다음과 같은 경우에 유용합니다:

  • 서비스 디스커버리
    • 클러스터 내의 다른 애플리케이션에서 서비스를 찾을 때 파드의 실제 IP 주소를 알아야 하는 경우
  • 상태 저장 애플리케이션
    • 데이터베이스 클러스터나 메시지 큐와 같은 상태를 저장하는 애플리케이션이 클러스터 내에서 실행될 때, 각 노드가 서로를 명확하게 식별할 필요가 있습니다.

Headless 서비스는 spec.clusterIP: None을 설정함으로써 생성됩니다. 

이 설정은 Kubernetes에게 서비스에 대한 클러스터 IP를 생성하지 않도록 지시합니다. 

그 결과, DNS 조회 시에는 서비스를 구성하는 파드의 IP 주소가 직접 반환됩니다.

이러한 방식은 예를 들어, 분산 데이터베이스나 분산 메시지 큐와 같은 애플리케이션에서 각 인스턴스가 자신의 역할을 명확히 알아야 하는 경우에 유용합니다.

sentinel 접속 후 IP 가 아래와 같이 조회가 되는 걸 확인 후 JAVA 설정을 아래와 같이 했습니다.

 

  • sentinel master 명 확인 해주세요. ( redis cmd 에서 확인 가능 )
    • name : master name
    • ip : 외부 ( ex : web application ) 에서 접근가능한 ip 주소
redis-cli -p 26379 
AUTH 1234
sentinel masters

 

/**
 * Redis Configuration
 * @author soobin@naver.com
 */
@EnableRedisRepositories
@Configuration
@Deprecated
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {

        /** k8s info **/
        final String SERVICE_NAME = "lucy3-redis-headless";
        final String NAME_SPACE = "lucy3";

        /** redis info **/
        final String MASTER_NAME = "mymaster";
        final String PASSWORD = "1234";
        final int SENTINEL_PORT = 26379;

        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
                .master(MASTER_NAME)
                .sentinel("lucy3-redis-node-0." + SERVICE_NAME + "." + NAME_SPACE + ".svc.cluster.local", SENTINEL_PORT)
                .sentinel("lucy3-redis-node-1." + SERVICE_NAME + "." + NAME_SPACE + ".svc.cluster.local", SENTINEL_PORT)
                .sentinel("lucy3-redis-node-2." + SERVICE_NAME + "." + NAME_SPACE + ".svc.cluster.local", SENTINEL_PORT);

        sentinelConfig.setPassword(RedisPassword.of(PASSWORD));
        return new LettuceConnectionFactory(sentinelConfig);
    }

    @Bean
    public RedisTemplate<String, ?> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(this.redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

 

redis service 를 참조해야합니다.

 

redis service 가 두 개가 존재하는데 spring 설정에서는 redis headless service 가 아닌 redis service 를 참조해야 합니다.

왜냐면 redis headless service 는 클러스터 내부의 pod ( master, slave, sentinel) 들이 서로 통신할 때 사용하는 headless service 입니다.

 

 

그래서 아래와 같이 수정할 수 있습니다.

 

 @Bean
public LettuceConnectionFactory redisConnectionFactory() {

    /** k8s info **/
    final String NAME_SPACE = "lucy3";
	final int SENTINEL_PORT = 26379;
    final String SENTINEL_HOST = "lucy3-redis." + NAME_SPACE + ".svc.cluster.local";
    
    /** redis info **/
    final String MASTER_NAME = "mymaster";
    final String PASSWORD = "1234";

    RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
            .master(MASTER_NAME)
            .sentinel(SENTINEL_HOST, SENTINEL_PORT);

    sentinelConfig.setPassword(RedisPassword.of(PASSWORD));
    return new LettuceConnectionFactory(sentinelConfig);
}

 

결국 headless service 와 service 의 쓰임새를 잘 알고 쓰지 못하고 있었다.

headless service 로 연결해도 연결은 되지만 쓰임새에 맞게 사용하지 못했었다 ;;;

728x90
반응형
저작자표시 (새창열림)

'개발중 > Redis' 카테고리의 다른 글

[redis] sentinel : waitpid() returned a pid (...) we can't find in our scripts execution queue!  (0) 2024.11.18
Redis Pub/Sub 에 대해서 알아보기.  (0) 2024.09.24
고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지)  (1) 2023.09.18
[트러블슈팅] Could not connect to Redis at 127.0.0.1:6379: Connection refused  (0) 2023.09.12
[Redis 트러블슈팅] OOM command not allowed when used memory > 'maxmemory'.  (0) 2023.09.12
'개발중/Redis' 카테고리의 다른 글
  • [redis] sentinel : waitpid() returned a pid (...) we can't find in our scripts execution queue!
  • Redis Pub/Sub 에 대해서 알아보기.
  • 고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지)
  • [트러블슈팅] Could not connect to Redis at 127.0.0.1:6379: Connection refused
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (938)
      • 개발중 (635)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (88)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
      • 논문 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크 관리사 자격증
    리눅스 1급 요약
    리눅스 마스터 1급 정리
    Git 저장소
    네트워크 관리사 2급
    리눅스 마스터 1급
    리눅스 마스터 요약
    네트워크 관리사 실기
    Spring
    리눅스 마스터 1급 요약
    스프링
    docker
    VUE
    BackendDevelopment
    java
    네트워크 관리사 학점
    jpa
    알고리즘
    리눅스 마스터
    쿠버네티스
    git
    REST API
    쿠버네티스 스터디
    네트워크 관리사
    파이썬 알고리즘
    redis
    파이썬
    네트워크 관리사 요약
    springboot
    네트워크 관리사 2급 실기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
[트러블 슈팅] Headless Service 에 대한 오해 (1)
상단으로

티스토리툴바