Docker 및 Kubernetes를 설치하는 데 필요한 기본 개념 요약

요즘은 모델 배포를 준비하면서 도커와 쿠버네티스 기반이 필요해서 대학시절 정리한 포스팅입니다.

참고한 책은 이미지와 실습을 통한 Docker 및 Kubernetes 학습그리고 패스트캠퍼스에서 기계 학습 서비스 구축을 위한
작동 중인 MLOps 저도 강의를 들었는데 도커와 쿠버네티스를 기반으로 하지 않는 분들에게는 좋은 조합인 것 같습니다.

http://www.yes24.com/Product/Goods/108431011

사진과 실습으로 배우는 Docker & Kubernetes – YES24

컨테이너 또는 Docker를 이해하는 데 어려움을 겪는 사람들을 위한 완전한 Docker 기반입니다! 이 책은 컨테이너 기술에 어려움을 겪고 있거나 백엔드 기술에 익숙하지 않은 엔지니어를 위한 도커 기반이다. 상세한

www.yes24.com

https://fastcampus.co.kr/data_online_mlops

기계 학습 서비스 구축을 위한 실용적인 MLOps | 패스트캠퍼스

현역 MLOps 엔지니어로부터 MLOps as a Service의 전체 프로세스를 알아보세요! 빌드, 배포 및 운영 방법을 보여줍니다. 대표적인 클라우드 플랫폼으로 연습하고 나면 비즈니스에 적용하는 것은 시간 문제일 뿐입니다!

fastcampus.co.kr


0. 가상 환경 생성

우선 Docker는 Linux 운영 체제에서만 작동하므로 Windows 또는 macOS에서 Docker를 직접 사용할 수 없습니다. Linux OS를 “가상 환경”에 설치하고 Docker를 실행하거나 “Docker Desktop for Windows/macOS”와 같은 패키지를 설치하는 방법이 있습니다. Virtual Box 7.0에서 Ubuntu 20.03 가상 환경을 만들었습니다.

1. 도커, 한 번 빌드하면 어디서나 실행


도커 컨테이너화모델을 배포하는 방법 중 하나는 모델링 환경에서 모델을 개발하고 Docker 이미지로 빌드하여 모델과 환경을 동시에 패키징하여 배포하는 것입니다.

  • https://docs.docker.com/engine/install/ubuntu/
  • 컨테이너 : 고립된 영역에서 프로세스를 실행할 수 있는 기술
  • 도커 이미지 : 애플리케이션에 대한 애플리케이션 코드뿐만 아니라 해당 애플리케이션에 의존하는 모든 것을 패킹하는 데이터
  • 도커 파일 : 사용자가 Docker 이미지를 쉽게 빌드할 수 있도록 제출된 템플릿
  • Dockerfile 빌드 -> Docker 이미지 빌드 -> 이 이미지로 Docker RUN
# Dockerfile 이라는 빈 파일을 생성
$ touch Dockerfile
$ vi Dockerfile
## 아래 내용 작성
    # base image 를 ubuntu 18.04 로 설정
    FROM ubuntu:18.04
    # apt-get update 명령을 실행
    RUN apt-get update
    # DOCKER CONTAINER 가 시작될 때, "Hello 를 출력
    CMD ("echo", "Hello")
# 이미지 생성
$ docker build --help
# Dockerfile 이 있는 경로에서 다음 명령을 실행
$ docker build -t my-image:v1.0.0 .
# 도커 RUN
$ docker run my-image:v1.0.0
  • 도커 레지스트리 : Docker 이미지 배포 서비스
    • 개발된 모델 Docker 이미지를 Docker 레지스트리에 푸시(업로드)
    • Docker Hub에는 공개적으로 사용 가능한 컨테이너 이미지 모음이 있으므로 원하는 컨테이너 이미지를 다운로드할 수 있습니다.

Docker의 기능과 장단점을 간단히 살펴보겠습니다.

  • 특성
    • 독립 환경: 독립 환경 덕분에 “여러 컨테이너를 시작할 수 있고” “동일한 애플리케이션이 여러 개일 수 있습니다.”
    • 이미징: 간편한 교체/업그레이드, 우수한 휴대성
    • containerX에 커널 임베딩: light
  • 장점
    • 하나의 물리적 서버에서 여러 대의 서버 운영 가능
    • 손쉬운 서버 관리
    • 유연성
  • 불리
    • Linux 전용 소프트웨어
    • 호스트 서버에 문제가 있을 경우 모든 컨테이너에 영향을 미침 -> 구체적인 대책 마련 필요
    • 여러 컨테이너를 사용하는 형태를 취하기 때문에 컨테이너를 사용할 때 Docker 엔진이 오버헤드일 뿐입니다.

2. 쿠버네티스, k8s


컨테이너 오케스트레이션쿠버네티스용 도구로서 공식 쿠버네티스 웹사이트에 훌륭한 대화형 튜토리얼이 있으므로 직접 코드를 입력하여 쉽게 시작할 수 있습니다. 쿠버네티스는 선언적 인터페이스로 원하는 상태 유지메인 컨셉이라고 할 수 있습니다.

https://kubernetes.io/en/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/


Kubernetes는 각각 여러 컨테이너를 실행하는 여러 물리적 서버가 있다고 가정합니다. 이러한 상황에서 쿠버네티스는 정의 파일(YAML) 기반의 번거로운 컨테이너 생성 또는 관리를 용이하게 하는 도구로 볼 수 있습니다.

  • YAML : 데이터 직렬화를 위한 포맷/폼(서비스 간 데이터 전송 시 사용되는 포맷으로 변환), 널리 사용
# YAML 파일 예시
apiVersion: apps/v1 # kubernetes resource 의 API Version
    kind: Deployment # kubernetes resource name
    metadata: # 메타데이터 : name, namespace, labels, annotations 등을 포함
      name: nginx-deployment
      labels:
        app: nginx
    spec: # 메인 파트 : resource 의 desired state 를 명시
      replicas: 3 # 동일한 template 의 pod 을 3 개 복제본으로 생성
      selector:
        matchLabels:
          app: nginx
      template: # Pod 의 template 을 의미
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx # container 의 이름
            image: nginx:1.14.2 # container 의 image
            ports:
            - containerPort: 80 # container 의 내부 Port

Kubernetes 클러스터에서는 작업자 노드가 마스터 노드의 설정에 따라 관리되고 사람의 개입 없이 자율적으로 작동한다고 합니다.


  • 클러스터 : 마스터 노드와 워커 노드로 구성된 쿠버네티스 시스템 그룹
  • 마스터 노드 : 컨테이너를 실행하지 않고 작업자 노드에서 실행되는 컨테이너에 대한 전반적인 제어, 관리를 담당
  • 작업자 노드 : 컨테이너 엔진이 설치된 운영을 담당하는 실제 서버에 해당하는 부분

미니큐브그리고 kubectl쿠버네티스 환경을 쉽게 만들 수 있습니다.

다음으로 Kubernetes 구성과 관련된 용어를 살펴보겠습니다.

  • 현물 상환 지불 : Kubernetes에서 만들고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위입니다.
    • https://kubernetes.io/en/docs/concepts/workloads/pods/
    • 팟(Pod) 단위로 스케줄링, 로드 밸런싱, 스케일링 등의 관리 작업 수행
    • 포드는 컨테이너를 둘러싸는 개념입니다. 포드는 하나 이상의 컨테이너로 구성되며 포드 내의 여러 컨테이너는 리소스를 공유합니다.
    • 상태 비저장(단순 요청에 대한 응답으로만 제공되며 서버는 클라이언트의 상태를 유지하지 않음) 언제든지 삭제할 수 있는 리소스



  • 서비스 : 쿠버네티스에 배포된 애플리케이션(Pod)을 외부에서 쉽게 접근할 수 있도록 추상화한 리소스
    • https://kubernetes.io/en/docs/concepts/services-networking/service/
    • Pod는 IP를 할당받아 생성되지만 언제든지 죽었다가 다시 살아날 수 있으며 그 과정에서 항상 IP가 재할당되기 때문에 고정 IP로는 원하는 Pod에 접속할 수 없습니다.
    • 따라서 클러스터 외부나 내부에서 포드에 접근할 때는 포드의 IP가 아닌 서비스 접근 방식을 사용한다.
    • 서비스에 고정 IP가 있고 서비스가 하나 이상의 포드와 일치합니다.
    • 따라서 클라이언트가 서비스 주소에 접근하면 실제로 서비스와 일치하는 파드에 접속할 수 있다.


  • PVC : stateless pod가 퍼시스턴트 데이터를 보존하고자 할 때 사용하는 리소스
    • docker run의 docker volume -v 옵션과 유사
    • PV(Persistent Volume)는 관리자가 실제로 생성한 디스크 공간에 대한 정보를 담고 있으며, PVC(Persistent Volume Claim)는 사용자가 요청한 디스크 공간의 사양 정보를 담고 있는 리소스이다.
    • 원칙적으로 포드에 기록된 데이터는 언제든지 사라질 수 있습니다. 그래서 데이터를 보관하고 싶다면 PVC를 포드에 마운트해서 사용하면 된다.
    • PVC를 사용하면 여러 포드 간의 데이터 교환도 쉽게 가능합니다.



위에서 우리는 Docker와 Kubernetes를 설치하는 데 필요한 기본 개념을 배웠습니다 🙂