Web Development

Kubernetes에서 Django 앱 배포

Read this post in other languages:

Kubernetes는 배포, 확장 및 로드 밸런싱을 자동화하는 오픈 소스 컨테이너 오케스트레이션 플랫폼으로, Django 애플리케이션 관리 시 탁월한 복원력과 유연성을 제공합니다.

소규모 프로젝트를 시작하든 복잡한 애플리케이션을 관리하든, Kubernetes는 Django 애플리케이션을 개선할 수 있는 강력한 환경을 제공하여 최신 웹 개발의 요구 사항을 충족하도록 보장합니다.

Kubernetes(K8s)는 컨테이너화된 애플리케이션의 배포, 확장, 운영을 자동화하여 빠르게 변화하는 기술 업계의 조직에 수많은 이점을 제공하고 있습니다.

배포 기술을 개선하고자 하는 Django 개발자이든, Django 통합을 탐색하고자 하는 Kubernetes 애호가이든, 이 가이드에서 해당하는 내용을 찾을 수 있습니다.

이 튜토리얼의 첫 부분에서는 웹 애플리케이션을 원활하게 컨테이너화하고, 클러스터 간에 워크로드를 분산하며, 고가용성을 보장하는 Django와 Kubernetes의 상호 보완적인 관계에 대해 살펴봅니다.

Django

높은 수준의 Python 웹 프레임워크인 Django 프레임워크는 웹 개발 분야에서 효율성과 단순성의 상징으로 자리 잡고 있습니다. 빠르고 강력하며 유지 관리가 편리한 웹 애플리케이션 제작의 필요에서 탄생한 Django는 개발자와 조직이 가장 선호하는 프레임워크가 되었습니다.

Django는 ‘배터리 포함’ 철학을 기반으로 개발 프로세스를 용이하게 하는 광범위한 기본 도구, 라이브러리 및 규칙을 제공합니다. URL 라우팅, 데이터베이스 통합, 사용자 인증과 같은 복잡한 작업을 단순화하여 개발자가 애플리케이션 빌드에 집중할 수 있도록 합니다.

Django의 큰 장점 중 하나는 ‘중복 제거'(DRY) 원칙을 준수하여 중복이 줄고 코드 유지 관리가 간편하다는 점입니다. 또한 모델-뷰-컨트롤러(MVC) 아키텍처 패턴을 따르기 때문에 애플리케이션을 체계적으로 쉽게 관리할 수 있습니다.

Django는 보안을 우선시하기 때문에 일반적인 웹 취약성도 덜 발생합니다. 이 프레임워크에는 교차 사이트 스크립팅(XSS) 및 교차 사이트 요청 위조(CSRF) 보호 기능이 기본으로 포함되어 있습니다. 이처럼 속도, 단순성, 보안의 강력한 조합을 제공하는 Django는 최소한의 노력으로 강력하고 기능이 풍부한 웹 애플리케이션을 만들려는 개발자에게 이상적입니다.

컨테이너 오케스트레이터

컨테이너 오케스트레이터는 컨테이너화된 애플리케이션의 배포, 확장 및 운영을 관리하고 자동화하는 데 필수적인 도구입니다. 시장에는 여러 컨테이너 오케스트레이터가 있으며, 그 중 가장 인기 있는 것은 다음과 같습니다.

1. 최고의 오픈 소스 컨테이너 오케스트레이션 플랫폼인 Kubernetes는 컨테이너화된 애플리케이션 처리를 위한 강력한 적응형 환경을 제공합니다. 확장, 로드 밸런싱, 컨테이너 상태 확인과 같은 작업을 자동화하고 광범위한 확장 프로그램 에코시스템을 제공합니다.

2. Docker Swarm은 Docker에서 제공하는 컨테이너 오케스트레이션 솔루션입니다. 설정과 사용이 간편하도록 설계되었으며, Docker와 동일한 명령줄 인터페이스 및 API를 사용하기 때문에 이미 Docker를 사용하고 있는 소규모 애플리케이션이나 조직에 적합합니다.

3. OpenShift는 Red Hat에서 개발한 엔터프라이즈 Kubernetes 플랫폼입니다. Kubernetes를 기반으로 개발 및 운영 도구를 추가하여 컨테이너화된 애플리케이션의 배포 및 관리를 단순화합니다.

4. HashiCorp에서 개발한 Nomad는 컨테이너와 컨테이너화되지 않은 애플리케이션을 관리할 수 있는 가볍고 사용자 친화적인 오케스트레이터입니다.

5. Apache Mesos는 오픈 소스 분산형 시스템 커널이며, DC/OS(데이터 센터 운영 체제)는 Mesos를 기반으로 구축된 엔터프라이즈급 플랫폼입니다. DC/OS는 컨테이너화된 애플리케이션을 관리하고 확장하기 위한 추가 기능으로 Mesos를 확장합니다.

소프트웨어 팀은 주로 AWS, Google Cloud Platform, Azure 등 잘 알려진 클라우드 공급자가 제공하는 관리형 플랫폼으로 작업합니다. 이러한 클라우드 공급자는 모두 관리형 Kubernetes 솔루션인 Amazon EKS, Google GKE, Azure AKS와 같은 서비스를 제공합니다. 이러한 서비스는 Kubernetes 클러스터의 설정, 확장 및 관리를 간소화하고 각 클라우드 환경과 원활하게 통합하여 효율적인 컨테이너 오케스트레이션 및 애플리케이션 배포를 보장합니다.

PyCharm에서 Django 애플리케이션 만들기

이 튜토리얼에서는 작은 Django 애플리케이션을 생성하는 것으로 시작하겠습니다. 그런 다음 애플리케이션을 컨테이너화하고 마지막 단계에서 Docker Desktop을 사용하여 로컬 Kubernetes 클러스터에 배포해 보겠습니다.

Django 프레임워크를 처음 사용하지만 처음부터 Django 애플리케이션을 만들고 싶다면 이 블로그 게시물을 읽어보세요.

이 튜토리얼에 사용된 소스 코드는 여기에서 액세스할 수 있습니다.

지금부터 PyCharm에서 새 Django 애플리케이션을 만들어 보겠습니다.

프로젝트를 생성하려면 PyCharm을 시작하고 New Project(새 프로젝트)를 클릭합니다. PyCharm이 이미 실행 중인 경우 File(파일) | New Project를 선택하면 됩니다.

프로젝트 이름, 위치 및 인터프리터 유형과 같은 필수 세부 정보를 입력하고 venv 또는 사용자 지정 환경을 사용합니다.

그런 다음 Create(생성)를 클릭합니다.

프로젝트를 설정하고 가상 환경을 생성하면 PyCharm이 무거운 작업을 처리합니다.

Gunicorn

프로젝트가 생성되면 널리 사용되는 Python 웹 서버 게이트웨이 인터페이스(WSGI) HTTP 서버인 Gunicorn을 설치합니다. Gunicorn은 Python 웹 애플리케이션을 제공하는 데 사용되는 프리 포크 워커 모델 웹 서버로, Django, Flask 등의 웹 프레임워크와 함께 사용되어 웹 애플리케이션을 배포하고 인터넷을 통해 이 애플리케이션에 접근할 수 있도록 합니다.

Python Packages(Python 패키지) 도구 창에서는 현재 선택한 Python 인터프리터용 패키지를 가장 빠르고 쉽게 미리 보고 설치할 수 있습니다.

이 도구 창은 View(보기) | Tool Windows(도구 창) | Python Packages를 통해 열 수 있습니다.

Psycopg 2

Psycopg 2는 PostgreSQL 데이터베이스에 연결하고 이와 상호 작용하는 데 사용되는 Python 라이브러리입니다. 가장 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템 중 하나인 PostgreSQL 작업을 위한 Python 인터페이스를 제공합니다. Python 개발자는 Psycopg 2를 사용하여 데이터 삽입, 업데이트, 검색은 물론 SQL 쿼리 실행, Python 프로그램 내에서 데이터베이스 연결 관리와 같은 다양한 데이터베이스 작업을 수행할 수 있습니다.

psycopg2를 설치하기 전에, macOS에서는 brew install libpq를, Linux에서는 apt-get install libpq-dev를 실행하여 시스템 수준 종속성을 설치해야 합니다.

참조: postgresql.org/docs/16/libpq.html

libpq는 PostgreSQL용 클라이언트 라이브러리입니다. 클라이언트 애플리케이션이 PostgreSQL 데이터베이스 서버를 연결 및 관리하고 이와 상호 작용하는 데 필요한 기능을 제공하는 C 라이브러리입니다.

특정 수정을 완료한 후 settings.py 내에서 DATABASES 관련 섹션을 업데이트합니다.

항상 환경 변수를 통해 비밀 자격 증명을 전달해야 합니다.

STATIC_ROOT

Django에서 STATIC_ROOTcollectstatic 관리 명령을 실행할 때 수집된 정적 파일이 저장될 절대 파일 시스템 경로를 지정하기 위한 구성 설정입니다. 정적 파일에는 일반적으로 웹 애플리케이션에서 사용하는 CSS, JavaScript, 이미지 및 기타 애셋이 포함됩니다. STATIC_ROOT 설정은 프로덕션 환경에서 정적 파일을 제공하는 데 필수적인 부분입니다.

127줄에서 STATIC_ROOT에 대한 환경 변수를 설정합니다. 이 변수는 Kubernetes 영구 볼륨으로 연결되는 파일 경로를 가리킵니다. 이 설정을 구성하는 방법은 나중에 설명하겠습니다.

정적 파일을 수집하려면 다음 명령어를 실행합니다.

python manage.py collectstatic

이 명령어는 정적 파일을 수집하여 STATIC_ROOT 디렉터리에 배치합니다. 그런 다음 프로덕션 환경에 더 효율적인 접근 방식인 NGINX 또는 Apache 웹 서버를 통해 이러한 애셋을 직접 제공할 수 있습니다.

Dockerfile

Dockerfile은 Docker 이미지를 구성하기 위한 지시문이 포함된 간단한 텍스트 문서입니다.

1. FROM python:3.11: 이 줄은 Docker Hub의 공식 Python 3.11 이미지를 사용하여 Docker 이미지의 기본 이미지를 지정합니다. 애플리케이션은 이미 Python이 사전 설치되어 있는 이 기본 이미지 위에 빌드되고 실행됩니다.

2. ENV PYTHONUNBUFFERED 1: 이 줄은 환경 변수 PYTHONUNBUFFERED1로 설정합니다. Python이 출력을 버퍼링하지 않도록 하기 위해 Docker 컨테이너 내에서 Python을 실행할 때 이 환경 변수를 설정하는 것이 좋습니다. 이는 애플리케이션에서 실시간 로그와 디버그 정보를 얻는 데 도움이 됩니다.

3. WORKDIR /app: 이 줄은 Docker 컨테이너 내의 작업 디렉터리를 /app으로 설정합니다. 이후의 모든 명령어는 이 디렉터리에서 실행됩니다.

4. COPY . /app: 이 줄은 현재 디렉터리(Dockerfile이 있는 디렉터리)의 내용을 컨테이너 내의 /app 디렉터리에 복사합니다. 여기에는 애플리케이션 코드와 Docker 이미지에 필요한 모든 파일이 포함됩니다.

5. RUN pip install -r requirements.txt: 이 줄은 /app 디렉터리에 있는 requirements.txt 파일에 나열된 Python 종속성을 설치하기 위해 pip install 명령어를 실행합니다. Python 애플리케이션에서 흔히 사용되는 방식으로, 이를 통해 애플리케이션의 종속성을 관리할 수 있습니다.

6. EXPOSE 8000: 이 줄은 컨테이너가 포트 8000에서 수신 대기 중임을 Docker에 알립니다. 실제로 포트를 공개하지는 않습니다. 컨테이너가 사용할 수 있는 포트를 나타내는 메타데이터 선언입니다.

7. CMD [“gunicorn”, “django_kubernetes_tutorial.wsgi:application”, “--bind”, “0.0.0.0:8000”]: 이 줄은 컨테이너 시작 시 실행할 기본 명령어를 지정합니다. Gunicorn을 사용하여 Django 애플리케이션을 제공하고, django_kubernetes_tutorial.wsgi:application에 정의된 WSGI 애플리케이션을 사용하여 포트 8000을 통해 모든 네트워크 인터페이스(0.0.0.0)에서 수신 대기하도록 Gunicorn을 바인딩합니다.

DockerHub

hub.docker.com을 방문하여 플랫폼에 로그인하거나 가입합니다.

Create repository(저장소 생성)를 클릭합니다.

다음으로 저장소 이름을 입력하고 가시성을 public으로 설정합니다. 민감한 정보나 기밀 정보로 작업하는 경우에는 가시성을 private으로 설정합니다.

저장소가 생성되면 Docker 이미지를 빌드한 다음 이미지를 레지스트리에 푸시해야 합니다.

명령어를 실행하기 전에 다음 명령어를 실행하여 requirements.txt 파일이 최신 상태인지 확인합니다.

pip freeze > requirements.txt

이미지를 구성하려면 다음 명령어를 실행합니다.

docker build -t mukulmantosh/django-kubernetes:1.0 .

docker build -t /django-kubernetes:1.0 .

이 명령어는 특정 상황에 따라 달라질 수 있으며 개인 사용자 이름을 사용해야 합니다.

그런 다음 이미지를 레지스트리에 푸시하려면 Docker Hub로 인증해야 합니다.

터미널에 다음 명령어를 입력합니다.

docker login

사용자 이름과 비밀번호를 입력합니다. 인증에 성공하면 다음을 실행하여 이미지를 푸시할 수 있습니다.

docker push mukulmantosh/django-kubernetes:1.0 

docker push /django-kubernetes:1.0 

이미지가 성공적으로 푸시되면 Docker Hub에서 변경 사항을 확인할 수 있습니다.

더 이상 레지스트리에 이미지를 푸시할 계획이 없다면, 다음 명령어를 실행하여 로그아웃할 수 있습니다.

docker logout

이 이미지를 로컬로 가져오고 싶다면 hub.docker.com/r/mukulmantosh/django-kubernetes로 이동합니다.

Kubernetes 구성: YAML 파일 작성

이 튜토리얼의 이 섹션에서는 로컬 Kubernetes 클러스터에 애플리케이션을 배포하는 방법을 설명합니다.

이 튜토리얼에서는 Docker Desktop을 사용하지만, Minikube나 Kind를 사용할 수도 있습니다.

네임스페이스

Kubernetes에서 네임스페이스는 리소스와 객체를 그룹화하고 격리하는 데 사용되는 클러스터 내의 가상 파티션입니다. 이는 단일 물리적 클러스터 내에 여러 개의 가상 클러스터를 만드는 방법입니다.

네임스페이스는 Kubernetes 명령줄 도구인 kubectl을 사용하여 생성 및 관리할 수 있으며, 리소스를 배포할 때 YAML 매니페스트에서 정의할 수도 있습니다.

  • Kubernetes를 실행하기 위한 기본 플랫폼으로 Docker Desktop을 선택한 경우, 설정에서 Enable Kubernetes(Kubernetes 활성화) 체크박스를 클릭하여 Kubernetes를 사용하도록 설정해야 합니다.

터미널에서 다음 명령어를 실행하여 네임스페이스를 생성합니다.

kubectl create ns django-app

K8s로 데이터베이스 배포

먼저, 로컬 환경의 Kubernetes 클러스터에서 PostgreSQL 인스턴스를 설정해 보겠습니다.

PersistentVolume

Kubernetes에서 영구 볼륨(PV)은 관리자가 프로비저닝한 클러스터의 스토리지 조각입니다. PV는 pod의 수명 주기와 독립적인 방식으로 데이터를 저장하여 스토리지 리소스를 보다 분리되고 유연한 방식으로 관리하고 추상화할 수 있습니다. 즉, 데이터를 사용하는 pod가 삭제되거나 클러스터의 다른 노드로 일정 변경되더라도 데이터가 지속적으로 유지될 수 있습니다.

영구 볼륨을 만들고 이름을 pv.yml로 지정해 보겠습니다.

이 YAML 구성은 postgres-pv라는 PersistentVolume 리소스를 정의합니다. 이 리소스는 1GB 용량에 ReadWriteOnce 액세스 모드를 사용하여 마운트되며, /data/db에 있는 노드의 파일 시스템에서 로컬 경로를 통해 제공됩니다. 이 PV는 노드의 파일 시스템 내 디렉터리에 액세스해야 하는 pod에 영구 스토리지를 제공하는 데 사용될 수 있으며, PostgreSQL 또는 영구 스토리지가 필요한 기타 스테이트풀 서비스와 같은 애플리케이션에 적합합니다.

프로덕션의 경우, AWS RDS 또는 Google CloudSQL과 같은 클라우드 솔루션을 사용하거나 Kubernetes StatefulSets를 사용하는 것이 좋습니다.

PersistentVolumeClaim

Kubernetes에서 PersistentVolumeClaim(PVC)은 pod가 PV로부터 특정 프로퍼티를 가진 특정 용량의 스토리지를 요청할 때 사용하는 리소스 객체입니다. PVC는 애플리케이션이 기본 스토리지 인프라의 세부 사항을 알 필요 없이 스토리지 리소스를 요청할 수 있는 방법입니다.

Kubernetes는 PVC를 생성하고 사용하여 기본 스토리지 인프라를 추상화하면서 애플리케이션용 스토리지 리소스를 동적으로 할당하고 관리하는 방법을 제공하여 컨테이너화된 환경에서 스테이트풀 애플리케이션으로 작업하고 이를 관리하기가 더 쉬워집니다.

PVC를 생성하고 이름을 pvc.yml로 지정해 보겠습니다.

PVC는 스토리지 리소스를 요청하고 실제 스토리지를 제공하는 PV에 바인딩됩니다.

이 YAML 구성은 django-app 네임스페이스 내에서 postgres-pvc라는 PersistentVolumeClaim을 정의합니다. 이 구성은 ReadWriteOnce 액세스 모드로 기가바이트의 스토리지를 요청하며, manual StorageClass를 명시적으로 지정합니다. 이 PVC는 postgres-pv라는 기존 PV에 바인딩되어 django-app 네임스페이스 내에서 이 PVC를 참조하는 pod가 해당 볼륨을 사용할 수 있도록 효과적으로 예약합니다.

ConfigMap

Kubernetes에서 ConfigMap은 키-값 쌍으로 구성 데이터를 저장하는 데 사용되는 API 객체입니다. ConfigMap은 애플리케이션 코드에서 구성 데이터를 분리하는 방법을 제공하여 컨테이너를 수정하거나 다시 배포하지 않고도 구성을 쉽게 관리하고 업데이트할 수 있게 해줍니다. 이는 Kubernetes 클러스터 내에서 애플리케이션, 마이크로서비스 및 기타 구성 요소를 설정하는 데 특히 유용합니다.

ConfigMap을 생성하고 이름을 cm.yml로 지정해 보겠습니다.

이 튜토리얼에서는 ConfigMap을 사용하지만, 보안상 중요한 자격 증명은 Kubernetes 시크릿(Secret)에 저장하거나 Bitnami Sealed Secrets, AWS Parameter Store, HashiCorp Vault와 같은 대안을 고려할 수도 있습니다.

디플로이먼트

Kubernetes에서 디플로이먼트(Deployment)는 애플리케이션의 배포 및 확장을 관리하는 데 사용되는 리소스 객체입니다. Kubernetes API 그룹의 일부이며 애플리케이션의 원하는 상태를 정의하고 관리하는 선언적 방법을 제공합니다.

디플로이먼트는 애플리케이션 pod를 관리하고 확장하는 데 사용되는 상위 수준의 Kubernetes 리소스입니다.

이 YAML 구성은 django-app 네임스페이스에서 postgres라는 디플로이먼트를 정의합니다. 그리고 영구 스토리지를 사용하는 PostgreSQL 데이터베이스(16.0 버전)의 단일 복제본을 배포합니다. 데이터베이스 pod는 app: postgresdb로 라벨이 지정되어 있으며, 스토리지는 postgres-pvc라는 PVC에서 제공합니다. PostgreSQL 컨테이너에 대한 구성 및 자격 증명은 db-secret-credentials라는 이름의 ConfigMap을 통해 제공됩니다.

서비스

Kubernetes에서 서비스(Service)는 pod 집합을 네트워크 서비스로 노출하는 데 사용되는 리소스 객체입니다. 서비스는 Kubernetes 클러스터에서 실행되는 애플리케이션의 여러 부분 간의 네트워크 통신을 가능하게 하고 클라이언트가 해당 부분에 액세스할 수 있는 안정적인 엔드포인트를 제공합니다. 서비스는 기본 네트워크 인프라를 추상화하여 애플리케이션의 구성 요소를 더 쉽게 연결하고 검색할 수 있습니다.

이 YAML 구성은 django-app 네임스페이스 내에 postgres-service라는 NodePort 서비스를 정의합니다. ‘app: postgresdb‘로 라벨이 지정된 pod에서 실행 중인 PostgreSQL 서비스를 클러스터 내 포트 5432에 노출합니다. 외부 클라이언트는 포트 30004를 사용하여 모든 노드의 IP 주소에서 서비스에 액세스할 수 있습니다. 이 서비스는 Kubernetes 클러스터 외부에서 PostgreSQL 데이터베이스에 액세스할 수 있는 방법을 제공합니다.

Django 애플리케이션을 위한 YAML 구성 만들기

PersistentVolume

이 YAML은 1GB의 저장 용량을 가진 staticfiles-pv라는 PersistentVolume을 정의하여 여러 pod가 동시에 읽고 쓸 수 있도록 합니다. 스토리지는 /data/static에 있는 로컬 호스트 경로에서 제공됩니다. Django 정적 파일은 이 위치에 저장됩니다.

PersistentVolumeClaim

이 YAML은 django-app 네임스페이스에 staticfiles-pvc라는 PVC를 정의합니다. ‘manual’ StorageClass를 가진 PV에서 최소 1GB 용량의 스토리지를 요청하며, ReadWriteMany 액세스가 필요함을 명시합니다. 이 요청은 스토리지 요구 사항을 충족하기 위해 staticfiles-pv라는 기존 PV에 명시적으로 바인딩합니다. 이렇게 하면 django-app 네임스페이스의 pod가 이 PVC를 사용하여 연결된 PV가 제공하는 스토리지에 액세스하고 사용할 수 있습니다.

ConfigMap

이 YAML은 django-app 네임스페이스에 app-cm이라는 ConfigMap을 정의하며, 구성 데이터를 저장하는 다양한 키-값 쌍을 포함합니다. 이 ConfigMap은 django-app 네임스페이스 내의 pod 또는 기타 리소스가 데이터베이스 연결 정보 및 정적 파일 경로와 같은 구성 설정에 액세스할 때 사용합니다.

디플로이먼트

이 YAML은 django-app 네임스페이스에 django-app-deploy라는 디플로이먼트를 정의합니다. 특정 Docker 이미지 및 구성으로 컨테이너를 실행하는 단일 복제본(pod)을 생성합니다. 이 pod는 PVC로 백업되는 두 개의 볼륨, postgres-db-storagestaticfiles와 연결되어 있습니다. 컨테이너는 app-cm이라는 ConfigMap의 환경 변수를 사용하도록 구성되며 포트 8000에서 수신 대기합니다. 볼륨은 컨테이너 내의 특정 경로에 마운트되어 데이터베이스 스토리지 및 정적 파일에 액세스할 수 있습니다. 이 디플로이먼트는 Kubernetes를 사용하여 Django 애플리케이션을 실행하는 일반적인 방법입니다.

비공개 레지스트리에서 이미지를 가져오는 데 관심이 있다면 여기를 읽어보세요.

서비스

서비스는 포트 8000에서 수신 대기하며, 들어오는 트래픽을 app: django-application으로 라벨이 지정된 pod로 리디렉션합니다. 이는 동일한 애플리케이션의 여러 인스턴스가 실행 중인 Kubernetes 클러스터에서 웹 애플리케이션을 노출하고 로드 밸런싱하기 위한 일반적인 구성입니다. 서비스는 트래픽이 이들 사이에 고르게 분산되도록 합니다.

NGINX

NGINX는 속도, 안정성, 확장성으로 잘 알려진 고성능 웹 및 역방향 프록시 서버입니다. 웹 트래픽, 로드 밸런싱, 콘텐츠 전송을 효율적으로 처리하여 웹사이트와 애플리케이션을 제공하는 데 널리 사용됩니다.

ConfigMap

이 YAML은 django-app 네임스페이스에 nginx-cm이라는 Kubernetes ConfigMap을 정의하며, 키는 default.conf이고 값은 백엔드 서버로 요청을 프록시 처리하는 여러 줄의 NGINX 구성 파일인 키-값 쌍을 포함합니다.

디플로이먼트

이 YAML은 특정 볼륨 및 구성으로 NGINX 컨테이너를 실행하는 pod를 생성하고 관리하는 디플로이먼트를 정의합니다. 이 디플로이먼트는 이 pod의 단일 복제본이 항상 django-app 네임스페이스에서 실행되도록 합니다. 또한 nginx-cm ConfigMap으로 대체하여 디폴트 NGINX 구성을 재정의합니다.

서비스

이 YAML 구성은 django-app 네임스페이스에 nginx-service라는 Kubernetes 서비스를 생성합니다. 또한, 클러스터 내의 포트 80에 app:nginx 라벨이 지정된 pod를 노출하고 각 클러스터 노드의 NodePort 30005에서 서비스가 액세스 가능하도록 설정합니다. 이렇게 하면 외부 트래픽이 NodePort 서비스를 통해 NGINX 애플리케이션을 실행하는 pod에 도달할 수 있습니다.

Kubernetes 잡으로 배치 워크로드 관리

Kubernetes에서 잡(Job)은 단일 작업 단위 또는 유한한 작업을 나타내는 리소스 객체입니다. 잡은 지정된 횟수만큼 성공적으로 완료될 때까지 작업을 실행하도록 설계되었습니다.

데이터베이스 마이그레이션

이 YAML 구성은 django-app 네임스페이스에 django-db-migrations라는 Kubernetes 잡을 정의합니다. 이 잡은 Django 마이그레이션을 위해 사용자 지정 Docker 이미지를 사용하여 컨테이너를 실행하고 데이터베이스 관련 파일을 위한 스토리지를 제공하기 위해 PVC를 마운트합니다. 잡이 실패하면 최대 15번까지 재시도할 수 있으며, 완료 후 100초 동안 해당 pod가 유지됩니다. 이 잡은 PostgreSQL에 새 테이블을 생성합니다.

정적 파일

이 YAML 구성은 django-app 네임스페이스에 django-staticfiles라는 Kubernetes 잡을 정의합니다. 이 잡은 Django 애플리케이션의 정적 파일을 수집하기 위해 사용자 지정 Docker 이미지를 사용하여 컨테이너를 실행하고 정적 파일을 위한 스토리지를 제공하기 위해 PVC를 마운트합니다. 잡이 실패하면 최대 3번까지 재시도할 수 있으며, 디버그를 위해 완료 후 100초 동안 해당 pod가 유지됩니다. 이 잡은 정적 파일을 mountPath인 /data/static에 복사합니다.

애플리케이션 시작

애플리케이션을 시작하려면 k8s 디렉터리로 이동하여 다음 명령어를 실행합니다.

애플리케이션을 배포한 후, 다음 명령어를 사용하여 실행 중인 pod의 상태를 확인합니다.

kubectl get pods -n django-app -w

Django에서 superuser 만들기

모든 애플리케이션이 실행되고 나면 superuser를 만들어 Django 관리자에 로그인합니다.

다음 명령어를 실행하여 실행 중인 pod 목록을 가져옵니다.

kubectl get pods -n django-app

컨테이너 셸 내부로 들어가려면 다음을 실행합니다.

kubectl exec -it -n django-app -- sh

이후, 다음을 실행합니다.

python manage.py createsuperuser

superuser를 성공적으로 만들었으면 브라우저에서 http://127.0.0.1:30005를 엽니다. 디폴트 시작 페이지로 이동됩니다.

그런 다음 http://127.0.0.1:30005/admin을 통해 Django 관리자로 이동합니다.

방금 생성한 사용자 이름과 비밀번호를 입력합니다.

인증이 완료되면 Django 관리자 페이지로 리디렉션됩니다.

localhost:30005/admin을 통해 로그인을 시도하면 403 Forbidden(CSRF) 오류가 발생할 수 있습니다.

CSRF_TRUSTED_ORIGINS에 있는 settings.py 파일에서 이를 해결할 수 있습니다.

CSRF_TRUSTED_ORIGINS는 교차 사이트 요청 위조(CSRF) 보호를 위해 신뢰할 수 있는 출처 목록을 지정하는 데 사용되는 Django의 설정 입니다. CSRF는 공격자가 사용자를 속여 웹 애플리케이션에 원치 않는 요청을 자신도 모르게 보내도록 유도할 때 발생할 수 있는 보안 취약점입니다. 이를 방지하기 위해 Django에는 CSRF 보호 기능이 내장되어 있습니다.

CSRF_TRUSTED_ORIGINS를 사용하면 CSRF 보호 요청이 허용되는 출처(웹사이트) 목록을 정의할 수 있습니다. 이 목록에 포함되지 않은 출처에서 발생한 모든 요청은 잠재적으로 악의적인 것으로 간주되어 차단됩니다.

이 설정은 CSRF 공격에 대한 보안을 유지하면서 Django 애플리케이션에 대한 특정 교차 출처 요청을 허용하는 데 사용할 수 있습니다. 이는 애플리케이션이 다른 도메인에서 호스팅되는 다른 웹 서비스 또는 API와 상호 작용해야 하는 상황에서 특히 유용합니다.

Kubernetes Dashboard와 같은 GUI 도구를 사용하는 경우, 실행 중인 pod, 디플로이먼트, 영구 볼륨 등을 쉽게 시각화할 수 있습니다.

PyCharm의 Kubernetes 지원

PyCharm은 Kubernetes에 최적화된 향상된 에디터 및 런타임 지원을 제공하며, 다음과 같은 다양한 기능을 통해 Kubernetes 관리를 간소화할 수 있습니다.

  • 클러스터 객체 탐색, 구성 추출/편집 및 설명.
  • 이벤트 보기.
  • pod 로그 보기 및 다운로드.
  • pod 콘솔 연결.
  • pod에서 셸 실행.
  • 포트를 pod로 포워딩.
  • 에디터에서 리소스 YAML 구성 적용.
  • 클러스터에서 리소스 삭제.
  • 클러스터에서 ConfigMap 및 Secret 항목 완성.
  • kubectl 경로 구성.
  • 전역 및 프로젝트별로 사용자 지정 kubeconfig 파일 구성.
  • 컨텍스트 및 네임스페이스 전환.
  • 활성 클러스터의 API 스키마(CRD 포함)를 사용하여 리소스 매니페스트 편집.

동영상을 시청하여 PyCharm Professional에서 Kubernetes로 작업하는 방법에 대해 자세히 알아보세요.

Kubernetes 작업에 PyCharm을 무료로 사용해 보세요!

참조

이미 Kubernetes를 잘 알고 계신가요? 그렇다면 클라우드 솔루션을 탐색하여 프로그래밍 여정을 한 단계 더 발전시켜 보세요. 또한, AWS EKSGoogle Kubernetes Engine에 대한 튜토리얼도 확인해 보세요.

게시물 원문 작성자

Mukul Mantosh

Mukul Mantosh

image description