Kubernetes Django Tutorial (Cloud SQL, Storage) - 1
Devops/Kubernetes

Kubernetes Django Tutorial (Cloud SQL, Storage) - 1

뉴비뉴 2020. 5. 11.

안녕하세요.

 

 

AWS 프리티어가 끝나면서 Kubernetes를 돌릴만한 곳이 필요했고, Local에서 Virtual Box나 minikube를 설치하여 실습을 해보려고 하였으나 메모리부족으로 설치하지못하고, GCP에 Kubernetes 튜토리얼을 발견하여 GCP를 이용하여 Kubernetes를 배포해보겠습니다. 

 

오늘은 구글의 Running Django on Google Kubernetes Engine를 참고하면서

Cloud SQL(RDS)와 Storage(S3) 연동까지 해보겠습니다.

최종으로는 GCP를 통해서 Kubernetes 배포까지 진행해보겠습니다.

 

해당 튜토리얼은 Django의 기초지식이 있다는 가정하에 진행되고 있습니다.

Docker가 설치되어있어야 되며, Python 3.4 이상의 버전을 사용해야 합니다.

 

중간 중간 설명이 빠져있는 부분은 상단의 링크를 참고하시면 되겠습니다.

 

 

시작하기 전에

1. GCP Project 생성

2. API 사용 설정

  • Cloud SQL 및 Compute Engine API를 사용

3. Cloud SDK 설치

  • Cloud SDK를 설치하고, gcloud init 명령어로 초기설정을 해줘야 합니다.

4. Django Tutorial Clone

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

cd python-docs-samples/kubernetes_engine/django_tutorial

5. 로컬 환경 설정

배포 된 앱은 App Engine 환경에 내장 된 Cloud SQL(RDS) 프록시를 사용하여 Cloud SQL 인스턴스와 통신합니다.

그러나 앱을 로컬에서 테스트하려면 개발 환경에서 프로식의 로컬 복사본을 설치하고 사용해야합니다.

 

Cloud SQL 프록시는 승인된 네트워크 또는 SSL 구성을 추가할 필요 없이 Cloud SQL 2세대 인스턴스에 보안 액세스를 제공합니다. 간단히 정리하면 보안 연결을 지원하고, 연결 관리를 간소화 해줍니다.

 

5-1. Cloud SQL Admin API 사용

Cloud SQL을 사용하기 전에 Cloud SQL Admin API를 활성화해야 합니다.

gcloud services enable sqladmin

 

5-2. Cloud SQL 프록시 설치

Cloud SQL 프록시를 사용하려면 설치가 필요합니다. 필자는 Window x64 사용자입니다.

다른 운영체제를 사용하신다면 링크를 클릭하여 참고하시기 바랍니다.

 

https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe

마우스 오른쪽 버튼으로 클릭 후 다른이름으로 링크 저장 을 선택하여 cloud_sql_proxy.exe로 변경합니다.

파일 경로를 기억하시기 바랍니다.

 

5-3. Cloud SQL 인스턴스 생성

링크로 접속하여 Cloud SQL(RDS)를 생성해주면 됩니다.

튜토리얼에서는 polls-instance 로 생성하라고하니 저도 똑같이 생성해보겠습니다.

Postgres DB를 평소에 자주 사용하여 저는 Postgres 로 생성하였습니다.

각 DB마다 Default Root 계정이 다르니 평소 자주 사용하시는 DB로 생성하시면 됩니다.

postgres의 경우 루트계정은 postgres 가 Default 입니다. 

 

gcloud sql instances describe [YOUR_INSTANCE_NAME]

connectionName의 출력 값을 복사합니다.

cloud_sql_proxy.exe -instances=k8s-django-tutorial-2*****:asia-northeast3:polls-instance=tcp:5432

ISSUE

위와 같이 cloud_sql_proxy.exe . . . 명령어를 입력하니 'An attempt was made to access a socket in a way forbidden by its access permissions.' 와 같은 에러가 발생했습니다. 인증관련 문제인줄 알고 -credential_file=<PATH_TO_KEY_FILE> 를 추가해봤지만 소용이 없었고, 구글링해보니 다른 프로세스에서 이미 사용하고 있는 포트이기 때문에 오류가 발생했던거였습니다. 54322 포트로 변경하고 접속하니 제대로 연결이 되었습니다.

 

5-4. 사용자 및 데이터베이스 작성

polls 라는 데이터베이스를 생성해줘야 합니다.

저는 DataGrip으로 DB에 접속하고,

CREATE DATABASE polls;
CREATE USER postgres WITH PASSWORD '[POSTGRES_PASSWORD]';
GRANT ALL PRIVILEGES ON DATABASE polls TO postgres;  // root user이기 때문에 권한이 필요없을 수도 있지만
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO postgres;  // 튜토리얼과 똑같이 입력해주었습니다.

 

6. Service 계정 만들기

해당 섹션은 링크를 참고해주시면 됩니다.

 

7. 로컬 환경에서 앱 실행

7-1. mysite/settings.py 에서 Database 설정이 필요합니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'polls',
        'USER': 'postgres',
        'PASSWORD': 'test1234',
        'HOST': '127.0.0.1',
        'PORT': '54322',
    }
}

7-2. DB 반영

# 가상환경 세팅
virtualenv env
cd env/Script
activate
pip install -r requirements.txt

# DB Migrate
python manage.py makemigrations
python manage.py migrate

# Admin 계정 생성
python manage.py createsuperuser

# Runserver
python manage.py runserver

성공!!!

8. Storage(S3)

앱이 Google Cloud에 배포되면 Gunicorn 서버가 사용됩니다. Gunicorn은 정적 콘텐츠를 제공하지 않으므로 앱은 Cloud Storage를 사용하여 정적 콘텐츠를 제공합니다.

 

8-1. 정적 리소스 수집 및 업로드

i. 버킷을 생성하고 공개적으로 읽을 수 있도록 설정합니다.

gsutil mb gs://[YOUR_GCS_BUCKET]  # mb => make bucket이 아닐까 조심스레 예상해봅니다.
gsutil defacl set public-read gs://[YOUR_GCS_BUCKET]  # 원하는 Bucket 이름을 넣으시면 됩니다.

ii. Django의 모든 정적 콘테츠를 하나의 폴더에 로컬로 수집하십시오.

python manage.py collectstatic

iii. 정적 컨텐츠를 Cloud Storage에 업로드하십시오.

gsutil -m rsync -r ./static gs://[YOUR_GCS_BUCKET]/static  # 생성했던 Bucket 이름 

iiii. mysite/settings.py STATIC_URL값을 Bucket URL로 변경

링크로 이동하여 확인해보면 static 폴더 안에 admin이라는 폴더가 생성되었고, 그 안에 정적 파일들이 들어가있는 것을 확인할 수 있습니다.

 

감사합니다.

댓글

💲 추천 글