Auto DevOps를 위한 PostgreSQL 업그레이드
POSTGRES_ENABLED
가 true
일 때, Auto DevOps는 애플리케이션을 위해 클러스터 내 PostgreSQL 데이터베이스를 제공합니다.
PostgreSQL을 프로비저닝하는 데 사용된 차트의 버전:
- 0.7.1부터 8.2.1까지 설정할 수 있습니다.
GitLab은 사용자들에게 데이터베이스를 최신의 PostgreSQL 차트로 마이그레이션하도록 권장합니다.
이 안내서는 PostgreSQL 데이터베이스를 마이그레이션하는 방법에 대한 지침을 제공합니다. 이는 다음을 포함합니다:
- 데이터베이스 덤프를 가져오기.
- 새로운 PostgreSQL 데이터베이스를 설치하고 이전 버전의 차트를 제거합니다. (버전 8.2.1 사용)
- 새로운 PostgreSQL에 데이터베이스 덤프를 복원하기.
사전 요구 사항
-
kubectl
설치. -
kubectl
을 사용하여 Kubernetes 클러스터에 액세스할 수 있는지 확인합니다. 이는 Kubernetes 공급 업체에 따라 다릅니다. - 다운타임을 준비하십시오. 아래 단계에는 데이터베이스 덤프를 생성한 후 클러스터 내 데이터베이스가 수정되지 않도록 애플리케이션을 오프라인으로 전환하는 것이 포함됩니다.
-
POSTGRES_ENABLED
가false
로 설정되지 않았는지 확인하십시오. 이 설정은 기존 채널 1 데이터베이스를 삭제합니다. 자세한 내용은 기존 PostgreSQL 데이터베이스 감지를 참조하십시오.
애플리케이션 오프라인 전환
필요한 경우, 애플리케이션을 오프라인으로 전환하여 데이터베이스 덤프가 생성된 후 데이터베이스가 수정되지 않도록 합니다.
-
환경에 대한 Kubernetes 네임스페이스를 가져옵니다. 일반적으로
<프로젝트-이름>-<프로젝트-id>-<환경>
와 같은 모습입니다. 우리 예시에서 네임스페이스는minimal-ruby-app-4349298-production
으로 불립니다.$ kubectl get ns 이름 상태 연령 minimal-ruby-app-4349298-production Active 7d14h
-
사용 편의를 위해 네임스페이스 이름을 내보냅니다:
export APP_NAMESPACE=minimal-ruby-app-4349298-production
-
애플리케이션의 배포명을 다음 명령어로 가져옵니다. 우리 예시에서 배포명은
production
입니다.$ kubectl get deployment --namespace "$APP_NAMESPACE" 이름 준비 업데이트된 것 사용가능한 것 연령 production 2/2 2 2 7d21h production-postgres 1/1 1 1 7d21h
-
데이터베이스가 수정되지 않도록 하기 위해 다음 명령어로 배포의 레플리카를 0으로 설정합니다. 이전 단계에서 배포명을 사용합니다 (
deployments/<배포-이름>
).$ kubectl scale --replicas=0 deployments/production --namespace "$APP_NAMESPACE" deployment.extensions/production scaled
-
워커에 대해서도 레플리카를 0으로 설정해야 합니다.
백업
-
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
-
PostgreSQL에 대한 파드 이름을 다음 명령어로 가져옵니다. 우리 예시에서 파드 이름은
production-postgres-5db86568d7-qxlxv
입니다.$ kubectl get pod --namespace "$APP_NAMESPACE" -l app=production-postgres 이름 준비 상태 다시 시작 연령 production-postgres-5db86568d7-qxlxv 1/1 Running 0 7d14h
-
다음 명령어로 파드에 연결합니다:
kubectl exec -it production-postgres-5db86568d7-qxlxv --namespace "$APP_NAMESPACE" -- bash
-
연결되면 다음 명령어로 덤프 파일을 생성합니다.
-
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
-
-
백업 덤프가 완료되면
Control-D
또는exit
로 Kubernetes exec 프로세스를 종료합니다. -
다음 명령어로 백업 덤프 파일을 다운로드합니다:
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-42010a8e0096
과 pvc-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
변수를 특정 환경에 대해 스코프 지정할 수 있습니다. 예를 들어, 스테이징
입니다.
-
AUTO_DEVOPS_POSTGRES_CHANNEL
을2
로 설정합니다. 이렇게 하면 더 최신의 8.2.1 기반 PostgreSQL을 사용하며, 이전의 0.7.1 기반 PostgreSQL이 제거됩니다. -
AUTO_DEVOPS_POSTGRES_DELETE_V1
을 비어 있지 않은 값으로 설정합니다. 이 플래그는 데이터베이스 실수로 삭제되는 것을 방지하는 안전장치입니다. -
POSTGRES_VERSION
이 설정된 경우,9.6.16
또는 이후로 설정되었는지 확인합니다. 이는 Auto DevOps에서 지원하는 최소 PostgreSQL 버전입니다. 또한 사용 가능한 태그 목록을 참조하세요. -
PRODUCTION_REPLICAS
를0
으로 설정합니다. 다른 환경에서는 환경 범위를 사용하여REPLICAS
를 사용하세요. -
DB_INITIALIZE
또는DB_MIGRATE
변수를 설정한 경우, 변수를 제거하거나 변수 이름을 일시적으로XDB_INITIALIZE
또는XDB_MIGRATE
로 변경하여 비활성화하세요. - 브랜치에 대해 새 CI 파이프라인을 실행합니다. 이 경우
main
에 대해 새 CI 파이프라인을 실행합니다. - 파이프라인이 성공한 후, 새로운 PostgreSQL이 설치된 상태에서 애플리케이션이 업그레이드됩니다. 이 시점에는 복제본이 없으므로 애플리케이션에 대한 트래픽이 제공되지 않습니다 (새 데이터가 들어오는 것을 방지하기 위해).
복원
-
새 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
-
백업 단계에서 덤프 파일을 pod로 복사합니다:
kubectl cp --namespace "$APP_NAMESPACE" backup.sql production-postgresql-0:/tmp/backup.sql
-
pod에 연결합니다:
kubectl exec -it production-postgresql-0 --namespace "$APP_NAMESPACE" -- bash
-
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
- 데이터베이스 암호를 묻는 경우, 기본값은
-
복원이 완료된 후 데이터가 올바르게 복원되었는지 확인할 수 있습니다.
psql
을 사용하여 데이터의 특정 부분을 확인할 수 있습니다.
애플리케이션 복구
데이터베이스가 복원되었다고 확인된 경우, 다음 단계를 실행하여 애플리케이션을 복구합니다:
- 이전에 제거하거나 비활성화했던
DB_INITIALIZE
및DB_MIGRATE
변수를 복원합니다. -
PRODUCTION_REPLICAS
또는REPLICAS
변수를 원래 값으로 복원합니다. - 브랜치에 대해 새 CI 파이프라인을 실행합니다. 이 경우
main
에 대해 새 CI 파이프라인을 실행합니다. 파이프라인이 성공한 후, 애플리케이션이 이전과 같이 트래픽을 제공해야 합니다.