markdown # 번들 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 비밀번호 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를 실행하거나 kubectx에서 사용하십시오.

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

# 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 연상 배열을 사용하기 때문입니다.
  1. 업그레이드가 Toolbox pod에 대해 완료될 때까지 기다립니다. RELEASE_NAMEhelm list에서 GitLab 릴리스의 이름이어야 합니다.

    kubectl rollout status -w deployment/RELEASE_NAME-toolbox
    
  2. Toolbox pod가 성공적으로 배포된 후, post 단계를 실행하십시오:

    # 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 pod의 설명에서 확인할 수도 있습니다:

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

## 기존 PostgreSQL 비밀번호 Secret 편집

참고:
이것은 `7.0.0` 업그레이드 전용이며, PostgreSQL 서비스 컨테이너 내에서 비밀번호 파일 사용을 강제로 지정하려는 경우에만 해당됩니다.

새 버전의 [PostgreSQL 차트](https://github.com/bitnami/charts/tree/master/bitnami/postgresql)는 Secrets에서 비밀번호를 참조하는 데 다른 키를 사용합니다. 이제 `postgresql-password``postgresql-postgres-password` 대신에 `password``postgres-password`를 사용합니다. 이러한 키는 `RELEASE-postgresql-password` Secret에서 변경해야 합니다. 그러나 값은 변경하면 안 됩니다.

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

Secret을 편집한 후 _반드시_ **Helm 업그레이드 값에서 `postgresql.auth.usePasswordFiles`를 `true`로 설정해야** 합니다. 기본값은 `false`입니다.

다음 스크립트는 Secret을 패치하는 데 도움이 될 수 있습니다:

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

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

    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}}'
    
  2. 그런 다음 적용합니다:

    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}}')"