GKE에서 실행되는 Django 앱은 트래픽에 따라 동적으로 확장됩니다.
이 튜토리얼에서는 사용자가 Django 웹 개발에 익숙하다고 가정합니다. Django 개발이 처음이면 계속하기 전에 첫 번째 Django 앱 작성 연습을 진행하는 것이 좋습니다.
이 가이드에서는 Django를 구체적으로 보여주지만 이 배포 프로세스를 Wagtail 및 Django CMS와 같은 다른 Django 기반 프레임워크와 함께 사용할 수 있습니다.
Docker도 설치되어 있어야 합니다.
목표
이 튜토리얼에서는 다음 단계를 진행합니다.
- Cloud SQL 데이터베이스를 만들고 연결합니다.
- Kubernetes 보안 비밀 값을 만들고 사용합니다.
- Django 앱을 Google Kubernetes Engine에 배포합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud SQL, GKE and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud SQL, GKE and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
개발 환경 준비
샘플 앱 클론
Django 샘플 앱용 코드는 GitHub의 GoogleCloudPlatform/python-docs-samples 저장소에 있습니다.
ZIP 파일로 샘플을 다운로드하고 이를 추출하거나 저장소를 로컬 머신에 클론할 수 있습니다.
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
샘플 코드가 있는 디렉터리로 이동합니다.
Linux/macOS
cd python-docs-samples/kubernetes_engine/django_tutorial
Windows
cd python-docs-samples\kubernetes_engine\django_tutorial
Python 설정 확인
이 튜토리얼에서는 Python을 사용하여 머신에서 샘플 애플리케이션을 실행합니다. 샘플 코드에는 종속 항목 설치도 필요합니다.
자세한 내용은 Python 개발 환경 가이드를 참조하세요.
Python 버전이 3.7 이상인지 확인합니다.
python -V
Python 3.7.3
이상이 표시되어야 합니다.Python 가상 환경을 만들고 종속 항목을 설치합니다.
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
python -m venv env venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
Cloud SQL 인증 프록시를 다운로드하여 로컬 머신에서 Cloud SQL에 연결
배포된 앱은 Google Kubernetes Engine 환경에 내장된 Cloud SQL 인증 프록시를 사용하여 Cloud SQL 인스턴스와 통신합니다. 하지만 앱을 로컬에서 테스트하려면 프록시의 로컬 사본을 개발 환경에 설치하여 사용해야 합니다. 자세한 내용은 Cloud SQL 인증 프록시 가이드를 참조하세요.
Cloud SQL 인증 프록시는 Cloud SQL API를 사용하여 SQL 인스턴스와 상호작용합니다. 이렇게 하려면 gcloud를 통한 애플리케이션 인증이 필요합니다.
API에 대한 사용자 인증 정보를 인증하고 가져옵니다.
gcloud auth application-default login
Cloud SQL 인증 프록시를 다운로드하여 로컬 머신에 설치합니다.
Linux 64비트
- Cloud SQL 인증 프록시를 다운로드합니다.
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
- Cloud SQL 인증 프록시 실행 파일을 만듭니다.
chmod +x cloud_sql_proxy
Linux 32비트
- Cloud SQL 인증 프록시를 다운로드합니다.
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
wget
명령어를 찾을 수 없으면sudo apt-get install wget
을 실행하고 다운로드 명령어를 반복합니다.- Cloud SQL 인증 프록시 실행 파일을 만듭니다.
chmod +x cloud_sql_proxy
macOS 64비트
- Cloud SQL 인증 프록시를 다운로드합니다.
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
- Cloud SQL 인증 프록시 실행 파일을 만듭니다.
chmod +x cloud_sql_proxy
macOS 32비트
- Cloud SQL 인증 프록시를 다운로드합니다.
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
- Cloud SQL 인증 프록시 실행 파일을 만듭니다.
chmod +x cloud_sql_proxy
Mac M1
- Cloud SQL 인증 프록시를 다운로드합니다.
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.arm64
- Cloud SQL 인증 프록시 실행 파일을 만듭니다.
chmod +x cloud_sql_proxy
Windows 64비트
https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe를 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 링크 저장을 선택하여 Cloud SQL 인증 프록시를 다운로드합니다. 파일 이름을cloud_sql_proxy.exe
로 바꿉니다.Windows 32비트
https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe를 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 링크 저장을 선택하여 Cloud SQL 인증 프록시를 다운로드합니다. 파일 이름을cloud_sql_proxy.exe
로 바꿉니다.Cloud SQL 인증 프록시 Docker 이미지
편의를 위해 GitHub의 Cloud SQL 인증 프록시 저장소에 Cloud SQL 인증 프록시가 포함된 여러 컨테이너 이미지가 제공되고 있습니다. 다음 명령어로 Docker를 사용하여 최신 이미지를 로컬 머신으로 가져올 수 있습니다.docker pull gcr.io/cloudsql-docker/gce-proxy:1.30.1
기타 OS
여기에 포함되지 않은 다른 운영체제의 경우 소스에서 Cloud SQL 인증 프록시를 컴파일하면 됩니다.다운로드한 파일을
PATH
의 위치 또는 홈 디렉터리와 같이 일반적인 위치로 이동할 수 있습니다. 이 방법을 선택하는 경우 튜토리얼 뒷부분에서 Cloud SQL 인증 프록시를 시작하면cloud_sql_proxy
명령어를 사용할 때 선택한 위치를 참조해야 합니다.- Cloud SQL 인증 프록시를 다운로드합니다.
지원 서비스 만들기
이 튜토리얼에서는 여러 Google Cloud 서비스를 사용하여 배포된 Django 프로젝트를 지원하는 데이터베이스, 미디어 스토리지, 보안 비밀 스토리지를 제공합니다. 이러한 서비스는 특정 리전에 배포됩니다. 서비스 간 효율성을 높이려면 모든 서비스가 동일한 리전에 배포되어야 합니다. 가장 가까운 리전에 대한 자세한 내용은 리전별 제공 제품을 참조하세요.
PostgreSQL용 Cloud SQL 인스턴스 설정
Django는 여러 관계형 데이터베이스를 공식적으로 지원하지만 PostgreSQL을 가장 많이 지원합니다. PostgreSQL은 Cloud SQL에서 지원하므로 이 튜토리얼에서는 해당 유형의 데이터베이스를 사용합니다.
다음 섹션에서는 앱의 PostgreSQL 인스턴스, 데이터베이스 및 데이터베이스 사용자를 만드는 방법에 대해 설명합니다.
PostgreSQL 인스턴스를 만듭니다.
Console
Cloud Console에서 Cloud SQL 인스턴스 페이지로 이동합니다.
인스턴스 만들기를 클릭합니다.
PostgreSQL을 클릭합니다.
인스턴스 ID 필드에
INSTANCE_NAME
을 입력합니다.postgres 사용자의 비밀번호를 입력합니다.
다른 필드에는 기본값을 사용합니다.
만들기를 클릭합니다.
인스턴스를 만들고 사용할 수 있도록 준비하는 데 몇 분 정도 소요됩니다.
gcloud
PostgreSQL 인스턴스를 만듭니다.
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --region REGION
다음을 바꿉니다.
INSTANCE_NAME
: Cloud SQL 인스턴스 이름PROJECT_ID
: Google Cloud 프로젝트 IDREGION
: Google Cloud 리전
인스턴스를 만들고 사용할 수 있도록 준비하는 데 몇 분 정도 소요됩니다.
생성된 인스턴스 내에서 데이터베이스를 생성합니다.
Console
- 인스턴스 페이지에서 데이터베이스 탭으로 이동합니다.
- 데이터베이스 만들기를 클릭합니다.
- 데이터베이스 이름 대화상자에
DATABASE_NAME
을 입력합니다. - 만들기를 클릭합니다.
gcloud
최근에 만든 인스턴스 내에 데이터베이스를 만듭니다.
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
DATABASE_NAME
을 인스턴스 내부의 데이터베이스 이름으로 바꿉니다.
데이터베이스 사용자를 만듭니다.
Console
- 인스턴스 페이지에서 사용자 탭으로 이동합니다.
- 사용자 계정 추가를 클릭합니다.
- '기본 제공 인증' 아래 인스턴스에 사용자 계정 추가 대화상자에서 다음을 수행합니다.
- 사용자 이름
DATABASE_USERNAME
을 입력합니다. - 비밀번호
DATABASE_PASSWORD
를 입력합니다. - 추가를 클릭합니다.
gcloud
최근에 만든 인스턴스 내에 사용자를 만듭니다.
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
PASSWORD
를 안전한 비밀번호로 바꿉니다.
서비스 계정 만들기
프록시를 사용하려면 Cloud SQL 인스턴스에 대한 편집자 권한을 가진 서비스 계정이 필요합니다. 서비스 계정에 대한 자세한 내용은 Google Cloud 인증 개요를 참조하세요.
- Cloud Console에서 서비스 계정 페이지로 이동합니다.
- Cloud SQL 인스턴스가 포함된 프로젝트를 선택합니다.
- 서비스 계정 만들기를 클릭합니다.
- 서비스 계정 이름 필드에 서비스 계정의 설명이 포함된 이름을 입력합니다.
- 서비스 계정 ID를 고유하고 인식할 수 있는 값으로 변경한 후 만들고 계속하기를 클릭합니다.
-
역할 선택 필드를 클릭하고 다음 역할 중 하나를 선택합니다.
- Cloud SQL > Cloud SQL 클라이언트
- Cloud SQL > Cloud SQL 편집자
- Cloud SQL > Cloud SQL 관리자
- 완료를 클릭하여 서비스 계정 만들기를 마칩니다.
- 새 서비스 계정의 작업 메뉴를 클릭한 후 키 관리를 선택합니다.
- 키 추가 드롭다운 메뉴를 클릭한 후 새 키 만들기를 클릭합니다.
-
키 유형이 JSON인지 확인한 후 만들기를 클릭합니다.
비공개 키 파일이 머신에 다운로드됩니다. 파일을 다른 위치로 이동할 수 있습니다. 키 파일을 안전하게 보관하세요.
데이터베이스 설정 구성
다음 명령어를 사용하여 데이터베이스 액세스를 위한 환경 변수를 설정합니다. 이러한 환경 변수는 로컬 테스트에 사용됩니다.
Linux/MacOS
export DATABASE_NAME=DATABASE_NAME
export DATABASE_USER=DATABASE_USERNAME
export DATABASE_PASSWORD=DATABASE_PASSWORD
Windows
set DATABASE_USER=DATABASE_USERNAME
set DATABASE_PASSWORD=DATABASE_PASSWORD
GKE 구성 설정
이 애플리케이션은
polls
라는 단일 Kubernetes 구성으로 제공됩니다.polls.yaml
에서<your-project-id>
를 Google Cloud 프로젝트 ID(PROJECT_ID)로 바꿉니다.다음 명령어를 실행하고
connectionName
값을 기록합니다.gcloud sql instances describe INSTANCE_NAME --format "value(connectionName)"
polls.yaml
파일에서<your-cloudsql-connection-string>
을connectionName
값으로 바꿉니다.
로컬 컴퓨터에서 앱 실행
지원 서비스가 구성되었으면 이제 컴퓨터에서 앱을 실행할 수 있습니다. 이 설정을 사용하면 로컬 개발, 수퍼유저 만들기, 데이터베이스 마이그레이션 적용을 수행할 수 있습니다.
별도의 터미널에서 Cloud SQL 인증 프록시를 시작합니다.
Linux/macOS
./cloud_sql_proxy -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
Windows
cloud_sql_proxy.exe -instances="PROJECT_ID:REGION:INSTANCE_NAME"=tcp:5432
이 단계에서는 로컬 테스트를 위해 로컬 컴퓨터에서 Cloud SQL 인스턴스로 연결을 설정합니다. 앱을 로컬에서 테스트하는 동안 Cloud SQL 인증 프록시를 계속 실행합니다. 별도의 터미널에서 이 프로세스를 실행하면 프로세스가 실행되는 동안 작업을 계속할 수 있습니다.
새 터미널에서 프로젝트 ID를 로컬로 설정합니다.
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Django 마이그레이션을 실행하여 모델과 애셋을 설정합니다.
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
Django 웹 서버를 시작합니다.
python manage.py runserver
브라우저에서 http://localhost:8000으로 이동합니다.
페이지에 다음과 같은 텍스트가 표시됩니다.'Hello, world. 사용자는 설문조사 색인에 있습니다.' 컴퓨터에서 실행되는 Django 웹 서버는 샘플 앱 페이지를 전송합니다.
Ctrl
/Cmd
+C
를 눌러서 로컬 웹 서버를 중지합니다.
Django 관리 콘솔 사용
Django의 관리 콘솔에 로그인하려면 수퍼유저를 만들어야 합니다. 데이터베이스에 로컬로 액세스할 수 있으므로 관리 명령어를 실행할 수 있습니다.
수퍼유저를 만듭니다. 사용자 이름, 이메일, 비밀번호를 입력하라는 메시지가 표시됩니다.
python manage.py createsuperuser
로컬 웹 서버를 시작합니다.
python manage.py runserver
브라우저에서 http://localhost:8000/admin으로 이동합니다.
createsuperuser
를 실행할 때 사용한 사용자 이름과 비밀번호를 사용하여 관리 사이트에 로그인합니다.
GKE에 앱 배포
앱이 Google Cloud에 배포되면 Gunicorn 서버가 사용됩니다. Gunicorn은 정적 콘텐츠를 제공하지 않기 때문에 앱은 Cloud Storage를 사용하여 정적 콘텐츠를 제공합니다.
정적 리소스 수집 및 업로드
Cloud Storage 버킷을 만들고 공개적으로 읽을 수 있도록 설정합니다.
gsutil mb gs://PROJECT_ID_MEDIA_BUCKET gsutil defacl set public-read gs://PROJECT_ID_MEDIA_BUCKET
모든 정적 콘텐츠를 폴더 하나로 로컬에 수집합니다.
python manage.py collectstatic
정적 콘텐츠를 Cloud Storage에 업로드합니다.
gsutil -m rsync -r ./static gs://PROJECT_ID_MEDIA_BUCKET/static
mysite/settings.py
에서STATIC_URL
값을 다음 URL로 설정하고 여기서[YOUR_GCS_BUCKET]
을 버킷 이름으로 바꿉니다.http://storage.googleapis.com/PROJECT_ID_MEDIA_BUCKET/static/
GKE 설정
GKE를 초기화하려면 클러스터 페이지로 이동합니다.
프로젝트에서 처음으로 GKE를 사용하는 경우 'Kubernetes Engine이 준비되고 있으며 1분 이상 걸릴 수 있습니다' 라는 메시지가 사라질 때까지 기다립니다.
-
gcloud container clusters create polls \ --scopes "https://www.googleapis.com/auth/userinfo.email","cloud-platform" \ --num-nodes 4 --zone "us-central1-a"
'Project [PROJECT_ID] 프로젝트가 기본 서비스 계정으로 완전히 초기화되지 않았습니다' 오류가 발생했나요?
GKE 초기화
오류가 발생하면 Google Cloud Console로 이동하여 프로젝트에서 GKE를 초기화합니다.
'Kubernetes Engine을 준비하는 중이며 1분 이상 걸릴 수 있습니다' 메시지가 사라질 때까지 기다립니다.
클러스터를 만든 후 gcloud와 통합된
kubectl
명령줄 도구를 사용하여 GKE 클러스터와 상호작용합니다.gcloud
와kubectl
는 별도의 도구이므로kubectl
가 올바른 클러스터와 상호작용하도록 구성되었는지 확인하세요.gcloud container clusters get-credentials polls --zone "us-central1-a"
Cloud SQL 설정
GKE 앱이 Cloud SQL 인스턴스와 연결할 수 있으려면 여러 개의 비밀번호가 필요합니다. 하나는 인스턴스 수준 액세스(연결)를 위해 필요하고 다른 2개는 데이터베이스 액세스용으로 필요합니다. 2가지 수준의 액세스 제어에 대한 자세한 내용은 인스턴스 액세스 제어를 참조하세요.
인스턴스 수준 액세스용으로 보안 비밀을 만들려면 서비스 계정을 만들 때 다운로드한 JSON 서비스 계정 키의 위치(
[PATH_TO_CREDENTIAL_FILE]
)를 제공합니다(서비스 만들기 계정참조).kubectl create secret generic cloudsql-oauth-credentials \ --from-file=credentials.json=[PATH_TO_CREDENTIAL_FILE]
데이터베이스 액세스용 보안 비밀을 만들려면 Cloud SQL 인스턴스 초기화의 2단계에서 정의된 SQL 데이터베이스, 사용자 이름, 비밀번호를 사용합니다.
kubectl create secret generic cloudsql \ --from-literal=database=DATABASE_NAME \ --from-literal=username=DATABASE_USERNAME \ --from-literal=password=DATABASE_PASSWORD
Cloud SQL 프록시용 Docker 공개 이미지를 검색합니다.
docker pull b.gcr.io/cloudsql-docker/gce-proxy
Docker 이미지를 빌드하고
<your-project-id>
를 프로젝트 ID로 바꿉니다.docker build -t gcr.io/PROJECT_ID/polls .
gcloud
를 사용자 인증 정보 도우미로 사용하도록 Docker를 구성하여 이미지를 Container Registry로 내보냅니다.gcloud auth configure-docker
Docker 이미지를 푸시합니다.
<your-project-id>
를 프로젝트 ID로 바꿉니다.docker push gcr.io/PROJECT_ID/polls
GKE 리소스를 만듭니다.
kubectl create -f polls.yaml
GKE에 앱 배포
리소스가 만들어진 후 클러스터에 3개의 polls
pod가 있어야 합니다.
pod의 상태를 확인하세요.
kubectl get pods
pod 상태가 Running
로 표시될 때까지 몇 분 정도 기다립니다. pod가 준비되지 않았거나 다시 시작되는 경우 특정 pod의 로그를 가져와서 문제를 파악할 수 있습니다. [YOUR-POD-ID]
는 이전 kubectl get pods
명령어에서 반환된 출력의 일부입니다.
kubectl logs [YOUR_POD_ID]
Google Cloud에서 실행되는 앱 보기
pod가 준비되면 부하 분산기의 공개 IP 주소를 가져올 수 있습니다.
kubectl get services polls
EXTERNAL-IP
주소를 기록하고 브라우저에서 http://[EXTERNAL-IP]
로 이동하여 Django 폴링 방문 페이지를 확인하고 관리 콘솔에 액세스합니다.
코드 이해하기
샘플 애플리케이션
Django 샘플 앱은 표준 Django 도구를 사용하여 생성되었습니다. 다음 명령어는 프로젝트와 설문조사 앱을 만듭니다.
django-admin startproject mysite
python manage.py startapp polls
기본 보기, 모델 및 경로 구성이 첫 번째 Django 앱 작성(1부 및2부 참조)에서 복사되었습니다.
데이터베이스 구성
settings.py
에는 SQL 데이터베이스의 구성이 포함되어 있습니다.
Kubernetes 포드 구성
polls.yaml
파일은 2개의 Kubernetes 리소스를 지정합니다. 첫 번째는 서비스로서 Django 웹 앱의 일관된 이름과 비공개 IP 주소를 정의합니다.
두 번째는 HTTP 부하 분산기로서 공개용 외부 IP 주소를 사용합니다.
이 서비스는 네트워크 이름과 IP 주소를 제공하고 GKE pod는 서비스 뒤의 앱 코드를 실행합니다.
polls.yaml
파일은 GKE pod의 선언적 업데이트를 제공하는 배포를 지정합니다. 이 서비스는 서비스 선택기를 배포 라벨과 일치시켜 트래픽을 배포로 보냅니다. 이 경우 선택기 polls
가 라벨 polls
와 일치합니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
개별 리소스 삭제
프로젝트를 삭제하지 않으려면 개별 리소스를 삭제합니다.
Google Kubernetes Engine 클러스터를 삭제합니다.
gcloud container clusters delete polls
Container Registry에 푸시한 Docker 이미지를 삭제합니다.
gcloud container images delete gcr.io/PROJECT_ID/polls
Cloud SQL 인스턴스를 삭제합니다.
gcloud sql instances delete INSTANCE_NAME
다음 단계
- 프로덕션용 PostgreSQL 구성 방법 알아보기
- Google Cloud의 Django에 대해 자세히 알아보기