Auto DevOps를 위한 PostgreSQL 업그레이드

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab 전용

POSTGRES_ENABLEDtrue 일 때, Auto DevOps는 애플리케이션을 위해 클러스터 내 PostgreSQL 데이터베이스를 제공합니다.

PostgreSQL을 프로비저닝하는 데 사용된 차트의 버전:

  • 0.7.1부터 8.2.1까지 설정할 수 있습니다.

GitLab은 사용자들에게 데이터베이스를 최신의 PostgreSQL 차트로 마이그레이션하도록 권장합니다.

이 안내서는 PostgreSQL 데이터베이스를 마이그레이션하는 방법에 대한 지침을 제공합니다. 이는 다음을 포함합니다:

  1. 데이터베이스 덤프를 가져오기.
  2. 새로운 PostgreSQL 데이터베이스를 설치하고 이전 버전의 차트를 제거합니다. (버전 8.2.1 사용)
  3. 새로운 PostgreSQL에 데이터베이스 덤프를 복원하기.

사전 요구 사항

  1. kubectl 설치.
  2. kubectl을 사용하여 Kubernetes 클러스터에 액세스할 수 있는지 확인합니다. 이는 Kubernetes 공급 업체에 따라 다릅니다.
  3. 다운타임을 준비하십시오. 아래 단계에는 데이터베이스 덤프를 생성한 후 클러스터 내 데이터베이스가 수정되지 않도록 애플리케이션을 오프라인으로 전환하는 것이 포함됩니다.
  4. POSTGRES_ENABLEDfalse로 설정되지 않았는지 확인하십시오. 이 설정은 기존 채널 1 데이터베이스를 삭제합니다. 자세한 내용은 기존 PostgreSQL 데이터베이스 감지를 참조하십시오.
note
자동 DevOps를 스테이징으로 구성한 경우, 스테이징에서 백업 및 복원 단계를 먼저 시도하거나 리뷰 앱에서 시도해보십시오.

애플리케이션 오프라인 전환

필요한 경우, 애플리케이션을 오프라인으로 전환하여 데이터베이스 덤프가 생성된 후 데이터베이스가 수정되지 않도록 합니다.

  1. 환경에 대한 Kubernetes 네임스페이스를 가져옵니다. 일반적으로 <프로젝트-이름>-<프로젝트-id>-<환경>와 같은 모습입니다. 우리 예시에서 네임스페이스는 minimal-ruby-app-4349298-production으로 불립니다.

    $ kubectl get ns
    
    이름                                                  상태     연령
    minimal-ruby-app-4349298-production                   Active   7d14h
    
  2. 사용 편의를 위해 네임스페이스 이름을 내보냅니다:

    export APP_NAMESPACE=minimal-ruby-app-4349298-production
    
  3. 애플리케이션의 배포명을 다음 명령어로 가져옵니다. 우리 예시에서 배포명은 production입니다.

    $ kubectl get deployment --namespace "$APP_NAMESPACE"
    이름                  준비    업데이트된 것   사용가능한 것   연령
    production            2/2     2            2           7d21h
    production-postgres   1/1     1            1           7d21h
    
  4. 데이터베이스가 수정되지 않도록 하기 위해 다음 명령어로 배포의 레플리카를 0으로 설정합니다. 이전 단계에서 배포명을 사용합니다 (deployments/<배포-이름>).

    $ kubectl scale --replicas=0 deployments/production --namespace "$APP_NAMESPACE"
    deployment.extensions/production scaled
    
  5. 워커에 대해서도 레플리카를 0으로 설정해야 합니다.

백업

  1. PostgreSQL에 대한 서비스 이름을 가져옵니다. 서비스 이름은 일반적으로 -postgres로 끝납니다. 우리 예시에서 서비스 이름은 production-postgres입니다.

    $ kubectl get svc --namespace "$APP_NAMESPACE"
    이름                     유형        클러스터-IP    외부-IP   포트()    연령
    production-auto-deploy   ClusterIP   10.30.13.90   <none>        5000/TCP   7d14h
    production-postgres      ClusterIP   10.30.4.57    <none>        5432/TCP   7d14h
    
  2. PostgreSQL에 대한 파드 이름을 다음 명령어로 가져옵니다. 우리 예시에서 파드 이름은 production-postgres-5db86568d7-qxlxv입니다.

    $ kubectl get pod --namespace "$APP_NAMESPACE" -l app=production-postgres
    이름                                   준비   상태    다시 시작   연령
    production-postgres-5db86568d7-qxlxv   1/1     Running   0          7d14h
    
  3. 다음 명령어로 파드에 연결합니다:

    kubectl exec -it production-postgres-5db86568d7-qxlxv --namespace "$APP_NAMESPACE" -- bash
    
  4. 연결되면 다음 명령어로 덤프 파일을 생성합니다.

    • SERVICE_NAME은 이전 단계에서 얻은 서비스 이름입니다.
    • USERNAME은 PostgreSQL용으로 구성한 사용자명입니다. 기본값은 user입니다.
    • DATABASE_NAME은 보통 환경 이름입니다.

    • 데이터베이스 암호를 요청 받으면 기본값은 testing-password입니다.

      ## 형식:
      # pg_dump -h SERVICE_NAME -U USERNAME DATABASE_NAME > /tmp/backup.sql
      
      pg_dump -h production-postgres -U user production > /tmp/backup.sql
      
  5. 백업 덤프가 완료되면 Control-D 또는 exit로 Kubernetes exec 프로세스를 종료합니다.

  6. 다음 명령어로 백업 덤프 파일을 다운로드합니다:

    kubectl cp --namespace "$APP_NAMESPACE" production-postgres-5db86568d7-qxlxv:/tmp/backup.sql backup.sql
    

지속적인 볼륨 유지

기본적으로 PostgreSQL의 기본 데이터를 저장하는 지속적 볼륨은 볼륨을 사용하는 팟 및 팟 클레임이 삭제될 때 삭제로 표시됩니다.

이것은 8.2.1 PostgreSQL을 선택하면 이전 0.7.1 PostgreSQL이 삭제되어 지속적인 볼륨도 삭제된다는 것입니다.

다음 명령어를 사용하여 확인할 수 있습니다:

$ kubectl get pv
이름                                       용량   액세스 모드   재클레임 정책   상태   클레임                                                     스토리지클래스   사유   연령
pvc-0da80c08-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            지우기           Bound    minimal-ruby-app-4349298-staging/staging-postgres         standard                7d22h
pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            지우기           Bound    minimal-ruby-app-4349298-production/production-postgres   standard                7d22h

0.7.1 PostgreSQL이 삭제되어도 지속적인 볼륨을 유지하기 위해 재클레임 정책을 유지로 변경할 수 있습니다. 이 예시에서는 클레임 이름을 살펴본다. minimal-ruby-app-4349298 애플리케이션의 스테이징 및 프로덕션용 볼륨을 유지하기 원합니다. 여기서 볼륨 이름은 pvc-0da80c08-5239-11ea-9c8d-42010a8e0096pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096입니다:

$ kubectl patch pv  pvc-0da80c08-5239-11ea-9c8d-42010a8e0096 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
persistentvolume/pvc-0da80c08-5239-11ea-9c8d-42010a8e0096 patched
$ kubectl patch pv  pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
persistentvolume/pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096 patched
$ kubectl get pv
이름                                       용량   액세스 모드   재클레임 정책   상태   클레임                                                     스토리지클래스   사유   연령
pvc-0da80c08-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            유지           Bound    minimal-ruby-app-4349298-staging/staging-postgres         standard                7d22h
pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            유지           Bound    minimal-ruby-app-4349298-production/production-postgres   standard                7d22h

새로운 PostgreSQL 설치

경고: 새 버전의 PostgreSQL을 사용하면 이전 버전인 0.7.1 PostgreSQL이 삭제됩니다. 기존 데이터가 삭제되지 않도록 하려면 영구 볼륨을 유지하도록 선택할 수 있습니다.

참고: 또한 AUTO_DEVOPS_POSTGRES_CHANNEL, AUTO_DEVOPS_POSTGRES_DELETE_V1, POSTGRES_VERSION 변수를 특정 환경에 대해 스코프 지정할 수 있습니다. 예를 들어, 스테이징입니다.

  1. AUTO_DEVOPS_POSTGRES_CHANNEL2로 설정합니다. 이렇게 하면 더 최신의 8.2.1 기반 PostgreSQL을 사용하며, 이전의 0.7.1 기반 PostgreSQL이 제거됩니다.
  2. AUTO_DEVOPS_POSTGRES_DELETE_V1을 비어 있지 않은 값으로 설정합니다. 이 플래그는 데이터베이스 실수로 삭제되는 것을 방지하는 안전장치입니다.
  3. POSTGRES_VERSION이 설정된 경우, 9.6.16 또는 이후로 설정되었는지 확인합니다. 이는 Auto DevOps에서 지원하는 최소 PostgreSQL 버전입니다. 또한 사용 가능한 태그 목록을 참조하세요.
  4. PRODUCTION_REPLICAS0으로 설정합니다. 다른 환경에서는 환경 범위를 사용하여 REPLICAS를 사용하세요.
  5. DB_INITIALIZE 또는 DB_MIGRATE 변수를 설정한 경우, 변수를 제거하거나 변수 이름을 일시적으로 XDB_INITIALIZE 또는 XDB_MIGRATE로 변경하여 비활성화하세요.
  6. 브랜치에 대해 새 CI 파이프라인을 실행합니다. 이 경우 main에 대해 새 CI 파이프라인을 실행합니다.
  7. 파이프라인이 성공한 후, 새로운 PostgreSQL이 설치된 상태에서 애플리케이션이 업그레이드됩니다. 이 시점에는 복제본이 없으므로 애플리케이션에 대한 트래픽이 제공되지 않습니다 (새 데이터가 들어오는 것을 방지하기 위해).

복원

  1. 새 PostgreSQL의 pod 이름을 가져옵니다. 예를 들어, pod 이름은 production-postgresql-0입니다:

    $ kubectl get pod --namespace "$APP_NAMESPACE" -l app=postgresql
    NAME                      READY   STATUS    RESTARTS   AGE
    production-postgresql-0   1/1     Running   0          19m
    
  2. 백업 단계에서 덤프 파일을 pod로 복사합니다:

    kubectl cp --namespace "$APP_NAMESPACE" backup.sql production-postgresql-0:/tmp/backup.sql
    
  3. pod에 연결합니다:

    kubectl exec -it production-postgresql-0 --namespace "$APP_NAMESPACE" -- bash
    
  4. pod에 연결한 후, 다음 명령을 실행하여 데이터베이스를 복원합니다.

    • 데이터베이스 암호를 묻는 경우, 기본값은 testing-password입니다.
    • USERNAME은 PostgreSQL에 구성한 사용자 이름입니다. 기본값은 user입니다.
    • DATABASE_NAME은 보통 환경 이름입니다.
    ## 형식은:
    # psql -U USERNAME -d DATABASE_NAME < /tmp/backup.sql
    
    psql -U user -d production < /tmp/backup.sql
    
  5. 복원이 완료된 후 데이터가 올바르게 복원되었는지 확인할 수 있습니다. psql을 사용하여 데이터의 특정 부분을 확인할 수 있습니다.

애플리케이션 복구

데이터베이스가 복원되었다고 확인된 경우, 다음 단계를 실행하여 애플리케이션을 복구합니다:

  1. 이전에 제거하거나 비활성화했던 DB_INITIALIZEDB_MIGRATE 변수를 복원합니다.
  2. PRODUCTION_REPLICAS 또는 REPLICAS 변수를 원래 값으로 복원합니다.
  3. 브랜치에 대해 새 CI 파이프라인을 실행합니다. 이 경우 main에 대해 새 CI 파이프라인을 실행합니다. 파이프라인이 성공한 후, 애플리케이션이 이전과 같이 트래픽을 제공해야 합니다.