번들된 PostgreSQL 버전 업그레이드

Tier: Free, Premium, Ultimate Offering: Self-Managed
note
이 단계는 번들된 PostgreSQL 차트를 사용하는 경우에 해당됩니다 (postgresql.install이 false가 아닌 경우), 외부 PostgreSQL 설정과는 관련이 없습니다.

번들된 PostgreSQL 차트를 사용하여 PostgreSQL의 새로운 주요 버전으로 변경하려면 기존 데이터베이스를 백업한 다음 새 데이터베이스로 복원해야 합니다.

note
이 차트의 7.0.0 릴리스의 일환으로, 우리는 기본 PostgreSQL 버전을 12.7.0에서 14.8.0으로 업그레이드했습니다. 이 업그레이드는 PostgreSQL 차트 버전을 8.9.4에서 12.5.2로 업그레이드하여 수행되었습니다.

이는 단순히 대체할 수 없는 업그레이드가 아닙니다. 데이터베이스를 업그레이드하려면 매뉴얼 단계가 수행되어야 합니다. 업그레이드 단계는 업그레이드 단계에 문서화되어 있습니다.

번들된 PostgreSQL 업그레이드 단계

note
7.0.0부터 GitLab 차트는 PostgreSQL 자격 증명을 더 이상 PostgreSQL 인스턴스 내부의 파일로 마운트하지 않습니다. 이것은 postgresql.auth.usePasswordFilesfalse로 설정함으로써 수행됩니다. 이것은 데이터베이스 자격 증명을 비밀번호 파일 대신 환경 변수로 전달한다는 것을 의미합니다.

이것은 상위 PostgreSQL 차트의 이슈 때문에 발생한 것입니다. 만약 PostgreSQL 비밀번호에 환경 변수를 사용하고 싶지 않고 파일을 사용하려면 매뉴얼으로 기존 PostgreSQL 비밀번호 Secret 편집 및 PostgreSQL 차트에 비밀번호 파일을 활성화하는 지침을 따라야 합니다.

기존 데이터베이스 준비

다음 사항을 유의하세요:

  • 만약 번들된 PostgreSQL 차트를 사용하지 않는다면(postgresql.install이 false 인 경우), 이 단계는 따르실 필요가 없습니다.
  • 동일한 네임스페이스에 여러 차트를 설치한 경우 Helm 릴리스 이름을 데이터베이스 업그레이드 스크립트에 전달하는 것이 필요할 수 있습니다. 예시 명령의 bash -s STAGE-r RELEASE STAGE로 바꿔주셔야 합니다.
  • 만약 kubectl 컨텍스트의 기본 네임스페이스가 아닌 다른 네임스페이스에 차트를 설치했다면 데이터베이스 업그레이드 스크립트에 네임스페이스를 전달해 주어야 합니다. 예시 명령의 bash -s STAGE-n NAMESPACE STAGE로 바꿔주셔야 합니다.

pre 단계는 데이터베이스의 백업을 Toolbox의 백업 유틸리티 스크립트를 사용하여 생성하여 구성된 s3 버킷(MinIO가 기본)에 저장합니다:

# GITLAB_RELEASE는 'v'로 시작하는 차트 버전을 나타냄: v6.0.0
curl -s "https://gitlab.com/gitlab-org/charts/gitlab/-/raw/${GITLAB_RELEASE}/scripts/database-upgrade" | bash -s pre

기존 PostgreSQL 데이터 삭제

note
PostgreSQL 데이터 형식이 변경되었으므로 업그레이드를 위해 기존 PostgreSQL StatefulSet을 제거해야 합니다. StatefulSet은 다음 단계에서 재생성될 것입니다.
caution
이전 단계에서 데이터베이스를 백업하지 않으면 GitLab 데이터가 손실될 수 있습니다.
kubectl delete statefulset RELEASE-NAME-postgresql
kubectl delete pvc data-RELEASE_NAME-postgresql-0

GitLab 업그레이드

표준 절차를 따라 GitLab을 업그레이드 하되, 다음과 같은 내용을 추가하세요:

다음 플래그를 사용하여 마이그레이션을 비활성화하세요:

  1. --set gitlab.migrations.enabled=false

번들된 PostgreSQL의 데이터베이스 마이그레이션은 나중에 수행할 것입니다.

데이터베이스 복원

다음 사항을 유의하세요:

  • 스크립트를 성공적으로 실행하려면 Bash 4.0 이상 버전이 필요합니다. 왜냐하면 bash associative arrays를 사용하기 때문입니다.
  1. Toolbox pod의 업그레이드가 완료될 때까지 기다리십시오. helm list로부터 GitLab 릴리스 이름을 사용할 것입니다.

    kubectl rollout status -w deployment/RELEASE_NAME-toolbox
    
  2. Toolbox pod가 성공적으로 배포된 후 다음 단계를 실행하세요:

    # GITLAB_RELEASE는 'v'로 시작하는 차트 버전을 나타냄: v6.0.0
    curl -s "https://gitlab.com/gitlab-org/charts/gitlab/-/raw/${GITLAB_RELEASE}/scripts/database-upgrade" | bash -s post
    

    이 단계는 다음을 수행합니다:

    1. webservice, sidekiq, 그리고 gitlab-exporter 배포의 레플리카를 0으로 설정합니다. 이는 백업을 복원하는 동안 데이터베이스를 변경하는 어떤 애플리케이션도 차단합니다.
    2. 백업에서 데이터베이스를 복원합니다.
    3. 새 버전에 대한 데이터베이스 마이그레이션을 실행합니다.
    4. 첫 번째 단계에서 배포를 재개합니다.

데이터베이스 업그레이드 과정 문제 해결

  • 업그레이드 중에 실패를 보신다면, 자세한 내용을 확인하기 위해 gitlab-upgrade-check 파드의 설명을 확인하는 것이 유용할 수 있습니다:

    kubectl get pods -lrelease=RELEASE,app=gitlab
    kubectl describe pod <gitlab-upgrade-check-pod-full-name>
    

기존 PostgreSQL 비밀번호 Secret 편집

note
이것은 7.0.0 업그레이드에만 해당되며, PostgreSQL 서비스 컨테이너 내부에서 비밀번호 파일 사용을 강제하고 싶을 때에만 해당됩니다.

새 버전의 PostgreSQL 차트는 Secrets에서 비밀번호를 참조하기 위해 다른 키를 사용합니다. postgresql-passwordpostgresql-postgres-password 대신 passwordpostgres-password를 사용합니다. 이러한 키는 값은 그대로 유지하면서(WITHOUT changing) RELEASE-postgresql-password Secret에서 바뀌어야 합니다.

이 Secret은 처음에 GitLab 차트에서 생성되며 업그레이드 중이던 후던 변하지 않습니다. 따라서 Secret를 편집하고 키를 변경해야 합니다.

Secret을 패치하는 데 도움을 줄 수 있는 다음 스크립트를 사용하세요:

  1. 먼저 기존 Secret의 백업을 만드세요. 다음 명령은 새로운 Secret에 -backup 이름 접미어를 붙여 복사합니다:

    kubectl get secrets ${RELEASE}-postgresql-password -o yaml | sed 's/name: \(.*\)$/name: \1-backup/' | kubectl apply -f -
    
  2. 패치가 올바른지 확인하세요:

    kubectl get secret ${RELEASE}-postgresql-password \
      -o go-template='{"data":{"password":"{{index .data "postgresql-password"}}","postgres-password":"{{index .data "postgresql-postgres-password"}}","postgresql-password":null,"postgresql-postgres-password":null}}'
    
  3. 그런 다음 적용하세요:

    kubectl patch secret ${RELEASE}-postgresql-password --patch "$(
      kubectl get secret ${RELEASE}-postgresql-password \
        -o go-template='{"data":{"password":"{{index .data "postgresql-password"}}","postgres-password":"{{index .data "postgresql-postgres-password"}}","postgresql-password":null,"postgresql-postgres-password":null}}')"