외부 Redis로 GitLab 차트 구성

이 문서는 외부 Redis 서비스로 Helm 차트를 구성하는 방법에 대한 설명서를 제공하는 것을 목적으로 합니다.

만약 Redis를 구성하지 않았다면 온프레미스나 VM에 배포할 경우, Linux 패키지를 사용하는 것을 고려해보세요.

현재 지원되는 Redis 버전에 대한 자세한 내용은 설치 시스템 요구 사항을 참조하세요.

차트 구성

redis 차트 및 해당 제공하는 Redis 서비스를 비활성화하고, 다른 서비스를 외부 서비스로 지정하세요.

다음 매개변수를 설정해야 합니다.

  • redis.install: Redis 차트를 비활성화하려면 false로 설정합니다.
  • global.redis.host: 외부 Redis의 호스트 이름을 설정하세요. 도메인 또는 IP 주소일 수 있습니다.
  • global.redis.auth.enabled: 외부 Redis에서 비밀번호가 필요하지 않다면 false로 설정하세요.
  • global.redis.auth.secret: 인증을 위한 토큰이 포함된 시크릿의 이름입니다. (인증을 위한 시크릿 이름 참조)
  • global.redis.auth.key: 토큰 내용이 포함된 시크릿 내의 키입니다.

아래 아이템들은 기본값을 사용하지 않는다면 추가적으로 사용자 정의할 수 있습니다.

  • global.redis.port: 데이터베이스에서 사용 가능한 포트로 기본값은 “6379”입니다.

예를 들어 Helm의 --set 플래그를 통해 이러한 값을 전달하여 배포할 수 있습니다:

helm install gitlab gitlab/gitlab  \
  --set redis.install=false \
  --set global.redis.host=redis.example \
  --set global.redis.auth.secret=gitlab-redis \
  --set global.redis.auth.key=redis-password \

만약 연결하려는 Redis HA 클러스터에 Sentinel 서버가 실행 중이라면, global.redis.host 속성을 sentinel.conf에 지정된 Redis 인스턴스 그룹(예: mymaster 또는 resque)의 이름으로 설정해야 하며, Redis 마스터의 호스트 이름으로는 설정하면 안 됩니다. Sentinel 서버는 --set 플래그를 사용하여 global.redis.sentinels[0].hostglobal.redis.sentinels[0].port 값을 참조할 수 있습니다. 인덱스는 0부터 시작합니다.

여러 개의 Redis 인스턴스 사용

GitLab은 여러 개의 Redis 인스턴스로 리소스 집약적인 Redis 작업을 분리하는 것을 지원합니다. 이 차트는 이러한 지속성 클래스를 다른 Redis 인스턴스로 분배하는 것을 지원합니다.

여러 Redis 인스턴스를 사용하여 차트를 구성하는 자세한 내용은 글로벌 문서에서 찾을 수 있습니다.

안전한 Redis 스키마 지정 (SSL)

SSL을 사용하여 Redis에 연결하려면 rediss (두 번의 s에 유의) 스키마 매개변수를 사용하세요:

--set global.redis.scheme=rediss

redis.yml 재정의

만약 GitLab 15.8에서 소개된 redis.yml 구성 파일의 내용을 재정의하려면 global.redis.redisYmlOverride 아래에 값을 정의함으로써 할 수 있습니다. 해당 키 아래의 모든 값과 하위 값은 그대로 redis.yml로 렌더링됩니다.

global.redis.redisYmlOverride 설정은 외부 Redis 서비스와 함께 사용하기 위한 것입니다. redis.installfalse로 설정해야 합니다. 자세한 내용은 Redis 설정 구성을 참조하세요.

예시:

redis:
  install: false
global:
  redis:
    redisYmlOverride:
      raredis:
        host: rare-redis.example.com:6379
        password:
          enabled: true
          secret: secretname
          key: password
      exotic_redis:
        host: redis.example.com:6379
        password: <%= File.read('/path/to/secret').strip.to_json %>
      mystery_setting:
        deeply:
          nested: value

만약 /path/to/secretTHE SECRET이, /path/to/secret/raredis-override-passwordRARE SECRET이 포함되어 있다면, 다음 내용이 redis.yml에 렌더링될 것입니다:

production:
  raredis:
    host: rare-redis.example.com:6379
    password: "RARE SECRET"
  exotic_redis:
    host: redis.example.com:6379
    password: "THE SECRET"
  mystery_setting:
    deeply:
      nested: value

주의할 점

redisYmlOverride의 유연성의 대약면은 사용자 친화성이 떨어진다는 점입니다. 예를 들어:

  1. redis.yml에 비밀번호를 삽입하려면 다음 중 하나를 해야 합니다:
    • 기존 비밀번호 정의를 사용하고 Helm에게 ERB 문을 대체하도록 하기.
    • ERB <%= File.read('/path/to/secret').strip.to_json %> 문을 올바르게 작성하여, 컨테이너에 마운트된 비밀 경로를 사용하세요.
  2. redisYmlOverride에서는 GitLab Rails의 명명 규칙을 따라야 합니다. 예를 들어, “SharedState” 인스턴스는 sharedState가 아니라 shared_state로 불립니다.
  3. 구성 값의 상속이 없습니다. 예를 들어, 세 개의 Redis 인스턴스가 동일한 Sentinels를 공유하는 경우, Sentinel 구성을 세 번 반복해야 합니다.
  4. CNG 이미지는 유효한 resque.ymlcable.yml을 예상합니다, 그래서 적어도 global.redis.host를 구성해야 합니다.

문제 해결

ERR Error running script (call to f_5962bd591b624c0e0afce6631ff54e7e4402ebd8): @user_script:7: ERR syntax error라는 오류가 발생할 수 있습니다.

외부 Redis 5를 사용하는 경우, Helm 차트 7.2 이상에서 webservicesidekiq 팟 로그에서 이 오류를 볼 수 있습니다. Redis 5는 지원되지 않습니다.

이를 해결하려면 외부 Redis 인스턴스를 6.x 이상으로 업그레이드하십시오.