PostgreSQL 업그레이드 자동 DevOps

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

POSTGRES_ENABLEDtrue일 때, Auto DevOps는 애플리케이션을 위한
in-cluster PostgreSQL 데이터베이스를 제공합니다.

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

  • 0.7.1에서 8.2.1로 설정할 수 있습니다.

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

이 가이드는 PostgreSQL 데이터베이스를 마이그레이션하는 방법에 대한 지침을 제공합니다.
여기에는 다음이 포함됩니다:

  1. 데이터의 데이터베이스 덤프를 수행합니다.
  2. 최신 버전 8.2.1의 차트를 사용하여 새로운 PostgreSQL 데이터베이스를 설치하고
    이전 PostgreSQL 설치를 제거합니다.
  3. 새로운 PostgreSQL에 데이터베이스 덤프를 복원합니다.

전제 조건

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

애플리케이션을 오프라인으로 전환하기

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

  1. 환경에 대한 Kubernetes 네임스페이스를 가져옵니다. 일반적으로 <project-name>-<project-id>-<environment> 형식입니다.
    예시에서는 네임스페이스가 minimal-ruby-app-4349298-production이라고 합니다.

    $ kubectl get ns  
    
    NAME                                                  STATUS   AGE  
    minimal-ruby-app-4349298-production                   Active   7d14h  
    
  2. 사용의 편리성을 위해 네임스페이스 이름을 내보냅니다:

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

    $ kubectl get deployment --namespace "$APP_NAMESPACE"  
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE  
    production            2/2     2            2           7d21h  
    production-postgres   1/1     1            1           7d21h  
    
  4. 데이터베이스가 수정되지 않도록 하기 위해, 이전 단계에서 사용한 배포 이름(deployments/<DEPLOYMENT_NAME>)으로 배포의 복제본을 0으로 설정합니다.

    $ 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"  
    NAME                     TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE  
    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  
    NAME                                   READY   STATUS    RESTARTS   AGE  
    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의 기본 데이터를 저장하는 데 사용되는 지속적인 볼륨은 볼륨을 사용하는 포드와 포드 클레임이 삭제될 때 Delete로 표시됩니다.

이는 새로운 8.2.1 PostgreSQL을 선택하면 이전 0.7.1 PostgreSQL이 삭제되어 지속적인 볼륨도 삭제된다는 점에서 중요합니다.

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

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                     STORAGECLASS   REASON   AGE
pvc-0da80c08-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Delete           Bound    minimal-ruby-app-4349298-staging/staging-postgres         standard                7d22h
pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Delete           Bound    minimal-ruby-app-4349298-production/production-postgres   standard                7d22h

구버전 0.7.1 PostgreSQL이 삭제되더라도 지속적인 볼륨을 유지하려면 보존 정책을 Retain으로 변경해야 합니다. 이 예제에서 우리는 클레임 이름을 살펴보며 지속적인 볼륨 이름을 찾습니다. 우리는 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
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                     STORAGECLASS   REASON   AGE
pvc-0da80c08-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Retain           Bound    minimal-ruby-app-4349298-staging/staging-postgres         standard                7d22h
pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Retain           Bound    minimal-ruby-app-4349298-production/production-postgres   standard                7d22h

새로운 PostgreSQL 설치

caution
새로운 버전의 PostgreSQL을 사용하면
구버전 0.7.1 PostgreSQL이 삭제됩니다. 기본 데이터를 삭제하지 않으려면 지속적 볼륨을 유지하도록 선택할 수 있습니다.
note
또한 AUTO_DEVOPS_POSTGRES_CHANNEL, AUTO_DEVOPS_POSTGRES_DELETE_V1
POSTGRES_VERSION 변수를 특정 환경에 맞게 범위 지정할 수 있습니다. 예를 들어, staging입니다.
  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에 대한 포드 이름을 가져옵니다.
    우리의 예에서는 포드 이름이 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. 백업 단계에서 덤프 파일을 포드로 복사합니다:

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

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

    • 데이터베이스 비밀번호를 요청받으면 기본값은 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 파이프라인을 실행합니다. 파이프라인이 성공하면, 애플리케이션은 이전처럼 트래픽을 처리해야 합니다.