Devops

컨테이너화 및 오케스트레이션

컨테이너 기술의 개념과 필요성

개념 설명

컨테이너(Container) 는 애플리케이션과 그 실행 환경을 격리된 패키지로 묶어 일관된 실행 환경을 제공하는 기술입니다. 컨테이너는 호스트 운영체제에서 격리된 사용자 공간에서 실행되며, 필요한 라이브러리와 종속성을 포함합니다. 컨테이너를 사용하면 애플리케이션의 이식성과 일관성을 유지할 수 있습니다.

필요성

컨테이너 기술의 주요 필요성은 다음과 같습니다:

  1. 이식성: 컨테이너는 애플리케이션과 그 실행 환경을 함께 패키징하므로, 어느 환경에서도 동일하게 실행될 수 있습니다.
  2. 격리성: 각 컨테이너는 독립된 사용자 공간에서 실행되므로, 다른 컨테이너와 격리되어 자원을 사용할 수 있습니다.
  3. 효율성: 컨테이너는 호스트 운영체제의 커널을 공유하므로, 가상 머신보다 더 경량화되고 빠르게 실행됩니다.
  4. 확장성: 컨테이너는 필요한 만큼 빠르게 확장할 수 있으며, 오케스트레이션 도구를 사용하여 자동으로 관리할 수 있습니다.

Docker를 이용한 애플리케이션 컨테이너화

Docker 설치 및 기본 사용법

Docker를 설치하고 기본적으로 사용하는 방법은 다음과 같습니다:

Docker 설치

Ubuntu에서 Docker를 설치하는 방법은 다음과 같습니다:

# 기존 Docker 버전 제거
sudo apt-get remove docker docker-engine docker.io containerd runc
 
# 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
 
# Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
 
# Docker 설치 저장소 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
# Docker 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

Docker 기본 사용법

Docker의 기본 명령어는 다음과 같습니다:

# Docker 버전 확인
docker --version
 
# Docker 서비스 시작
sudo systemctl start docker
 
# Docker 이미지 다운로드
docker pull hello-world
 
# Docker 컨테이너 실행
docker run hello-world
 
# 실행 중인 컨테이너 목록 확인
docker ps
 
# 모든 컨테이너 목록 확인
docker ps -a
 
# 컨테이너 중지
docker stop <container_id>
 
# 컨테이너 삭제
docker rm <container_id>

Dockerfile 작성

Dockerfile은 Docker 이미지를 생성하기 위한 스크립트입니다. 예를 들어, 간단한 Node.js 애플리케이션을 위한 Dockerfile은 다음과 같습니다:

Dockerfile 예제

# 베이스 이미지
FROM node:14
 
# 작업 디렉토리 설정
WORKDIR /app
 
# 종속성 파일 복사
COPY package*.json ./
 
# 종속성 설치
RUN npm install
 
# 애플리케이션 코드 복사
COPY . .
 
# 애플리케이션 실행
CMD ["node", "app.js"]
 
# 컨테이너가 수신할 포트 설정
EXPOSE 8080

Docker Compose를 이용한 다중 컨테이너 구성

Docker Compose는 여러 컨테이너를 정의하고 실행할 수 있는 도구입니다. 예를 들어, 웹 애플리케이션과 데이터베이스를 함께 실행하는 구성 파일은 다음과 같습니다:

docker-compose.yml 예제

version: '3'
 
services:
  web:
    image: mynodeapp
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
 
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb

Docker Compose를 사용하여 구성 파일을 실행하려면 다음 명령어를 사용합니다:

# Docker Compose 설치
sudo apt-get install -y docker-compose
 
# 컨테이너 빌드 및 실행
docker-compose up --build

Kubernetes를 이용한 컨테이너 오케스트레이션

Kubernetes 개요 및 구성 요소

Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈 소스 플랫폼입니다. Kubernetes의 주요 구성 요소는 다음과 같습니다:

  • 클러스터: Kubernetes 클러스터는 하나 이상의 마스터 노드와 여러 워커 노드로 구성됩니다.
  • 노드: 클러스터 내의 각 서버를 노드라고 합니다. 마스터 노드는 클러스터를 관리하고, 워커 노드는 애플리케이션 컨테이너를 실행합니다.
  • 파드(Pod): 파드는 하나 이상의 컨테이너 그룹으로, 동일한 네트워크 네임스페이스를 공유합니다.
  • 디플로이먼트(Deployment): 디플로이먼트는 파드와 레플리카 세트를 관리하며, 애플리케이션의 선언적 업데이트를 처리합니다.
  • 서비스(Service): 서비스는 파드의 논리적 집합을 정의하고, 내부 또는 외부 네트워크에 접근할 수 있도록 합니다.

클러스터 설정 및 관리

Kubernetes 클러스터를 설정하고 관리하는 방법은 다음과 같습니다:

Minikube를 이용한 로컬 클러스터 설정

Minikube는 로컬 Kubernetes 클러스터를 실행하는 도구입니다.

# Minikube 설치
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin/
 
# Minikube 클러스터 시작
minikube start
 
# kubectl 설치
curl -LO "https://dl.k8s.io/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
 
# kubectl 클러스터 정보 확인
kubectl cluster-info
 
# kubectl 컨텍스트 설정
kubectl config use-context minikube

애플리케이션 배포 및 스케일링

Kubernetes에서 애플리케이션을 배포하고 스케일링하는 방법은 다음과 같습니다:

Deployment 작성 및 배포

다음은 간단한 Nginx 디플로이먼트를 정의한 YAML 파일입니다:

nginx-deployment.yaml

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

이 디플로이먼트를 적용하려면 다음 명령어를 사용합니다:

# 디플로이먼트 생성
kubectl apply -f nginx-deployment.yaml
 
# 디플로이먼트 상태 확인
kubectl get deployments
 
# 파드 상태 확인
kubectl get pods

애플리케이션 스케일링

디플로이먼트를 스케일링하려면 다음 명령어를 사용합니다:

# 디플로이먼트 스케일링
kubectl scale deployment nginx-deployment --replicas=5
 
# 스케일링 상태 확인
kubectl get deployments

Helm을 이용한 패키지 관리

Helm은 Kubernetes 애플리케이션의 패키지 관리 도구로, 복잡한 애플리케이션을 정의하고 설치하는 데 사용됩니다.

Helm 설치

Helm을 설치하려면 다음 명령어를 사용합니다:

# Helm 설치
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
 
# Helm 저장소 추가
helm repo add stable https://charts.helm.sh/stable
 
# 저장소 업데이트
helm repo update

Helm 차트 사용

Helm 차트를 사용하여 애플리케이션을 배포할 수 있습니다. 예를 들어, Nginx를 배포하려면 다음 명령어를 사용합니다:

# Nginx 배포
helm install my-nginx stable/nginx-ingress
 
# 배포 상태 확인
helm list

이로써 컨테이너화 및 오케스트레이션의 개념과 필요성, Docker와 Kubernetes를 이용한 애플리케이션 컨테이너화 및 오케스트레이션 방법에 대해 알아보았습니다.

이를 통해 애플리케이션의 이식성, 확장성, 관리 효율성을 높일 수 있습니다.

On this page