GitLab-Migrations 차트 사용하기

Tier: Free, Premium, Ultimate Offering: Self-Managed

migrations 서브차트는 GitLab 데이터베이스를 시드하는/마이그레이션하는 단일 마이그레이션 Job을 제공합니다. 이 차트는 GitLab Rails 코드베이스를 사용하여 실행됩니다.

마이그레이션을 완료한 후, 이 Job은 또한 데이터베이스에서 authorized keys 파일에 대한 쓰기를 끄는 애플리케이션 설정을 편집합니다. 차트에서는 인증된 키 API를 사용하여 SSH AuthorizedKeysCommand을 지원하는데, 인증된 키 파일에 쓰기를 지원하는 대신 이를 지원합니다.

요구 사항

이 차트는 Redis 및 PostgreSQL에 의존하며, 이는 완전한 GitLab 차트의 일부로 제공되거나, 이 차트가 배포된 Kubernetes 클러스터에서 도달 가능한 외부 서비스로 제공됩니다.

디자인 선택 사항

migrations는 차트를 배포할 때마다 새로운 마이그레이션 Job를 만듭니다. 작업 이름 충돌을 방지하기 위해, 작업 이름에 차트 리비전 및 무작위 알파벳-숫자 값을 추가합니다. 무작위 텍스트의 목적은 이 섹션에서 자세히 설명됩니다.

현재 우리는 작업이 완료된 후에도 그 작업을 클러스터에 객체로서 유지하도록 하고 있습니다. 이는 마이그레이션 로그를 관찰할 수 있도록 하는 것입니다. 현재로서는 이러한 작업은 helm uninstall 이후에도 지속됩니다. 이것은 동일한 릴리스 이름을 사용하여 미래의 배포가 충돌을 일으키지 않도록 작업 이름에 무작위 텍스트를 추가한 이유 중 하나입니다. 우리가 어떤 형태의 로그 쉬핑을 도입하면, 이러한 객체들의 지속성을 재검토할 수 있습니다.

이 차트에서 사용 중인 컨테이너에는 아직 사용하고 있지 않은 몇 가지 추가적인 최적화가 있습니다. 주로 이미 최신 상태인 경우 빨리 마이그레이션 실행을 건너뛸 수 있는 능력이며, 레일 애플리케이션을 부팅할 필요 없이 체크하는 것을 필요로 하지 않습니다. 이러한 최적화를 위해서는 마이그레이션 상태를 지속해야 합니다. 현재로서는 이를 하고 있지 않습니다. 미래에는 마이그레이션 상태에 대한 저장 지원을 이 차트에 도입할 것입니다.

구성

migrations 차트는 두 부분으로 구성됩니다: 외부 서비스 및 차트 설정.

설치 명령줄 옵션

아래 표에는 --set 플래그를 사용하여 helm install 명령에 제공할 수 있는 모든 가능한 차트 구성이 포함되어 있습니다.

매개변수 설명 기본값
common.labels 이 차트에 의해 생성된 모든 객체에 적용되는 보충 레이블 {}
image.repository 마이그레이션 이미지 리포지터리 registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee
image.tag 마이그레이션 이미지 태그  
image.pullPolicy 마이그레이션 풀 정책 Always
image.pullSecrets 이미지 리포지터리의 비밀을 위한 비밀  
init.image.repository initContainer 이미지 리포지터리 registry.gitlab.com/gitlab-org/build/cng/gitlab-base
init.image.tag initContainer 이미지 태그 master
init.image.containerSecurityContext init 컨테이너 보안 컨텍스트 재정의 {}
enabled 마이그레이션 활성화 플래그 true
tolerations Pod 할당을 위한 참을성 레이블 []
annotations 작업 사양에 대한 어노테이션 {}
podAnnotations Pod 사양에 대한 어노테이션 {}
podLabels 보충적인 Pod 레이블. 선택기에는 사용되지 않음.  
redis.serviceName Redis 서비스 이름 redis
psql.serviceName PostgreSQL을 제공하는 서비스 이름 release-postgresql
psql.password.secret psql 비밀 gitlab-postgres
psql.password.key psql 비밀의 키 psql-password
psql.port PostgreSQL 서버 포트 설정. global.psql.port보다 우선됨  
resources.requests.cpu 250m GitLab 마이그레이션 최소 CPU
resources.requests.memory 200Mi GitLab 마이그레이션 최소 메모리
securityContext.fsGroup 1000 Pod가 시작될 때 사용되는 그룹 ID
securityContext.runAsUser 1000 Pod가 시작될 때 사용되는 사용자 ID
securityContext.fsGroupChangePolicy 볼륨 소유권 및 권한 변경 정책 (Kubernetes 1.23 이상 필요)  
containerSecurityContext.runAsUser 컨테이너가 시작될 때 사용되는 오버라이드 컨테이너 보안 컨텍스트 1000
extraInitContainers 포함할 추가 init 컨테이너 디렉터리  
extraContainers 포함할 추가 컨테이너 디렉터리  
extraVolumes 만들어야 하는 추가 볼륨 디렉터리  
extraVolumeMounts 수행해야 할 추가 볼륨 마운트 디렉터리  
extraEnv 노출할 추가 환경 변수 디렉터리  
extraEnvFrom 다른 데이터 소스에서 노출할 추가 환경 변수 디렉터리  
bootsnap.enabled 레일스에 대한 Bootsnap 캐시 활성화 true
priorityClassName pod에 할당된 우선 순위 클래스  

차트 구성 예시

extraEnv

extraEnv를 사용하면 포드의 모든 컨테이너에 추가 환경 변수를 노출할 수 있습니다.

아래는 extraEnv의 예제 사용입니다:

extraEnv:
  SOME_KEY: some_value
  SOME_OTHER_KEY: some_other_value

컨테이너가 시작되면 환경 변수가 노출되었는지 확인할 수 있습니다:

env | grep SOME
SOME_KEY=some_value
SOME_OTHER_KEY=some_other_value

extraEnvFrom

extraEnvFrom를 사용하면 포드의 모든 컨테이너에 다른 데이터 소스에서 추가 환경 변수를 노출할 수 있습니다.

아래는 extraEnvFrom의 예제 사용입니다:

extraEnvFrom:
  MY_NODE_NAME:
    fieldRef:
      fieldPath: spec.nodeName
  MY_CPU_REQUEST:
    resourceFieldRef:
      containerName: test-container
      resource: requests.cpu
  SECRET_THING:
    secretKeyRef:
      name: special-secret
      key: special_token
      # optional: boolean
  CONFIG_STRING:
    configMapKeyRef:
      name: useful-config
      key: some-string
      # optional: boolean

image.pullSecrets

pullSecrets를 사용하면 포드에서 이미지를 끌어오기 위해 개인 레지스트리에 인증할 수 있습니다.

개인 레지스트리 및 해당 인증 방법에 대한 자세한 내용은 Kubernetes 문서에서 찾을 수 있습니다.

아래는 pullSecrets의 예제 사용입니다:

image:
  repository: my.migrations.repository
  pullPolicy: Always
  pullSecrets:
  - name: my-secret-name
  - name: my-secondary-secret-name

이 차트의 Community Edition 사용하기

기본적으로 Helm 차트는 GitLab의 Enterprise Edition을 사용합니다. 원하는 경우 Community Edition을 대신 사용할 수 있습니다. 두 가지의 차이점에 대해 자세히 알아보세요.

Community Edition을 사용하려면 image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ce로 설정하세요.

외부 서비스

Redis

redis:
  host: redis.example.com
  serviceName: redis
  port: 6379
  sentinels:
    - host: sentinel1.example.com
      port: 26379
  password:
    secret: gitlab-redis
    key: redis-password

host

데이터베이스가 있는 Redis 서버의 호스트 이름입니다. 이 항목은 serviceName 대신에 생략할 수 있습니다. Redis Sentinels를 사용하는 경우, host 속성은 sentinel.conf에서 지정된 클러스터 이름으로 설정해야 합니다.

serviceName

Redis 데이터베이스를 운영 중인 service의 이름입니다. 이 값이 있고 host 값이 없으면 차트는 host 값을 현재 .Release.Name의 서비스 호스트 이름으로 만들어줍니다. 전체 GitLab 차트의 일부로서 Redis를 사용하는 경우 편리합니다. 이 값은 기본적으로 redis로 설정됩니다.

port

Redis 서버에 연결할 포트 번호입니다. 기본값은 6379입니다.

password

Redis의 password 속성에는 두 가지 하위 키가 있습니다.

  • secret은 가져올 Kubernetes Secret의 이름을 정의합니다.
  • key는 위의 Secret에 포함된 비밀번호의 키 이름을 정의합니다.

sentinels

sentinels 속성은 Redis HA 클러스터에 연결할 수 있게 합니다. 하위 키는 각 Sentinel 연결을 설명합니다.

  • host는 Sentinel 서비스의 호스트 이름을 정의합니다.
  • port는 Sentinel 서비스에 도달할 포트 번호를 정의합니다. 기본값은 26379입니다.

참고: 현재 Redis Sentinel 지원은 별도로 GitLab 차트에서 배포된 Sentinels만 지원합니다. 그 결과로 GitLab 차트를 통해 Redis 배포를 비활성화해야 합니다. GitLab 차트를 배포하기 전에 Redis 비밀번호를 포함하는 Secret를 매뉴얼으로 생성해야 합니다.

PostgreSQL

psql:
  host: psql.example.com
  serviceName: pgbouncer
  port: 5432
  database: gitlabhq_production
  username: gitlab
  preparedStatements: false
  password:
    secret: gitlab-postgres
    key: psql-password

host

사용할 PostgreSQL 서버의 호스트 이름입니다. postgresql.install=true인 경우 (기본적으로 비프로덕션) 생략할 수 있습니다.

serviceName

PostgreSQL 데이터베이스를 운영 중인 서비스의 이름입니다. 이 값이 있고 host 값이 없으면 차트는 host 값 대신에 서비스의 호스트 이름을 만들어줍니다.

port

PostgreSQL 서버에 연결할 포트 번호입니다. 기본값은 5432입니다.

database

PostgreSQL 서버에서 사용할 데이터베이스의 이름입니다. 기본값은 gitlabhq_production입니다.

preparedStatements

PostgreSQL 서버와 통신할 때 준비된 문을 사용해야 하는지 여부입니다. 기본값은 false입니다.

username

데이터베이스에 인증하기 위한 사용자 이름입니다. 기본값은 gitlab입니다.

password

PostgreSQL의 password 속성에는 두 가지 하위 키가 있습니다:

  • secret는 가져올 Kubernetes Secret의 이름을 정의합니다.
  • key는 위의 Secret에 포함된 비밀번호의 키 이름을 정의합니다.