번들된 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로 업그레이드한 것입니다.

이는 동일한 대체가 아닙니다. 데이터베이스를 업그레이드하려면 수동 단계를 수행해야 합니다. 업그레이드 단계는 업그레이드 단계에서 문서화되어 있습니다.

note
이 차트의 5.0.0 릴리스의 일환으로, 번들된 PostgreSQL 버전을 11.9.0에서 12.7.0으로 업그레이드했습니다. 이것은 동일한 대체가 아닙니다. 데이터베이스를 업그레이드하려면 수동 단계를 수행해야 합니다. 업그레이드 단계는 업그레이드 단계에서 문서화되어 있습니다.
note
이 차트의 4.0.0 릴리스의 일환으로, 번들된 PostgreSQL 차트7.7.0에서 8.9.4로 업그레이드했습니다. 이는 동일한 대체가 아닙니다. 데이터베이스를 업그레이드하려면 수동 단계를 수행해야 합니다. 업그레이드 단계는 업그레이드 단계에서 문서화되어 있습니다.

번들된 PostgreSQL 업그레이드 단계

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

이것은 상위 PostgreSQL 차트의 문제 때문입니다. PostgreSQL 비밀번호에 환경 변수를 사용하고 싶지 않거나 파일을 사용하려면 PostgreSQL 차트에 대한 패스워드 파일을 활성화하고 이어서 다음 단계를 수행해야 합니다. 수동으로 기존 PostgreSQL 비밀 번호 Secret 편집 및 PostgreSQL 차트의 비밀번호 파일을 사용하도록 설정하는 지침을 따르세요.

기존 데이터베이스 준비

다음을 주의하세요:

  • 번들된 PostgreSQL 차트를 사용하고 있지 않은 경우(postgresql.install이 false인 경우), 이 단계를 따를 필요가 없습니다.
  • 같은 네임스페이스에 설치된 차트가 여러 개인 경우 데이터베이스 업그레이드 스크립트에 Helm 릴리스 이름을 전달해야 할 수 있습니다. 예제명령어의 bash -s STAGEbash -s -- -r RELEASE STAGE로 바꿔야 합니다.
  • kubectl 컨텍스트의 기본이 아닌 네임스페이스에 차트를 설치한 경우 데이터베이스 업그레이드 스크립트에 네임스페이스를 전달해야 합니다. 예제명령어의 bash -s STAGEbash -s -- -n NAMESPACE STAGE로 바꿔야 합니다. 이 옵션은 -r RELEASE와 함께 사용할 수 있습니다. 컨텍스트의 기본 네임스페이스는 kubectl config set-context --current --namespace=NAMESPACE로 설정하거나 kubectxkubens를 사용하세요.

pre 단계는 툴박스의 백업 유틸리티 스크립트를 사용하여 데이터베이스의 백업을 생성한 다음 구성된 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은 다음 단계에서 다시 생성됩니다.

경고: 이전 단계에서 데이터베이스를 백업했는지 확인하세요. 백업이 없으면 GitLab 데이터가 손실될 수 있습니다.

kubectl delete statefulset RELEASE-NAME-postgresql
kubectl delete pvc data-RELEASE_NAME-postgresql-0

GitLab 업그레이드

다음 추가 사항을 사용하여 GitLab을 업그레이드하세요: 기본 절차를 따라 GitLab을 업그레이드하되 다음과 같은 추가 조치를 취하세요:

마이그레이션을 비활성화하고 다음과 같은 플래그를 사용하여 데이터베이스 마이그레이션을 나중에 수행하세요:

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

데이터베이스 복원

다음 사항을 참고하세요:

  • bash 연상 배열을 사용하기 때문에 스크립트를 성공적으로 실행하려면 Bash 4.0 이상을 사용해아합니다.
  1. Toolbox 팟의 업그레이드를 완료할 때까지 기다립니다. RELEASE_NAME은 helm list에서 GitLab 릴리스의 이름이어야 합니다.

    kubectl rollout status -w deployment/RELEASE_NAME-toolbox
    
  2. Toolbox 팟이 성공적으로 배포된 후에 다음 단계를 실행합니다:

    # 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 암호 시크릿 편집

참고: 이 작업은 7.0.0 업그레이드를 위한 것이며 PostgreSQL 서비스 컨테이너 내에서 암호 파일을 강제로 사용하려는 경우에만 해당합니다.

새 버전의 PostgreSQL 차트는 Secrets에서 암호를 참조하는 데 다른 키를 사용합니다. 이제 postgresql-passwordpostgresql-postgres-password 대신에 passwordpostgres-password를 사용합니다. 이러한 키는 값을 변경하지 않고 RELEASE-postgresql-password 시크릿에서 변경해야 합니다.

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

시크릿을 편집한 후 반드시 Helm 업그레이드 값에서 postgresql.auth.usePasswordFilestrue로 설정해야 합니다. 기본값은 false입니다.

다음 스크립트를 사용하여 시크릿을 패치하는 데 도움을 받을 수 있습니다:

  1. 먼저 기존 시크릿을 백업합니다. 다음 명령은 새로운 시크릿에 -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}}')"