본문 바로가기

Study Information Technology

커맨드라인 유틸리티로 Docker와 Kubernetes를 이용한 애플리케이션 배포 자동화하기

728x90
반응형

커맨드라인 유틸리티로 Docker와 Kubernetes를 이용한 애플리케이션 배포 자동화하기

Overview

애플리케이션 배포 자동화는 현대 소프트웨어 개발에서 매우 중요한 과정입니다. 특히 Docker와 Kubernetes를 활용하면 애플리케이션의 컨테이너화 및 오케스트레이션이 가능해져서 효율적인 배포와 관리가 가능합니다. 이번 포스팅에서는 커맨드라인 유틸리티를 만들어 애플리케이션을 Docker와 Kubernetes를 통해 자동으로 배포하는 방법에 대해 자세히 설명하겠습니다.

1. 프로젝트 설정

먼저, 프로젝트의 구조를 설정해야 합니다. 아래는 기본적인 디렉토리 구조입니다.

my-deployment-tool/
│
├── src/
│   └── main.py
│
├── Dockerfile
│
├── requirements.txt
│
└── kubernetes/
└── deployment.yaml
  • src/main.py: 배포 로직이 포함된 메인 스크립트입니다.
  • Dockerfile: 이 유틸리티를 Docker 컨테이너에서 실행할 수 있도록 설정합니다.
  • requirements.txt: 프로젝트에 필요한 Python 패키지를 명시합니다.
  • kubernetes/deployment.yaml: Kubernetes에 배포할 애플리케이션의 설정 파일입니다.

2. Python 스크립트 작성

이제 src/main.py 파일에 실제 배포 로직을 작성해 보겠습니다. 이 스크립트는 Docker 이미지를 빌드하고, Kubernetes에 배포하는 작업을 수행합니다.

import os
import subprocess
import sys

def build_docker_image(image_name: str) -> None:
try:
print(f"Building Docker image: {image_name}")
subprocess.run(["docker", "build", "-t", image_name, "."], check=True)
print("Docker image built successfully.")
except subprocess.CalledProcessError as e:
print(f"Error building Docker image: {e}")
sys.exit(1)

def deploy_to_kubernetes(deployment_file: str) -> None:
try:
print(f"Deploying to Kubernetes using {deployment_file}")
subprocess.run(["kubectl", "apply", "-f", deployment_file], check=True)
print("Deployment to Kubernetes was successful.")
except subprocess.CalledProcessError as e:
print(f"Error deploying to Kubernetes: {e}")
sys.exit(1)

if __name__ == "__main__":
IMAGE_NAME = "my-app:latest"
DEPLOYMENT_FILE = "kubernetes/deployment.yaml"

build_docker_image(IMAGE_NAME)
deploy_to_kubernetes(DEPLOYMENT_FILE)

코드 설명

  1. build_docker_image: 주어진 이미지 이름으로 Docker 이미지를 빌드하는 함수입니다. subprocess.run을 사용해 Docker 명령어를 실행합니다. 이 때 check=True 옵션을 주어 명령이 실패하면 예외를 발생시킵니다.

  2. deploy_to_kubernetes: 주어진 Kubernetes 배포 파일을 사용해 애플리케이션을 배포하는 함수입니다. 이 또한 subprocess.run을 통해 kubectl 명령어를 실행합니다.

  3. 메인 함수: IMAGE_NAMEDEPLOYMENT_FILE 변수를 설정하고, 이를 기반으로 Docker 이미지를 빌드한 후 Kubernetes에 배포합니다.

3. Dockerfile 작성

이제 Dockerfile을 작성해 보겠습니다. 아래는 간단한 Python 애플리케이션을 위한 Dockerfile 예시입니다.

# Base image
FROM python:3.9-slim

# Set the working directory
WORKDIR /app

# Copy the requirements file
COPY requirements.txt .

# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy the application code
COPY src/ .

# Command to run the application
CMD ["python", "main.py"]

Dockerfile 설명

  1. FROM python:3.9-slim: Python 3.9 버전을 베이스 이미지로 사용합니다.
  2. WORKDIR /app: 작업 디렉토리를 /app으로 설정합니다.
  3. COPY requirements.txt .: requirements.txt 파일을 컨테이너의 현재 디렉토리로 복사합니다.
  4. RUN pip install: Python 패키지를 설치합니다.
  5. COPY src/.: 애플리케이션의 소스 코드를 컨테이너로 복사합니다.
  6. CMD: 컨테이너가 시작될 때 실행될 명령어를 지정합니다.

4. Kubernetes 배포 설정

kubernetes/deployment.yaml 파일은 Kubernetes에서 애플리케이션을 어떻게 배포할지를 정의합니다. 아래는 예시입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 80

YAML 파일 설명

  1. apiVersion: Kubernetes API의 버전을 지정합니다.
  2. kind: 리소스의 종류를 지정합니다. 여기서는 Deployment입니다.
  3. metadata: 배포 리소스의 메타데이터를 포함합니다.
  4. spec: 배포의 사양을 정의합니다.
  • replicas: 실행할 파드의 수를 지정합니다.
  • selector: 어떤 레이블을 가진 파드를 선택할지를 정의합니다.
  • template: 배포될 파드의 템플릿을 정의합니다.

5. 실행하기

이제 모든 설정이 완료되었습니다. 다음 단계는 이 유틸리티를 실행하는 것입니다.

  1. Docker 이미지를 빌드합니다.

    docker build -t my-app:latest .
  2. Kubernetes에 배포합니다.

    kubectl apply -f kubernetes/deployment.yaml

6. 에러 처리 및 해결책

배포 과정에서 자주 발생할 수 있는 몇 가지 에러와 그 해결책을 소개합니다.

  • Docker Build 에러: Error: Unable to locate package ...

  • 해결책: requirements.txt에 명시된 패키지 이름이 정확한지 확인하고, 올바른 버전을 사용했는지 검토합니다.

  • Kubernetes Deployment 에러: Error from server (NotFound): deployments.apps "my-app" not found

  • 해결책: 먼저 kubectl get deployments 명령어로 현재 배포 상태를 확인하고, 필요한 경우 배포를 재적용합니다.

7. 참고 문서

이 포스팅을 통해 커맨드라인 유틸리티를 활용한 Docker와 Kubernetes를 이용한 애플리케이션 배포 자동화에 대해 깊이 있는 이해를 돕기 위한 정보들을 제공했습니다. 실제 적용 시 필요한 경우 추가적인 설정이나 커스터마이징을 통해 유틸리티를 확장할 수 있습니다.

728x90
반응형