도커와 쿠버네티스 개요
최근 컨테이너 기술이 떠오르면서, 도커와 쿠버네티스가 많은 관심을 받고 있다. 도커는 컨테이너화 기술을 제공하는 플랫폼으로, 애플리케이션을 컨테이너화하여 개발, 배포, 실행하는 과정을 간편하게 만들어준다. 쿠버네티스는 여러 대의 호스트에서 도커 컨테이너를 자동으로 배포하고 관리하는 오픈소스 플랫폼이다.
이번 글에서는 도커와 쿠버네티스를 활용하여 백엔드 서비스를 컨테이너화하는 방법에 대해 살펴보겠다.
백엔드 서비스 컨테이너화의 이점
백엔드 서비스를 컨테이너화하는 것에는 여러 가지 이점이 있다.
첫째, 컨테이너는 가상화 기술을 이용하기 때문에, 호스트 운영체제에 대한 의존성이 낮아진다. 이는 서버 구성을 간소화하고, 서버 호환성을 향상시키는 데 도움이 된다.
둘째, 컨테이너는 가볍고 빠르게 생성, 배포, 실행할 수 있기 때문에, 개발, 배포, 운영 프로세스를 더욱 빠르고 효율적으로 만들어준다.
셋째, 컨테이너는 더욱 안전하게 서비스를 운영할 수 있도록 도와준다. 컨테이너는 애플리케이션을 격리시키기 때문에, 하나의 컨테이너에서 문제가 발생하더라도 다른 컨테이너에는 영향을 미치지 않는다.
도커 이미지 빌드와 배포
먼저, 도커 이미지를 빌드하고 배포하는 과정을 살펴보자.
도커 이미지를 빌드하기 위해서는 Dockerfile이라는 파일을 작성해야 한다. Dockerfile은 어떤 애플리케이션을 컨테이너화할 것인지, 컨테이너 안에 어떤 파일들이 들어갈 것인지 등을 정의하는 파일이다. 다음은 간단한 Flask 애플리케이션을 컨테이너화하는 Dockerfile의 예시이다.
# 이미지의 기반이 될 이미지를 지정한다.
FROM python:3.8
# 애플리케이션을 실행할 디렉토리를 지정한다.
WORKDIR /app
# 애플리케이션의 의존성을 설치한다.
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
# 애플리케이션 코드를 복사한다.
COPY . .
# 애플리케이션을 실행한다.
CMD ["python", "app.py"]
Dockerfile을 작성한 후에는, 다음과 같은 명령어를 실행하여 도커 이미지를 빌드할 수 있다.
docker build -t myapp:latest .
이제 빌드된 이미지를 Docker Hub와 같은 저장소에 업로드하거나, 직접 배포할 수 있다.
docker run -p 5000:5000 myapp:latest
위 명령어는 myapp:latest 이미지를 실행하고, 호스트의 5000번 포트와 컨테이너의 5000번 포트를 매핑시킨다. 이제 브라우저에서 //localhost:5000
을 열어서 Flask 애플리케이션이 정상적으로 실행되는지 확인할 수 있다.
쿠버네티스 클러스터에서 백엔드 서비스 관리하기
이제 도커 이미지를 빌드하고 배포하는 방법을 알아보았으니, 이번에는 쿠버네티스 클러스터에서 백엔드 서비스를 관리하는 방법에 대해 알아보자.
쿠버네티스에서는 애플리케이션을 배포하기 위해 Pod, Deployment, Service, Ingress 등의 리소스를 사용한다. Pod는 하나 이상의 컨테이너를 포함하는 가장 작은 배포 단위이며, Deployment는 Pod를 관리하고, Service는 Pod에 접근하기 위한 로드 밸런서 역할을 한다. Ingress는 클러스터 외부에서 서비스에 접근하기 위한 URL 경로와 서비스를 매핑하는 역할을 한다.
먼저, Deployment 리소스를 이용하여 백엔드 서비스를 배포해보자. 다음은 Flask 애플리케이션을 배포하는 Deployment 리소스의 예시이다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myregistry/myapp:latest
ports:
- name: http
containerPort: 5000
위 YAML 파일에서는 myapp이라는 이름의 Deployment 리소스를 정의하고 있다. 이 리소스는 3개의 Pod를 생성하여 Flask 애플리케이션을 배포한다. Pod는 app: myapp
라벨을 가지고 있어야 하며, 각각의 Pod는 myapp이라는 이름의 컨테이너를 실행한다.
이제 다음과 같은 명령어를 실행하여 Deployment 리소스를 생성할 수 있다.
kubectl apply -f deployment.yaml
다음으로, Service 리소스를 이용하여 백엔드 서비스에 접근할 수 있도록 하자. Service 리소스는 Deployment 리소스와 함께 사용되며, 로드 밸런싱 기능을 제공한다. 다음은 Flask 애플리케이션을 위한 Service 리소스의 예시이다.
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: http
type: LoadBalancer
위 YAML 파일에서는 myapp이라는 이름의 Service 리소스를 정의하고 있다. 이 리소스는 app: myapp
라벨을 가진 Pod에 접근할 수 있도록 하며, 80번 포트를 사용하여 로드 밸런싱 기능을 제공한다.
이제 다음과 같은 명령어를 실행하여 Service 리소스를 생성할 수 있다.
kubectl apply -f service.yaml
이제 브라우저에서 //
를 열어서 Flask 애플리케이션이 정상적으로 실행되는지 확인할 수 있다. “는 Service 리소스를 생성할 때 자동으로 할당된 외부 IP 주소이다.
결론
이번 글에서는 도커와 쿠버네티스를 활용하여 백엔드 서비스를 컨테이너화하는 방법을 살펴보았다. 백엔드 서비스를 컨테이너화하면 서버 구성을 간소화하고, 개발, 배포, 운영 프로세스를 빠르고 효율적으로 만들어줄 뿐만 아니라, 안전하게 서비스를 운영할 수 있도록 도와준다. 이러한 이점들을 고려해보면, 컨테이너 기술은 현대적인 서비스 운영에 꼭 필요한 기술 중 하나라고 할 수 있다.